使用不明确的字符串值解析ANTLR4规则

时间:2013-03-18 16:17:46

标签: antlr antlr4

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

语法有几个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中,我本来只是使用前瞻,但这不再是一种选择。

那里有任何帮助吗?

1 个答案:

答案 0 :(得分:3)

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

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

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