[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