[antlr-interest] Using rewrite rules with conditionals...

Elijah Epifanov lists at xmart.ws
Thu Jun 7 00:04:20 PDT 2007



Cameron Esfahani wrote:
> I modified your example a little to account for NUMBER:
> 
> optional_size_qualifier
> : size_qualifier? -> size_qualifier
> | -> SIZE_DEFAULT
> ;

Change this to:
optional_size_qualifier
: size_qualifier -> size_qualifier
| -> SIZE_DEFAULT
;

(the ambiguity is that empty input can be matched by both alternatives)

> 
> size_qualifier
> : PERIOD 'U'? size_postfix -> size_postfix
> ;
> 
> size_postfix
> : 'B' -> SIZE_8
> | 'W' -> SIZE_16
> | 'L' -> SIZE_32
> | 'Q' -> SIZE_64
> ;
> 
> number_size
> : NUMBER optional_size_qualifier -> optional_size_qualifier NUMBER
> ;
> 
> And I get lots of errors:
> 
> error(211): T.g:223:4: [fatal] rule optional_size_qualifier has 
> non-LL(*) decision due to recursive rule invocations reachable from alts 
> 1,2.  Resolve by left-factoring or using syntactic predicates or using 
> backtrack=true option.
> 
> 
> 
> On Jun 6, 2007, at 3:21 AM, Elijah Epifanov wrote:
> 
>> Hi, I think this will do the job (start rule is now 
>> optional_size_qualifier):
>>
>>
>> optional_size_qualifier
>>
>> : size_qualifier -> size_qualifier
>>
>> | -> SIZE_DEFAULT
>>
>> ;
>>
>>
>> size_qualifier
>>
>> : '.' ( 'u' | 'U' )? size_postfix -> size_postfix
>>
>> ;
>>
>>
>> size_postfix
>>
>> : ( 'b' | 'B' ) -> SIZE_8
>>
>> | ( 'w' | 'W' ) -> SIZE_16
>>
>> | ( 'l' | 'L' ) -> SIZE_32
>>
>> | ( 'q' | 'Q' ) -> SIZE_64
>>
>> ;
>>
> 
> Cameron Esfahani
> dirty at apple.com <mailto:dirty at apple.com>
> 
> "Even paranoids have enemies."
> 
> Henry Kissinger
> 
> 
> 


More information about the antlr-interest mailing list