私はastを生成することができる文法ファイルを持っています。 tree generated
をトラバースできる tree grammar
を書くにはどうすればよいですか?インターネットからいくつかの例がありますが、理解できる間に、ゼロから。例えば:
ExprTree.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; } ;
ExprEval.g
stat: expr
| ^('=' ID expr) ;
expr
: ^('+' a=expr b=expr)
| ^('-' a=expr b=expr)
| ^('*' a=expr b=expr)
| ID
| INT
ExprTree.gはastを生成する文法であり、ExprEval.gはexprEval.gのルールexprのためにtree:
expr: multExpr (('+' ^|'-' ^) multExpr)*