1

我有一个语法,我无法消除可能属于布尔值或字符串的值的歧义。

该语法有几个字符串类型和布尔类型的字段。字符串字段几乎可以包含引号内的任何内容,布尔值可以包含“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 中,我只会使用前瞻,但这不再是一个选项。

那里有任何帮助吗?

4

1 回答 1

3

由于'"Y"'stringLogical规则中使用了文字,输入"Y"产生了一个特殊的标记,它不是STRING. 我建议您停止尝试在解析器中区分"Y""N"和其他字符串,而是在解析完成后使用侦听器来验证字符串。

booleanLogical
  : booleanAtom (EQ|NE) booleanAtom
  | booleanAtom (EQ|NE) STRING
  ;

此外,重要的是要注意 ANTLR 4 仅评估出现在决策左边缘的谓词。您在原始booleanLogical规则中使用的谓词不在决策的左边缘,因此永远不会被评估。

于 2013-03-18T17:30:43.663 回答