《領域特定語言》一3 3 文法 語法和語義

2021-09-23 09:55:39 字數 926 閱讀 2640

如果要處理一種語言的語法,文法是一種很重要的工具。文法是一組規則,用以描述如何將文字流轉化為語法樹。大多數程式設計師都會在生命中的某一刻接觸文法,因為文法常用以描述我們日常使用的程式語言。文法由一系列產生式規則組成,每個生產規則都有乙個名字(term)以及乙個描述如何分解它的語句(statement)。所以,乙個加法語句可能看起來就像這樣: additionstatement:=number'+'number。它告訴我們,如果遇到語句5+3,解析器能夠將其識別為加法語句。因為規則是可以相互引用的,所以也會有一條針對數字的規則,告訴我們如何識別合法數字。通過這些規則,我們就可以得到一種語言的文法。

一種語言可以由多種不同的文法來定義,認識到這點很重要。世界上不存在某種語言的唯一文法。一種文法就定義了語言所生成語法樹的一種結構,對於一段特定的文字,可能會識別出許多不同的語法樹結構。一種文法只定義一種形式的語法樹;選擇何種文法和語法樹取決於很多因素,包括語言的文法特性以及處理語法樹的方式等。

文法只定義一種語言的語法─它在語法樹中如何表現。而這與語義(也就是表示式的含義)無關。根據上下文不同,5+3可能等於8,也可能等於53,語法相同,但語義可能截然不同。在「語義模型」(第11章)中,語義的定義濃縮為如何根據語法樹組裝語義模型,以及如何處理語義模型。特別是,如果兩個表示式產生相同結構的語義模型,即使語法不同,它們的語義其實也是相同的。

如果在使用外部dsl,特別是,用到了「語法指導翻譯」(第18章),我們很可能會顯式地使用文法來構建解析器。如果用的是內部dsl,可能沒有顯式的文法,但是從文法的角度思考dsl仍然是有用的,文法有助於我們在眾多內部dsl模式中進行選擇。

對於內部dsl,談**法顯得有些奇怪,原因之一是,這裡解析了兩遍,所以包含了兩種文法。第一種是宿主語言本身的解析,這顯然要依賴於宿主語言的文法。這一遍解析建立宿主語言的執行指令。當宿主語言所構建的dsl執行時,鬼魅般的語法樹就會在呼叫棧中建立。只有在第二遍解析時,才會出現這個名義上的dsl語法。

Kotlin領域特定語言(DSL)

一 dsl的概念 只在特定領域內使用的語言 例如 html gradle sql等等 特點 計算機程式語言 具有語言的表達能力 有限的表達能力 關注某個特定的領域 二 下面用dsl來寫乙個例子吧 需要下面五個類 三 建立乙個node節點的介面 package cn.kotliner.kotlin a...

DSL 領域特定語言 迷思

所謂領域專用語言 domain specific language dsl 其基本思想是 求專不求全 不像通用目的語言那樣目標範圍涵蓋一切軟體問題,而是專門針對某一特定問題的計算機語言。dsl之於程式設計師正如伽南地之於以色列人,是最初也是最終的夢想。幾乎自計算機發明伊始,人們就開始談論dsl使用d...

Kotlin領域特定語言(DSL)

一 dsl的概念 只在特定領域內使用的語言 例如 html gradle sql等等 特點 計算機程式語言 具有語言的表達能力 有限的表達能力 關注某個特定的領域 二 下面用dsl來寫乙個例子吧 需要下面五個類 三 建立乙個node節點的介面 package cn.kotliner.kotlin a...