[antlr-interest] How to write the rewrite rule for AST if I want to place an imaginary node as its root

Jim Idle jimi at temporal-wave.com
Tue Nov 25 08:17:06 PST 2008

On Tue, 2008-11-25 at 20:28 +0800, chain one wrote:

> The rule is 
> simple_expression:  term  (  add_like_op  term  )* 
> If it doesn't need to place an imaginary as its root, I can simply
> write this rule like that: simple_expression:  term  (  add_like_op^
>  term  )* 
> How about if I wanna put an imaginary node on top of it ?
> simple_expression:  term  (  add_like_op  term  )*  ->
> ^(SIMPLE_EXPRESSION[] ?????????)

It isn't clear if you want SIMPLE_EXPRESSION to be the root node of ALL
the add_like_ops, or a SIMPLE_EXPRESSION for each add_like_op. In the
latter case, there is no need to do this, just let the add_like_op be
your node root. In the former case, it is better to separate this into
two rules, especially if you have precedence available in 'term' (to
avoid multiple SIMPLE_EXPRESSION nodes, unless you need them to put back
the parens in reformatting and so on):

simple_expression: se_term -> ^(SIMPLE_EXPRESSION $se_term) ;

se_term: term  (  add_like_op^  term  )* ;

term : INT
     | FLOAT
     | LPAREN se_term RPAREN


> I don't know how to write the ????? part.
> List: http://www.antlr.org/mailman/listinfo/antlr-interest
> Unsubscribe: http://www.antlr.org/mailman/options/antlr-interest/your-email-address

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.antlr.org/pipermail/antlr-interest/attachments/20081125/6f853850/attachment.html 

More information about the antlr-interest mailing list