[antlr-interest] Smalltalk-like grammar? Easy! Decimal number? Help!
Oti
ohumbel at gmail.com
Thu Nov 1 14:12:43 PDT 2007
Hi Kevin and Jim,
the following NUMBER lexer rule works pretty well for me:
NUMBER
: ( '+' | '-' ) ?
( ( ( '1' .. '9' ) ( '0' .. '9' )* ) | '0' )
( '.' ( '0' | ( '0' .. '9' )* ( '1' .. '9' ) ) ) ?
;
Just as an example how to prevent leading and trailing zeroes.
It reflects my recognition of how a simple "number" should look like, so YMMV.
Best wishes,
Oti.
On 11/1/07, Jim Idle <jimi at temporal-wave.com> 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