[antlr-interest] Disambiguating Decimal and Integer '.'

Kaleb Pederson kaleb.pederson at gmail.com
Thu Oct 1 15:46:33 PDT 2009


On Thursday 01 October 2009 01:06:54 pm Gavin Lambert wrote:
> At 08:12 2/10/2009, Kaleb Pederson wrote:
>  >INTEGER
>  >    :   NUMBER+;
>  >
>  >DECIMAL
>  >    :   INTEGER '.' INTEGER;
> 
> You should have a look at the wiki and the mailing list 
> archives.  This is a fairly common problem with a fairly simple 
> solution:

I've looked, read, and re-read, but apparently I don't know exactly what to look for, so thanks for pointing it out.  I'd be interested to any references in the wiki or archives if you have them.  My google-fu and not-so-random searching didn't bring up anything useful.

> fragment INTEGER : NUMBER+ ;
> 
> DECIMAL
>    :  INTEGER ('.' INTEGER | { $type = INTEGER; })
>    ;

This did not work, nor did adding an options {k=2;} statement.

> If that doesn't work by itself, you can add a predicate to force a 
> two-character lookahead:
> 
> DECIMAL
>    :  INTEGER (('.' NUMBER) => '.' INTEGER | { $type = INTEGER; })
>    ;

This worked great, thank you!  I would not have thought to try something like that.  I was attempting to have the DECIMAL non-terminal avoided, rather than allowing it to match the same thing as an INTEGER and changing the type on it.  Perhaps that caused some tunnel vision.

--Kaleb

http://twitter.com/kalebpederson
http://kalebpederson.com


More information about the antlr-interest mailing list