ANTLR解析器匹配令牌不是标识符

时间:2014-11-05 11:33:47

标签: java antlr3

我正在为SQL语句编写解析器。我为以下关键字定义了令牌:

tokens
{
CREATE = 'create';
TABLE = 'table';
YEAR = 'year';
NAME = 'name';
...
}

和标识符为

IDENTIFIER
    :
    ( LETTER | '_' ) (NAMECHAR)*
    ;

REAL_NUMBER
  : NUMBER_VALUE  ( 'e' ( PLUS | MINUS )? DIGIT )?
  ;

fragment
NUMBER_VALUE
  : {numberDotValid()}?=> DIGIT DOT DIGIT?
  | DOT DIGIT
  | DIGIT
  ;

fragment NAMECHAR
    : LETTER | DIGIT | '.' | '-' | '_' |'%'
    ;

fragment DIGIT
  : '0' .. '9' ( '0' .. '9' )*
  ;

fragment LETTER
    : 'a'..'z'
    | 'A'..'Z'
    ;

我已将输入传递为:

创建表emp(Table smallint not nulll);

我得到了一个期望标识符的错误输入错误。错误打开(表smallint ...)部分。我知道令牌优先级高于解析器规则,它当前与令牌表匹配。处理此类问题的正确方法是什么?

请帮忙。

1 个答案:

答案 0 :(得分:1)

我想这是因为令牌'表'不同于表格'这被认为是一个标识符,请注意大写' T'那些代币不一样,你可以做出类似的东西:

TABLE : 'table' | 'Table' | 'TABLE';

或避免大写和小写的组合,例如:

TABLE: TABLE;
fragment T:
't' | 'T';
fragment A:
'a' | 'A';

等等,这也是antlr使用的方法