0

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 
      ;
Bart Kiers
  • 166,582
  • 36
  • 299
  • 288
Dave Qorashi
  • 326
  • 2
  • 11

1 Answers1

0

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?

Community
  • 1
  • 1
Bart Kiers
  • 166,582
  • 36
  • 299
  • 288