我正在为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 ...)部分。我知道令牌优先级高于解析器规则,它当前与令牌表匹配。处理此类问题的正确方法是什么?
请帮忙。
答案 0 :(得分:1)
我想这是因为令牌'表'不同于表格'这被认为是一个标识符,请注意大写' T'那些代币不一样,你可以做出类似的东西:
TABLE : 'table' | 'Table' | 'TABLE';
或避免大写和小写的组合,例如:
TABLE: TABLE;
fragment T:
't' | 'T';
fragment A:
'a' | 'A';
等等,这也是antlr使用的方法