如何在使用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.g
和ASTDemoWalker.g
在同一個文件夾中。在ANTLRWorks打開兩個語法和通過按CTRL + SHIFT + ģ生成從ASTDemo.g
第一詞法分析器&解析器和然後通過打開ASTDemoWalker.g
和按壓CTRL + SHIFT + ģ產生樹遍歷。
現在,從ASTDemoWalker.g
編輯器面板,按CTRL +d火起來的調試器,並粘貼在文本區域下面的源:
42 * ((a + 3)/-3.14)
,然後按OK 。
您現在可以通過調試過程,並在最後一步,你可以同時看到什麼AST產生的解析器:
以及如何樹遍歷走過去說AST:
如果您現在在樹語法中發生「意外」錯誤,例如,您可以定義^('*' expression)
而不是^('*' expression expression)
。如果再次調試樹文法,你會看到經過42
節點後失敗:
在AST存在42
節點之後的另一個節點,而樹遍歷預計只有1單節點( 42
)之後的*
根節點。
當然,這是一個簡單的語法,但即使您熟悉ANTLR,也會在@ $ &中查找樹語法中的錯誤! :)
再次感謝您的寶貴幫助@Bart Kiers,我現在有了在ANTLRWorks中同時使用語法和樹語法的想法。 - 嚴重的,如果你還沒有開始,你應該寫一本關於ANTLR的書。 –
Thanks @ ndroock1,當然歡迎您。不,我還沒有開始寫一本書:),我想我會堅持寫博客一段時間,並回答關於SO的問題。 –