【问题标题】:Not able to parse continuos string using antlr (without spaces)无法使用 antlr 解析连续字符串(没有空格)
【发布时间】:2015-06-09 09:28:40
【问题描述】:

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

【问题讨论】:

    标签: antlr antlr4 string-parsing


    【解决方案1】:

    解析器规则中的文字标记将被转换为普通的词法分析器规则。所以,你的语法真的是这样的:

    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 : '_' ;
    

    由于词法分析器规则是贪婪的,并且如果两个或多个词法分析器规则匹配相同数量的字符,第一个将“获胜”,您的输入将被标记如下:

    输入:sys_nameLIKEabc,2 个令牌:

    • sys_name: ID
    • LIKEabc: VALUE

    输入:sysnameLIKEabc,1 个令牌:

    • sys_nameLIKEabc: VALUE

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

    要解决您的问题,您要么必须引入分隔符,要么不允许您的 VALUE 包含大写字母。

    【讨论】:

    • 我添加了一些分隔符,现在可以成功解析它。感谢您的帮助:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多