我需要解析一些数据。我正在使用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
Parser失败了,虽然我在上面的预期位置有整数值。
答案 0 :(得分:2)
你犯了经典的错误,就是没有正确地订购你的词法规则。您应该阅读并理解priority rules及其后果。
在您的情况下,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]+;
在这种情况下,您不能使用完全数字的单词,但它们仍然可以以数字开头。