我有一个语法,我无法消除可能属于布尔值或字符串的值的歧义。
语法有几个String类型和Boolean类型的字段。 String字段几乎可以包含引号内的任何内容,而Boolean可以包含“Y”或“N”。问题:有时字符串字段也可以包含“Y”或“N”(通常作为多个单字符值列表的一部分)。
以下是相关的语法规则。我已经尝试使用谓词来消除布尔比较与字符串的歧义,只要该字符串是“Y”或“N”。
booleanLogical
: booleanAtom (EQ|NE) booleanAtom
| booleanAtom (EQ|NE) {_input.LT(1).getText().equals("\"Y\"") || _input.LT(1).getText().equals("\"N\"")}? STRING
;
booleanAtom
: BOOLEAN_FIELD
;
stringLogical
: stringAtom (EQ|NE|LT|LE|GT|GE) stringAtom
| STRING_FIELD (EQ|NE|LT|LE|GT|GE) ('"Y"'|'"N"')
;
stringAtom
: STRING_FIELD
| STRING
;
BOOLEAN_FIELD: ("BFIELD1","BFIELD2","BFIELD3");
STRING_FIELD: ("SFIELD1","SFIELD2","SFIELD3");
尝试解析布尔表达式时的错误消息:
BFIELD1="Y"
是:
line 1:7: no viable alterative at input 'BFIELD1="Y"'
在antlr3中,我本来只是使用前瞻,但这不再是一种选择。
那里有任何帮助吗?
答案 0 :(得分:3)
由于在'"Y"'
规则中使用了文字stringLogical
,输入"Y"
正在生成一个非STRING
的特殊标记。我建议您不要尝试区分解析器中的"Y"
,"N"
和其他字符串,而是在解析完成后使用侦听器验证字符串。
booleanLogical
: booleanAtom (EQ|NE) booleanAtom
| booleanAtom (EQ|NE) STRING
;
此外,重要的是要注意ANTLR 4仅评估出现在决策左边缘的谓词。您在原始booleanLogical
规则中使用的谓词不在决策的左边缘,因此永远不会对其进行评估。