无法使用antlr分析continuos字符串(没有空格)

无法使用antlr分析continuos字符串(没有空格),antlr,antlr4,string-parsing,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 : (LOWE

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

解析器规则中的文字标记将转换为普通lexer规则。所以,你的语法看起来是这样的:

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 : '_' ;
由于lexer规则是贪婪的,如果两个或多个lexer规则匹配相同数量的字符,则第一个将“赢”,您的输入将标记为如下所示:

输入:
sys\u nameLIKEabc
,2个令牌:

  • sys\u name
    ID
  • LIKEabc
    VALUE
输入:
sysnameLIKEabc
,1个令牌:

  • sys\u nameLIKEabc
    VALUE
因此,像这样的令牌永远不会与测试输入一起创建,因此您的解析器规则都不会匹配。在没有任何分隔符(如空格)的情况下解析输入似乎也有点奇怪


要解决此问题,您必须引入分隔符,或者不允许
值包含大写字母

我添加了一些delimeter,现在可以成功地解析它了。谢谢你的帮助:)