Yes, I've read that page earlier and I understand it (and that is how I've solved the problem for now). Without syntactic predicates I understand ANTLR Lexer will try matching the longer string and might fail in the middle. But when a syntactic predicate (which is a gated semantic predicate) is placed before the production, shouldn't ANTLR first try the predicate and go on and match the production only if the syntactic predicate passes like what Terence says here: http://www.antlr.org/pipermail/antlr-interest/2009-March/033526.html

For example, the following grammar wont work for the input "1.". It wont give me INT_LIT, DOT. Instead it will try matching for FLOAT_LIT and fail. :

grammar Test;

r    :    INT_LIT DOT
   ;

INT_OR_FLOAT
   :    NUMBER DOT NUMBER  {$type=FLOAT_LIT;}
   |    NUMBER {$type=INT_LIT;}
   ;

fragment INT_LIT
   :    ;
fragment FLOAT_LIT
   :    ;

DOT    :    '.'
   ;

fragment NUMBER
   :    '0'..'9'+
   ;
But if you add syntactic predicate to INT_OR_FLOAT as shown below, it will work:

INT_OR_FLOAT
   :    (NUMBER DOT NUMBER) => NUMBER DOT NUMBER  {$type=FLOAT_LIT;}
   |    (NUMBER) => NUMBER {$type=INT_LIT;}
   ;


I was expecting the same thing on my example. But it for some reason doesn't work for my example. What is the difference between the above example and my example? Shouldn't both work fine since syntactic predicate is present?

Thanks, Indhu

Johannes Luber wrote:
Indhu Bharathi schrieb:
Moving this to antlr-dev as I'm starting to feel maybe this is a bug...
No reply in antlr-interest for long time kindof confirms that feeling.

I can certainly do some work around for the work I'm doing now. But this
is something I've tried a lot of times and always failed. Would like to
know if I'm doing some mistake or is this a bug in ANTLR?

Thanks, Indhu

I think that your problem is described here:
<http://www.antlr.org/wiki/display/ANTLR3/Lexer+grammar+for+floating+point,+dot,+range,+time+specs>

Johannes
Indhu Bharathi wrote:
Hi,

Any clue why this doesn't work? I'm still clueless.

- Indhu

Indhu Bharathi wrote:
I was working in a big grammar and stumbled on a problem with predicates. I've simplified the problem as much as possible and here it is:

When I give the input "1.", I expect the tokens <INT_LIT, DOT>. But what I get is "No viable alternative at character 'EOF'. I'm not able to understand why this happens. Any pointers?

grammar Test;

r    :    INT_LIT DOT+
    ;

INT_FLOAT_PATTERN
    :    (NUMBER DOT NUMBER LETTER ) => NUMBER DOT NUMBER LETTER
        { $type=PATTERN; }
| ( NUMBER DOT NUMBER ) => NUMBER DOT NUMBER
        { $type=FLOAT_LIT; }

    |    (NUMBER) => NUMBER
        { $type=INT_LIT; }

    ;

DOT    :    '.'
    ;

fragment PATTERN
    :    ;
fragment FLOAT_LIT
    :    ;
fragment INT_LIT : ; fragment
NUMBER    :    ('0'..'9')+
    ;

fragment
LETTER    :    'a'..'z'
    ;
Thanks, Indhu


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

------------------------------------------------------------------------

_______________________________________________
antlr-dev mailing list
[email protected]
http://www.antlr.org/mailman/listinfo/antlr-dev



_______________________________________________
antlr-dev mailing list
[email protected]
http://www.antlr.org/mailman/listinfo/antlr-dev

Reply via email to