[antlr-interest] Beginner grammar question

Matt Palmer mattpalms at gmail.com
Fri Sep 12 02:38:06 PDT 2008


Ooops - get rid of the BAR token too, as it's not needed.

grammar test;

list     :    (element)+
    ;

element  :   bar NAME
    ;

bar      :   {input.LT(1).getText().equals("bar")}? NAME
    ;

NAME
    :     ('a'..'z' | 'A'..'Z')
          ('a'..'z' | 'A'..'Z' | '0'..'9' | '_')*
    ;

WS
    :  (' '|'\r'|'\t'|'\u000C'|'\n') {$channel=HIDDEN;}
    ;


On Fri, Sep 12, 2008 at 10:37 AM, Matt Palmer <mattpalms at gmail.com> wrote:

> Hi Fabian,
>
> this is a classic problem - it's specifically mentioned in the ANTLR
> reference book.   There's more than one way of solving it, but where you
> have keywords that are the same as IDs, you can use predicates to do it.
> Basically, make bar a NAME too, but put a predicate before it to see if it's
> "bar".  Then the lexer will just recognise NAME tokens, but the parser can
> switch to a bar rule if necessary:
>
> grammar test;
>
> list     :    (element)+
>     ;
>
> element  :   bar NAME
>     ;
>
> bar      :   {input.LT(1).getText().equals("bar")}? NAME
>     ;
>
> BAR      :   'bar'
>     ;
>
> NAME
>     :     ('a'..'z' | 'A'..'Z')
>           ('a'..'z' | 'A'..'Z' | '0'..'9' | '_')*
>     ;
>
> WS
>     :  (' '|'\r'|'\t'|'\u000C'|'\n') {$channel=HIDDEN;}
>     ;
>
> Matt
>
> On Fri, Sep 12, 2008 at 8:39 AM, Fabian Baboschi <fabian20ro at gmail.com>wrote:
>
>> Hi,
>> I have a question about the following grammar:
>>
>> grammar test;
>>
>> list     :    (element)+
>>     ;
>>
>> element    :   BAR NAME
>>     ;
>>
>> BAR    :     'bar'
>>     ;
>>
>> NAME
>>     :     ('a'..'z'|'A'..'Z')('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
>>     ;
>>
>> WS
>>     :  (' '|'\r'|'\t'|'\u000C'|'\n') {$channel=HIDDEN;}
>>     ;
>>
>> I tried to use the following input: bar bar
>> and I get errors because the parser doesn't recognize that the second bar
>> should be treated as a name.
>> I tried to change the grammar or options but without success. What am I
>> missing?
>>
>> If it matters I'm using antlrworks-1.2 and antlr-3.1.
>>
>> Thank you,
>> Fabian
>>
>>
>> List: http://www.antlr.org/mailman/listinfo/antlr-interest
>> Unsubscribe:
>> http://www.antlr.org/mailman/options/antlr-interest/your-email-address
>>
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.antlr.org/pipermail/antlr-interest/attachments/20080912/568dd5de/attachment.html 


More information about the antlr-interest mailing list