[antlr-interest] Predicate hoisting pain

Sam Harwell sharwell at pixelminegames.com
Mon Apr 13 06:12:47 PDT 2009


This will fail unexpectedly with certain types of grammars, as
demonstrated by some grammars I've sent to the list in the past. I'll
find them later today and send a link.

Sam

-----Original Message-----
From: Sam Barnett-Cormack [mailto:s.barnett-cormack at lancaster.ac.uk] 
Sent: Monday, April 13, 2009 7:55 AM
To: Sam Harwell
Cc: ANTLR Interest Mailing List
Subject: Re: [antlr-interest] Predicate hoisting pain

Sam Barnett-Cormack wrote:
> I guess the question really is, for me, why does it get hoisted in one

> case and not another? I'm assuming it's because of the choice in the 
> objectSetSpec rule, and I can't see any way to refactor that to lose
the 
> choice. Of course, there's probably a kludgy solution of setting a 
> variable os to true and passing it...

And that worked... changed it to:

objectSetSpec
@init{
   boolean os = true;
}
   : rootElementSetSpec[os] (COMMA EXTMARK
additionalElementSetSpec[os]?)?
   | EXTMARK (COMMA additionalElementSetSpec[os])?
   ;

Horrible, but in some ways less horrible than the more "elegant"
solutions.

>> -----Original Message----- From: antlr-interest-bounces at antlr.org 
>> [mailto:antlr-interest-bounces at antlr.org] On Behalf Of Sam 
>> Barnett-Cormack Sent: Monday, April 13, 2009 6:33 AM To: ANTLR
>> Interest Mailing List Subject: [antlr-interest] Predicate hoisting
>> pain
>>
>> Hi all,
>>
>> So, in my grammar I have need to re-use rules so they ultimately
>> refer to a different rule (so I don't have to duplicate 
>> intersection/union/exception rules). I use a parameter and gated 
>> predicates, like so:
>>
>> elements[boolean os] : {!$os}?=>subtypeElements |
>> {$os}?=>objectSetElements | LPAREN! elementSetSpec[$os] RPAREN! ;
>>
>> This is ultimately referred to from two places. The first, which 
>> generates code that's just fine, is:
>>
>> elementSetSpecs : rootElementSetSpec[false] (COMMA EXTMARK (COMMA 
>> additionalElementSetSpec[false])?)? -> ^(ELEMENTSET
>> rootElementSetSpec EXTMARK? additionalElementSetSpec?) ;
>>
>> However, in the *slightly* more complex case:
>>
>> objectSetSpec : rootElementSetSpec[true] (COMMA EXTMARK 
>> additionalElementSetSpec[true]?)? | EXTMARK (COMMA
>> additionalElementSetSpec[true])? ;
>>
>> The predicates get hoisted in the generated code, and then there's 
>> compile errors with undefined variable 'os'.
>>
>> I'm not sure why it happens in one case and not the other, and I'm
>> even less clear on how to fix it. Can anyone help?
>>
>> Sam
>>
>> List: http://www.antlr.org/mailman/listinfo/antlr-interest 
>> Unsubscribe: 
>>
http://www.antlr.org/mailman/options/antlr-interest/your-email-address
> 
> List: http://www.antlr.org/mailman/listinfo/antlr-interest
> Unsubscribe:
http://www.antlr.org/mailman/options/antlr-interest/your-email-address



More information about the antlr-interest mailing list