[antlr-interest] Antlr 3 beta 5

Terence Parr parrt at cs.usfca.edu
Sun Jan 21 08:42:26 PST 2007


put IDENT last.
Ter
On Jan 21, 2007, at 8:05 AM, Miguel Ping wrote:

> Hi all!
>
> I am trying to use Antlr3 beta 5, and I am trying to develop a very  
> primitive SQL parser. I am using antlr works to write up the  
> grammar, and I can't even parse a simple query.
>
> Here is my grammar:
>
> ///------------------------------------------------
> grammar SQL;
>
> //@parser::header {package etc;}
> //@parseR::members {@SupressWarnings("all");}
>
> /*------------------------------------------------------------------
> * PARSER RULES
> *------------------------------------------------------------------*/
> startRule
>    :    sqlStatement (SEMI sqlStatement )* SEMI? EOF;
>
> sqlStatement
>    :    //sqlSchemaStatement
>        sqlDataStatement ;
> //    |    sqlTransactionStatement ;
>
> sqlDataStatement
>    :    SELECT ASTERISK FROM IDENT;
> //@lexer::header{package etc;}
>
> /*------------------------------------------------------------------
> * LEXER RULES
> *------------------------------------------------------------------*/
>
>
> IDENT        :    (LETTER | UNDERS) (LETTER | UNDERS | DIGIT)*;
> fragment LETTER    :    'a'..'z' | 'A'..'Z';
> fragment DIGIT    :    '0'..'9';
> fragment UNDERS    :    '_';
>
> LPAREN    :    '(';
> RPAREN    :    ')';               //characters        SEMI    :     
> ';';
> COMMA    :    ',';
> DOT    :    '.';
> ASTERISK:    '*';
>
> //SQL COMMANDS
> ORDER    :    'order';
> GROUP    :    'group';
> BY    :    'by';
> HAVING    :    'having';
> UNION    :    'union';
> EXCEPT    :    'except';
> INTERSECT:    'intersect';    ALL    :    'all';
> FOR    :    'for';
> IN    :    'in';
>
> AND    :    'and';
> NOT    :    'not';
> NULL    :    'null';
>
> SELECT    :    'select';
> FROM    :    'from';
> WHERE    :    'where';
> AS    :    'as';
> JOIN    :    'join';
>
> PIVOT    :    'pivot';
>
> COUNT    :    'count';
> AVG    :    'avg';
> MIN    :    'min';
> MAX    :    'max';
> SUM    :    'sum';
> STDEV    :    'stdev';
> STDEVP    :    'stdevp';
> VAR    :    'var';
> VARP    :    'varp';
>
> DISTINCT:    'distinct';
> NATURAL    :    'natural';
>
> LEFT    :    'left';
> RIGHT    :    'right';
> INNER    :    'inner';
> OUTER    :    'outer';
> FULL    :    'full';
> ON    :    'on';
> USING    :    'using';
> LIMIT    :    'limit';
> OFFSET    :    'offset';
> DEFAULT    :    'default';
>
> //common stuff
> WS    :   (   ' '
>        |   '\t'
>        |   '\r' '\n'
>        |   '\n'
>        |   '\r'
>        ) {$channel=HIDDEN;};
> //ignore this token
>        UINT    :    '0'..'9';//correct this later
> //comentarios
> ML_COMMENT
>    :   '/*' (options {greedy=false;} : .)* {$channel=HIDDEN;}'*/';
> ///------------------------------------------------
>
> If i try and interpret a simple
>
> select * from sailors
>
> query, antlr works gives me a 'MismatchedTokenException (8!=5)',  
> altough this grammar is as simple as it gets! token 8 and 5 are the  
> 'select' and 'ident' tokens, what am I doing wrong?
>
> I started doing a big piece of the grammar at one shot, and antlr3  
> parser generation process gave me this error:
>
> error(10):  internal error: org.antlr.misc.OrderedHashSet.size 
> (OrderedHashSet.java:87): OrderedHashSet: elements and set size  
> differs; 2097151!=1020508
>
> So I changed my approach and tried the supplied grammar, one step  
> at a time. I have read and re-read the documentation, and I cannot  
> find my problem.
>
> Thanks in advance, Miguel Ping



More information about the antlr-interest mailing list