[antlr-interest] Fundamental tree parsing question

Benjamin Niemann pink at odahoda.de
Wed Jul 11 01:34:10 PDT 2007


Benjamin Niemann wrote:

> Ted Villalba wrote:
> 
>> I thought I would reuse this thread since it seems a similar issue, or
>> misunderstanding on my part...
>>  When I add a rewrite specification to my grammar rule it suddenly fails
>> with a .RewriteEmptyStreamException.
>>  The full grammar is below, but here is what I think it boils down to -
>>  I'm
>> not sure how to represent zero or more instances in the rewrite of an
>> operator when it is the root node .
>> For example, the following grammar is parsed successfully and ANTLRWorks
>> builds a flat tree.
>> value   : terms ((WS)+ operator^ (WS)+ value)*
>> 
>> But when I try to add the following rewrite specification, I get the
>> exception:
>> value : terms ((WS)+ operator (WS)+ value)* -> ^(operator ^(TERMS terms)
>> ^(VALUE value)*)
> 
> The correct way to translate these AST operators to rewrite rules should
> be:
> 
> value:
>    (terms -> terms)
>    (
>      (WS)+ operator (WS)+ v=value
>      -> ^(operator $value $v)
>    )*
>    ;
> 
> The first $value refers to the current tree as it has been built so far.
> Upon each iteration of the loop a tree is built using the current tree as
> the first child and $v as the second. The result becomes the first child
> in the next iteration and so on...

And then add your imaginary nodes:

value:
   (terms -> ^(TERMS terms))
   (
     (WS)+ operator (WS)+ v=value
     -> ^(operator $value ^(VALUE $v))
   )*
   ;

-- 
Benjamin Niemann
Email: pink at odahoda dot de
WWW: http://pink.odahoda.de/



More information about the antlr-interest mailing list