我有一个语法,我无法消除可能属于布尔值或字符串的值的歧义。
该语法有几个字符串类型和布尔类型的字段。字符串字段几乎可以包含引号内的任何内容,布尔值可以包含“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 中,我只会使用前瞻,但这不再是一个选项。
那里有任何帮助吗?