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
规则可以匹配的所有内容,它首先在语法中定义。示例中的 16
和 32
是 WORD
s.
您应该通过不允许单词以数字开头来消除歧义:
WORD:
[A-Za-z] [A-Za-z0-9]*;
INT:
[0-9]+;
或者交换规则的顺序:
INT:
[0-9]+;
WORD:
[A-Za-z0-9]+;
在这种情况下,您不能使用完全数字的单词,但它们仍然可以以数字开头。
我有一些数据需要解析。我正在使用 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
规则可以匹配的所有内容,它首先在语法中定义。示例中的 16
和 32
是 WORD
s.
您应该通过不允许单词以数字开头来消除歧义:
WORD:
[A-Za-z] [A-Za-z0-9]*;
INT:
[0-9]+;
或者交换规则的顺序:
INT:
[0-9]+;
WORD:
[A-Za-z0-9]+;
在这种情况下,您不能使用完全数字的单词,但它们仍然可以以数字开头。