无法使用antlr解析continuo字符串(不含空格)

时间:2015-06-09 09:28:40

标签: antlr antlr4 string-parsing

我必须使用 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

1 个答案:

答案 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_nameID
  • LIKEabcVALUE

输入:sysnameLIKEabc,1个令牌:

  • sys_nameLIKEabcVALUE

因此,永远不会使用您的测试输入创建令牌LIKE,因此您的解析器规则都不会匹配。解析没有任何分隔符的输入似乎有点奇怪,比如空格。

要解决您的问题,您必须引入分隔符,或者禁止VALUE包含大写字母。