ANTLR4语法表现不尽如人意

时间:2016-09-22 16:30:18

标签: parsing antlr4 lexer

我需要解析一些数据。我正在使用ANTLR4工具自动生成java解析器和词法分析器,我可以使用它从下面给出的输入数据中形成结构化数据 语法:

grammar SUBDATA;
subdata:
    data+;
data:
    array;
array:
    '[' obj (',' obj)* ']';
intarray:
    '[' number (',' number)* ']';
number:
    INT;
obj:
    '{' pair (',' pair)* '}';
pair:
    key '=' value;
key:
    WORD;
value:
    INT | WORD | intarray;
WORD:
    [A-Za-z0-9]+;
INT:
    [0-9]+;
WS:
    [ \t\n\r]+ -> skip;

测试输入数据:

[
    {OmedaDemographicType=1, OmedaDemographicId=100, OmedaDemographicValue=4}, 
    {OmedaDemographicType=1, OmedaDemographicId=101, OmedaDemographicValue=26}, 
    {
        OmedaDemographicType=2, OmedaDemographicId=102, OmedaDemographicValue=[16,34]
    }
]

输出继电器:

line 5:79 mismatched input '16' expecting INT
line 5:82 mismatched input '34' expecting INT

GUI Tree O/P

Parser失败了,虽然我在上面的预期位置有整数值。

1 个答案:

答案 0 :(得分:2)

你犯了经典的错误,就是没有正确地订购你的词法规则。您应该阅读并理解priority rules及其后果。

在您的情况下,INT 永远不会能够匹配,因为WORD规则可以匹配INT规则可以匹配的所有内容,并且它首先在语法。示例中的这些1632WORD s。

您应该通过不允许单词以数字开头来消除歧义:

WORD:
    [A-Za-z] [A-Za-z0-9]*;
INT:
    [0-9]+;

或者通过交换规则的顺序:

INT:
    [0-9]+;
WORD:
    [A-Za-z0-9]+;

在这种情况下,您不能使用完全数字的单词,但它们仍然可以以数字开头。