I wonder to know how can I write a rewrite rule to generate AST tree for this rule.
e5 : (simpleexpression) (relop simpleexpression)*
;
relop : RELOP_GT
| RELOP_LT
| RELOP_GE
| RELOP_LE
;
I wonder to know how can I write a rewrite rule to generate AST tree for this rule.
e5 : (simpleexpression) (relop simpleexpression)*
;
relop : RELOP_GT
| RELOP_LT
| RELOP_GE
| RELOP_LE
;
This seems to be a binary operation where the root of the (sub) tree is the operator, relop, and the leaves are the simpleexpressions. In that case, simply use the inline tree-operator ^, which makes the token/tree before it the root:
e5 : simpleexpression (relop^ simpleexpression)?
;
relop : RELOP_GT
| RELOP_LT
| RELOP_GE
| RELOP_LE
;
Note that I changes the * into ? since your original rule would accept input like:
1 <= 2 < 3
In many programming languages that would evaluate to:
true < 3
which might be considered an invalid expression (your language might accept it, of course, in which case, leave the *!).
With the inline ^, the expression
1 <= 2
would be parsed into the following AST:
<=
/ \
1 2
Also see: How to output the AST built using ANTLR?