无法使用antlr分析continuos字符串(没有空格)
我必须使用antlr无法使用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
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,现在可以成功地解析它了。谢谢你的帮助:)