【问题标题】:Parsing ANTLR4 Rules With Ambiguous String Value用不明确的字符串值解析 ANTLR4 规则
【发布时间】:2013-03-18 16:17:45
【问题描述】:

我的语法在消除可能属于布尔值或字符串的值时遇到问题。

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

有什么帮助吗?

【问题讨论】:

    标签: antlr antlr4


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-07
      • 2019-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-24
      相关资源
      最近更新 更多