...
- Set language=Python option in both .g files
- In Eval.g I had to change references to $INT.text and $ID.text to $INT.getText() and $ID.getText() respectively
- In Eval.g I had to use @init{} instead of @members{} action to initialize memory variable
- In Expr.g I had to use self.skip() instead of just skip()
- Based Test.py on example from Antlr3PythonTarget
...
No Format |
---|
grammar Expr;
options {
language=Python;
output=AST;
ASTLabelType=CommonTree;
}
prog : ( stat {print $stat.tree.toStringTree();} )+ ;
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'|'\n'|'\r')+ {self.skip()} ;
|
Eval.g
No Format |
---|
tree grammar Eval; options { language=Python; tokenVocab=Expr; ASTLabelType=CommonTree; } @init {self.memory = {}} // START:stat prog: stat+ ; stat: expr {print $expr.value} | ^('=' ID expr) {self.memory[$ID.getText()] = int($expr.value)} ; // END:stat // START:expr expr returns [int value] : ^('+' a=expr b=expr) {$value = a+b;} | ^('-' a=expr b=expr) {$value = a-b;} | ^('*' a=expr b=expr) {$value = a*b;} | ID { k = $ID.getText() if k in self.memory: $value = self.memory[k] else: print >> sys.stderr, "undefined variable "+k } | INT {$value = int($INT.getText())} ; // END:expr |
...