我必须使用 antlr
解析以下查询sys_nameLIKEvalue
这里sys_name是一个具有小写和下划线的变量。 LIKE是一个固定的关键词。
value是一个变量,可以包含小写大写和数字。
在我正在使用的语法规则
之下**expression : parameter 'LIKE' values EOF;
parameter : (ID);
ID : (LOWERCASE) (LOWERCASE | UNDERSCORE)* ;
values : (VALUE);
VALUE : (LOWERCASE | NUMBER | UPPERCASE)+ ;
LOWERCASE : 'a'..'z' ;
UPPERCASE : 'A'..'Z' ;
NUMBER : '0'..'9' ;
UNDERSCORE : '_' ;**
测试案例1
Input : sys_nameLIKEabc
error thrown : line 1:8 missing 'LIKE' at 'LIKEabc'
测试案例2
Input : sysnameLIKEabc
error thrown : line 1:0 mismatched input 'sysnameLIKEabc' expecting ID
答案 0 :(得分:0)
解析器规则中的文字标记将被翻译成普通的词法分析器规则。所以,你的语法看起来真的像这样:
expression : parameter LIKE values EOF;
parameter : ID;
values : VALUE;
LIKE : 'LIKE';
ID : LOWERCASE (LOWERCASE | UNDERSCORE)* ;
VALUE : (LOWERCASE | NUMBER | UPPERCASE)+ ;
// Fragment rules will never become tokens of their own: good practice!
fragment LOWERCASE : 'a'..'z' ;
fragment UPPERCASE : 'A'..'Z' ;
fragment NUMBER : '0'..'9' ;
fragment UNDERSCORE : '_' ;
由于词法分析器规则是贪婪的,并且如果两个或多个词法分析器规则匹配相同数量的字符,第一个将" win",您的输入将被标记为如下:
输入:sys_nameLIKEabc
,2个令牌:
sys_name
:ID
LIKEabc
:VALUE
输入:sysnameLIKEabc
,1个令牌:
sys_nameLIKEabc
:VALUE
因此,永远不会使用您的测试输入创建令牌LIKE
,因此您的解析器规则都不会匹配。解析没有任何分隔符的输入似乎有点奇怪,比如空格。
要解决您的问题,您必须引入分隔符,或者禁止VALUE
包含大写字母。