ANTLR4 语法不符合预期

ANTLR4 grammar not behaving as expected

我有一些数据需要解析。我正在使用 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

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

您犯了一个典型的错误,即没有正确排列您的词法分析器规则。您应该阅读并理解 及其后果。

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

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

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

或者交换规则的顺序:

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

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