[antlr-interest] SimpleCalc Tree Rewrite Rules

Matthew Bowman matthew.bowman at sogotech.com
Mon Sep 17 04:00:41 PDT 2007


Eric Deplagne wrote:
> On lun, 17 sep 2007 11:31:32 +0300, Matthew Bowman wrote:
>   
>> So I have the following grammar:
>> [...]
>> expr : l=term (o=plus_minus r=term)* -> ^(OP $o $l $r);
>> term : l=factor (o=mult_divide r=factor)* -> ^(OP $o $l $r);
>>
>> And my problem is with the rewrite rules. I want it to only rewrite the 
>> rule with (OP $o $l $r) if it actually matches 'term plus_minus term' or 
>> 'factor mult_divide factor' but if it only matches a term or factor I 
>> want the subtree from factor.
>>
>> [...]
>>     
>
>   The idea that immediately comes to me is to replace the * by +
>   and add an alternative for a single term.
>
>   expr: 
>     l=term |
>     l=term (o=plus_minus r=term)+ -> ^(OP $o $l $r)
>   ;
>   
I tried that and it also had problems. However, I manage to get around 
it altogether by just making the root node the operator itself

expr:
  term ((PLUS | MINUS)^ term)*

I needed the intermediate AST in the right form for my tree grammar but 
I've managed to get the tree grammar to work with this approach!

Thanks for you reply,

-- 
Matthew Bowman



More information about the antlr-interest mailing list