能否通過語義直接生成解釋器?

就像Parser Generator一樣,提供某種格式的語義給解釋器生成器,然後直接得到一個能解釋AST的解釋器。


怪蜀黍 @uncle creepy 大大的回答提到ANTLRv4,但題主可能已經知道各種parser generator了而想問有沒有interpreter generator吧。

首先從某個角度看我要認同上面的回答。ANTLR可以生成parser,並且可以生成AST結構以及遍歷該AST的visitor,或者ANTLRv4可以生成SAX風格的parser API,要在它的基礎上寫個解釋器還是很方便的。

之前的ANTLR版本,例如ANTLRv3,可以在語法文件里在語法規則中混入語義動作,在語義動作中指定某調語法對應的行為並以此來實現解釋器也是很常見的事情。請參考各種ANTLRv3、v4的資料。

同理,其它支持插入語義動作的parser generator也都可以支持這樣的功能。

但題主想要的或許是以某種attribute grammar來生成解釋器的東西。這種東西不能說沒有,但並不是很流行…

隨手搜搜「interpreter generator」就可以搜到這篇1979年的論文:An Interpreter Generator Using Tree Pattern Matching

另外也有像Vmgen這種指定虛擬機指令集及每條指令的語義,然後Vmgen框架生成出高性能解釋器的東西。不知道題主會不會感興趣。


可以。因為語義就是解釋器,解釋器就是語義。

從Operational Semantics角度來理解的話,解釋器本身就是一種描述了程序如何執行(和操作)的Big-Step Operational Semantics;如果從更加「操作」的角度來理解的話,Abstract Machine Semantics(比如CEK Machine)作為一種Structural Operational Semantics的Linearization把程序語言的語義model成機器狀態的轉移,本身既是語義也是可執行的解釋器。

如果把語義理解為語言設計者定義的一系列relation,那麼執行語義(解釋器)不過就是一種pattern matching,它所做的事情就是match到當前的狀態然後根據relation來轉移到下一個狀態,如果你把這個事情用程序寫出來就叫做解釋器。

可以用來形式化描述語義的語言有很多,比如PLT Redex就是一種用來專門描述Reduction Semantics以及Evaluation Context的DSL,當然也可以直接解釋執行。從官網上搬一個簡單的例子:

(define red
(reduction-relation
λv
(--&> (in-hole E (+ number_1 number_2))
(in-hole E ,(+ (term number_1)
(term number_2)))
"+")
(--&> (in-hole E (if0 0 e_1 e_2))
(in-hole E e_1)
"if0t")
(--&> (in-hole E (if0 number_1 e_1 e_2))
(in-hole E e_2)
"if0f"
(side-condition
(not (= 0 (term number_1)))))
(--&> (in-hole E ((λ (x ..._1) e) v ..._1))
(in-hole E (subst-n (x v) ... e))
"βv")))


可以。我就在做這樣的項目。

Antlr 不能直接根據語義定義生成AST, 它首先生成的是一個解析器代碼,運行這個代碼才能得到AST.

我的項目是根據語義文件,直接生成AST.

語法樹是一種樹形數據結構,不同的語言有不同的表示。我使用一種兼容 JSON 的文本表示來描述這個數據結構。

代碼的語義描述有一些默認的規則,以便能對有意義的字元串進行捕獲,命名。

有些規則描述的文本並不是我們需要的信息,例如空格,縮進,斷行和注釋,這些規則只是匹配,並不捕獲。

_comment = `#` ~ $$ ;

有些規則並不會命名捕獲,例如字元串中的字元和轉義字元。

生成的語法樹可以順序的描述語言要素,並攜帶位置信息,以便錯誤定位。

這些功能通常由許多代碼完成,現在可以直接使用一個函數完成。

ast = parse(grammar, code)

詳情:

https://github.com/songzan/Spp–perl.git


一個神奇的項目

r-fxxk https://github.com/masarakki/r-fxxk/blob/master/README.rdoc

只要指定brainfuck里每個符號對應的字元串就能自動生成解釋器


可以的,其實這類工具挺多的,我覺得還可以的是antlr4

它的設計比較科學,不但生成ast,還生成遍歷器,而且生成的代碼具有一定的可讀性

此外就是他的用戶比較多,很多語法的generator網上搜搜就有


最大的問題是,很多所謂的「語義」 沒法用無歧義的形式化方法描述,因為表達 意思的主體自己可能都不完全理解他想表達的「語義」


推薦閱讀:

編程軟體有沒有用中文編寫的?
零基礎自學C語言需要什麼軟體?什麼視頻教程比較好?
c++虛函數的作用是什麼?
為什麼學習編程一定要多寫多敲代碼?
程序分析中的 {path,context,flow}-sensitive 問題?

TAG:編程語言 | 解釋器 | 編譯原理 | 理論計算機科學 | 程序設計語言設計 |