antlr树解析器语法

时间:2012-02-06 08:58:15

标签: antlr

我有一个可以生成ast的语法文件。如何编写可以遍历tree grammar的{​​{1}}?我有一些来自互联网的例子,但是虽然我能理解它们,但我不知道如何从头开始编写它们。例如:< / p>

ExprTree.g

tree generated

ExprEval.g

stat: expr NEWLINE -> expr   
     | ID '=' expr NEWLINE -> ^('=' ID expr)   
     | NEWLINE ->   
;   

expr: multExpr (('+' ^|'-' ^) multExpr)* ;   
multExpr: atom ('*' ^ atom)* ;   
atom: INT   
     | ID   
     | '(' ! expr ')' !   
;   

ID  :   ('a'..'z'|'A'..'Z')+ ;   
INT :   '0'..'9'+ ;   
NEWLINE: (('/r'? '/n')|';')+ ;   
WS  :   (' '|'/t')+ { $channel = HIDDEN; } ;

ExprTree.g是生成ast的语法,ExprEval.g可以遍历树。对于ExprEval.g中的规则expr,为什么不这样:

stat: expr 
| ^('=' ID expr)     ;   

expr   
: ^('+' a=expr b=expr) 
| ^('-' a=expr b=expr) 
| ^('*' a=expr b=expr) 
| ID        
| INT 

0 个答案:

没有答案