[antlr-interest] ANTLR 2.7.7 TreeParser transformation question

Kevin J. Cummings cummings at kjchome.homeip.net
Wed Apr 18 19:52:56 PDT 2007


Ric Klaren wrote:
> Hi,
> 
> On 4/14/07, Kevin J. Cummings <cummings at kjchome.homeip.net> wrote:
>> > aexpr :! #( PLUS  p1:aexpr p2:aexpr )
>> >          {
>> >          // Anything plus 0 is Anything
>> >            if (isZero(p1))
>> >               {
>> >                 #aexpr = #p2;
>> >               }
>> >            else if (isZero(p2))
>> >               {
>> >                 #aexpr = #p1;
>> >               }
>> >            else
>> >               {
>> >                 #aexpr = #(PLUS, p1, p2);
>> >               }
>> >          }
>> >       |! ( #( MINUS aexpr aexpr ) )=> #( minus:MINUS m1:aexpr
>> m2:aexpr )
>> >       |! #( mult:MULT mu1:aexpr mu2:aexpr )
>> >       |! #( div:DIV d1:aexpr d2:aexpr )
>> >       |! #( neg:MINUS n:aexpr )
>> >       | NUM
>> >       | STRING
>> >       ;
>>
>> What I'm trying to do is transform the tree passed into aexpr in those
>> cases when I can remove complexity.  My isZero() method is correctly
>> recognizing those NUM trees which contain the number "0".
>> If I examine #aexpr before leaving this rule, I can see that:
>>         (PLUS 2 0)
>> is correctly reduced to just
>>          2
>>
>> My problem is that the assignment to #aexpr appears in the .cpp code as
>> a reference to:   aexpr_AST_in, but it is never used again after it gets
>> assigned!
>>
>> The end of the case continues with assigning _retTree = _t and not my
>> new tree.  The result of this is that when I examine my aexpr subtree in
>> the bexpr rule, it is the original (PLUS 2 0) tree!  Not the transformed
>> one!
> 
> Try using ## in stead of #aexpr. Does removing the ! from the first
> alternative work as well?

Using ## generates:

	aexpr_AST = RefGenevaAST(currentAST.root);

before the actions for the rule, but neither aexpr_AST nor currentAST
are declared inside the code blocks in which they are used, and G++
complains about this.

It doesn't seem to matter if I take the ! off the production rule or not.

> Cheers,
> 
> Ric
> 


-- 
Kevin J. Cummings
kjchome at rcn.com
cummings at kjchome.homeip.net
cummings at kjc386.framingham.ma.us
Registered Linux User #1232 (http://counter.li.org)


More information about the antlr-interest mailing list