[antlr-interest] Smalltalk-like grammar? Easy! Decimal number? Help!

Kevin Twidle kpt at doc.ic.ac.uk
Thu Nov 1 14:12:38 PDT 2007


Thank you so much.  I did look back through the archives but unless  
you know what you are looking for it is sometimes hard to spot the  
right thing.  I shall go back and look for predicate info.

Your suggestion completely fixed the problem with

NUMBER	:	DIGIT+ DECIMAL;
fragment DECIMAL	:	(DOT DIGIT) => (DOT DIGIT+) |;

and will now go back and shoehorn it into my language grammar.

Cheers,

Kevin

On 1 Nov 2007, at 18:16, Jim Idle wrote:

> See much discussion of this issue over the last 2 or 3 weeks, but  
> you need a
> predicate on your number rule, and your DECIMAL and DIGIT and  
> LETTER rules
> should be fragments (though you probably don't need them as  
> separate rules
> at all really):
>
> NUMBER: ('0'..'9')+ (   ('.' '0'..'9')=> ('.' ('0'..'9')+)
>                       |
>                     )
>       ;
> fragment
> LETTER
>
>  Etc...
>
> Hope that helps :-)
>
> Jim
>
>> -----Original Message-----
>> From: antlr-interest-bounces at antlr.org [mailto:antlr-interest-
>> bounces at antlr.org] On Behalf Of Kevin Twidle
>> Sent: Thursday, November 01, 2007 8:59 AM
>> To: antlr-interest at antlr.org
>> Subject: [antlr-interest] Smalltalk-like grammar? Easy! Decimal  
>> number?
>> Help!
>>
>> Hi,
>>
>> I love ANTLR! I have a quite sophisticated Smalltalk-like grammar in
>> ANTLR using an AST which works beautifully.  I have decided to allow
>> floating point numbers and have tried adding them to the grammar.
>> Now, Smalltalk uses '.' as a statement separator, numbers have a '.'
>> in them - uh-oh.
>>
>> A number should have the form:
>>
>> 12 or 12.34 but not 12.
>>
>> I want to be able to parse
>>
>> 13.
>> 13.word.
>> 14.0.13.
>>
>> to get  13,13,word,14.0,13
>>
>> all I get is
>>
>> line 1:3 required (...)+ loop did not match anything at character  
>> '\n'
>> line 2:3 required (...)+ loop did not match anything at character 'w'
>> recoverFromMismatchedToken
>> BR.recoverFromMismatchedToken
>> line 3:4 mismatched input '.13' expecting EOF
>>
>> with tokens       ord     14.0
>>
>> I have simplified my problem to the following grammar.  The problem
>> is that DECIMAL always matches the first '.' and then fails (I ran
>> through the code) it never says DECIMAL is not there, it must be a
>> statement separator!  I have tried the greedy option but then it
>> never matches the DECIMAL.  I have tried reordering, fragments,
>> greedy and now this mailing list!
>>
>> DECIMAL is optional, why does it fail?
>>
>> Any help really appreciated!
>>
>> Kevin
>>
>> grammar Number;
>> options {output = AST;}
>>
>> start	:	statement ( DOT statement? )+ EOF;
>>
>> statement :	WORD | NUMBER;
>>
>> WORD	:	LETTER (LETTER | DIGIT)+;
>>
>> NUMBER	:	DIGIT+ DECIMAL?;
>>
>> DECIMAL	:	DOT DIGIT+;
>> DOT	:	'.';
>> DIGIT	:	'0'..'9';
>> LETTER	:	'a'..'z' | 'A'..'Z';
>> WS      :
>> 	    (' '
>> 	    | '\t'
>> 	    | '\r' '\n'
>> 	    | '\n'
>> 	    ) +
>> 	    { $channel=HIDDEN; }
>>    	;
>
>
>
>



More information about the antlr-interest mailing list