2012-01-19 47 views
2

背景:我創建了一個ANTLR語法。我能夠使用ANTLRWorks進行測試和調試,並驗證瞭解析器創建了我腦海中的AST。現在,我想爲AST編寫一個樹語法,解析樹並用ANTLRWorks調試樹語法。如何使用ANTLRWorks創建/指定用於測試樹語法的AST輸入?

問題:我想用ANTLRWorks測試和調試樹語法。因此,我想分析解析器創建的AST。在使用ANTLRWorks測試樹語法時,如何將AST指定爲輸入?

P.S. 我已經在Does anyone know of a way to debug tree grammars in ANTLRWorks研究過該問題/答案,但它不回答我的問題。雖然OP接受了他,但他也發表了類似的評論。

回答

3

如何在使用ANTLRWorks測試樹語法時指定AST作爲輸入?

你不需要自己提供AST,只需要產生AST的解析器。

給出下面的語法產生的AST:

grammar ASTDemo; 

options { 
    output=AST; 
} 

tokens { 
    ROOT; 
    U_MIN; 
} 

parse 
: expression EOF -> ^(ROOT expression) 
; 

expression 
: addition 
; 

addition 
: multiplication (('+' | '-')^ multiplication)* 
; 

multiplication 
: unary (('*' | '/')^ unary)* 
; 

unary 
: '-' atom -> ^(U_MIN atom) 
| atom 
; 

atom 
: ID 
| NUMBER 
| '(' expression ')' -> expression 
; 

ID  : ('a'..'z' | 'A'..'Z')+; 
NUMBER : '0'..'9'+ ('.' '0'..'9'*)?; 
SPACE : (' ' | '\t' | '\r' | '\n')+ {skip();}; 

以下將是一個語法樹通過語法上面產生的AST:

tree grammar ASTDemoWalker; 

options { 
    output=AST; 
    tokenVocab=ASTDemo; 
    ASTLabelType=CommonTree; 
} 

parse 
: ^(ROOT expression) 
; 

expression 
: ^('+' expression expression) 
| ^('-' expression expression) 
| ^('*' expression expression) 
| ^('/' expression expression) 
| ^(U_MIN expression) 
| atom 
; 

atom 
: ID 
| NUMBER 
; 

請務必將兩個ASTDemo.gASTDemoWalker.g在同一個文件夾中。在ANTLRWorks打開兩個語法和通過按CTRL + SHIFT + ģ生成從ASTDemo.g第一詞法分析器&解析器和然後通過打開ASTDemoWalker.g和按壓CTRL + SHIFT + ģ產生樹遍歷。

現在,從ASTDemoWalker.g編輯器面板,按CTRL +d火起來的調試器,並粘貼在文本區域下面的源:

42 * ((a + 3)/-3.14) 

,然後按OK

您現在可以通過調試過程,並在最後一步,你可以同時看到什麼AST產生的解析器:

enter image description here

以及如何樹遍歷走過去說AST:

enter image description here

如果您現在在樹語法中發生「意外」錯誤,例如,您可以定義^('*' expression)而不是^('*' expression expression)。如果再次調試樹文法,你會看到經過42節點後失敗:

enter image description here

在AST存在42節點之後的另一個節點,而樹遍歷預計只有1單節點( 42)之後的*根節點。

當然,這是一個簡單的語法,但即使您熟悉ANTLR,也會在@ $ &中查找樹語法中的錯誤! :)

+0

再次感謝您的寶貴幫助@Bart Kiers,我現在有了在ANTLRWorks中同時使用語法和樹語法的想法。 - 嚴重的,如果你還沒有開始,你應該寫一本關於ANTLR的書。 –

+0

Thanks @ ndroock1,當然歡迎您。不,我還沒有開始寫一本書:),我想我會堅持寫博客一段時間,並回答關於SO的問題。 –

相關問題