[antlr-interest] Lexer question

dotnet fr dotnetfr at gmail.com
Thu Jul 27 06:05:19 PDT 2006


Dominik,
Thank you for your solution, it works very well.
I have another one, it looks like the same ;)

In the lexer -------------------
INTORDOUBLE
	: (INTEGER '.') => DOUBLE	{ $setType(DOUBLE); }
	| INTEGER			{ $setType(INTEGER); }
	;

protected
DOUBLE		: ('-')? ('0'..'9')+ '.' ('0'..'9')* ;
protected
INTEGER		: ('0'..'9')+ ;

and in the parser ---------------------------

startRule : (line)* ;

line : DOUBLE | INTEGER;

Regards,
Tomy

2006/7/27, Dominik Holenstein <dholenstein at gmail.com>:
> Tomy,
> I have played around with your Lexer and Parser code and have found
> this solution:
>
>
> -------------------------------------------------------
> ANTLR Grammar (file n.g):
>
> class NumParser extends Parser;
>
> startRule : (line)* ;
>
> line      : (
>                  d:DOUBLE
>                  {System.out.println("Double: "+d.getText());}
>                  |
>                   i:INTEGER
>                  {System.out.println("Integer: "+i.getText());}
>                   )
>                   ;
>
>
> class NumLexer extends Lexer;
>
> DOUBLE          : (('-')? ('0'..'9')+ '.' ('0'..'9')* )=> ('-')?
> ('0'..'9')+ '.' ('0'..'9')* | ('0'..'9')+ {$setType(INTEGER);} ;
>
> INTEGER         : ('0'..'9')+ ;
>
> SEMICOLON    : ';' { $setType(Token.SKIP); } ;
>
> NEWLINE        : (('\r''\n')=> '\r''\n'
>               | '\r'
>               | '\n'
>               ) { $setType(Token.SKIP); }
>                        ;
> WS                  : (' '|'\t') { $setType(Token.SKIP); } ;
>
> ---------------------------------------------------
>
> The Java test code (Main.java):
>
> import java.io.DataInputStream;
> import java.io.FileInputStream;
> import java.io.FileNotFoundException;
> import java.io.FileWriter;
> import java.io.IOException;
>
> public class Main {
>        public static void main (String[] args) {
>                try {
>                        // Make sure you change the path for your input file
>                        DataInputStream input = new DataInputStream(new
> FileInputStream("E:\\ANTLR\\Examples\\Numbers\\input.txt"));
>                        NumLexer lexer = new NumLexer(input);
>                NumParser parser = new NumParser(lexer);
>                try {
>                        parser.startRule();
>                } catch(Exception e) {}
>        } catch (FileNotFoundException e) {
>                System.out.println("Error: Cannot open file for reading");
>        }
>        }
> }
>
> --------------------------------------------------------------
> Data in the input file (input.txt):
> 10;
> 1500;
> 0.50;
> 35;
> 7.25;
> 3000;
>
> ---------------------------------------------------------------
>
> I have added all files as attachments to this e-mail.
>
> You can set k=1 because of the semantic predicate what makes the
> parser a bit faster.
> The System.out... messages are for testing purposes. I can see then in
> the console the output of the parser. I am working with Eclipse 3.2
> and ANTLR Studio. I am not sure whether this is 'good' programming
> style but it works ;-) . Inputs, feedbacks and better solutions are
> welcomed.
>
> I hope it helps!
>
> Regards,
> Dominik
>
>
>
>
>
> On 7/27/06, dotnet fr <dotnetfr at gmail.com> wrote:
> > Hi Dominik,
> >
> > I'm happy to meet a person like me!
> > I'm a beginner with antlr and codeworker too ;)
> > I'm each minute I'm learning new key. Antlr seems very powerful yeah.
> > My project is to create first a class generator, structure generator
> > and in final a structure (or class loader). It means I use parsing and
> > generation code.
> > What do you do with antlr, what is your interest in informatics ?
> >
> > Cheers
> > Tomy
> >
> > 2006/7/27, Dominik Holenstein <dholenstein at gmail.com>:
> > > Hi Tomy,
> > > I don't know codeworker but will have a look at it.
> > > ANTLR is very powerful and with v3 coming in fall it will get much better.
> > > I am a beginner with Java and ANTLR so everything is 'difficult' at
> > > the moment. But I am progressing and learning every day!
> > > I will look at your issue this afternoon.
> > >
> > > Regards,
> > > Dominik
> > >
> > >
> > >
> > > On 7/27/06, dotnet fr <dotnetfr at gmail.com> wrote:
> > > > Hi Dominik,
> > > >
> > > > I have seen in the Predicated LL(k) Lexing in the ANTLR documentation
> > > > witch treats about this kind of problem. It works but it's not the
> > > > best solution I think ;)
> > > > I thought that the antlr lexer try the first token and if it doesn't
> > > > match, it go to
> > > > the second etc..
> > > >
> > > > My parser grammar :
> > > >
> > > > startRule
> > > >        :
> > > >                nbp_debug
> > > >        ;
> > > >
> > > > protected
> > > > debug    :
> > > >        (
> > > >                DATE
> > > >        |       DOUBLE
> > > >        |       INTEGER
> > > >        |       SEMICOLON
> > > >        )*
> > > >        ;
> > > >
> > > > What do you think about Antlr ? I have to do the same project with
> > > > codeworker and antlr. Antlr seems more difficult to manipulate.
> > > >
> > > > Cheers,
> > > >
> > > > Tomy
> > > >
> > > > 2006/7/27, Dominik Holenstein <dholenstein at gmail.com>:
> > > > > Tomy,
> > > > >
> > > > > What is you grammar in the parser?
> > > > > Thanks.
> > > > >
> > > > > Dominik
> > > > >
> > > > >
> > > > > On 7/27/06, dotnet fr <dotnetfr at gmail.com> wrote:
> > > > > > Hi Everyone,
> > > > > >
> > > > > > I have a problem about the antlr lexer.
> > > > > >
> > > > > > In input I have :
> > > > > > 10;
> > > > > > 1500;
> > > > > > 0.50;
> > > > > >
> > > > > > In my lexer I have :
> > > > > > DOUBLE          : ('-')? ('0'..'9')+ '.' ('0'..'9')* ;
> > > > > > INTEGER         : ('0'..'9')+ ;
> > > > > > SEMICOLON       : ';' ;
> > > > > >
> > > > > > In my parser and lexer I have k=5.
> > > > > >
> > > > > > But I've got an error, the lexer seems to get his TOKENS in the order.
> > > > > > It gets the 10 like a double (the first in the list) and send an
> > > > > > exception
> > > > > > (exception: expecting ''.'', found '';'')
> > > > > >
> > > > > > I want the lexer to skip and try the next TOKEN and send an exception
> > > > > > only if there isn't any solutions.
> > > > > >
> > > > > > Is anyone got this problem too ?
> > > > > >
> > > > > > Cheers,
> > > > > >
> > > > > > Tomy
> > > > > >
> > > > >
> > > >
> > > >
> > > > --
> > > > dotnet
> > > >
> > >
> >
> >
> > --
> > dotnet
> >
>
>
>


-- 
dotnet


More information about the antlr-interest mailing list