我有一个可以生成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