当前位置: 首页 > 知识库问答 >
问题:

在ANTLR4中使用什么来解决歧义(而不是句法谓词)?

秦飞航
2023-03-14

在ANTLR v3中,句法谓词可以用来解决例如悬空的else问题。ANTLR4似乎接受具有类似歧义的语法,但在解析过程中它会报告这些歧义(例如,“line 2:29 reportAmbiguity d=0(e):ambigalts={1,2},input=...”)。它生成一个解析树,尽管存在这些歧义(根据文档,通过选择第一个备选方案)。但如果我想让它选择其他选择,我能做什么呢?换句话说,我如何显式地解决歧义?

prog
    :   e EOF
    ;

e
    :   'if' e 'then' e ('else' e)?
    |   INT
    ;

如果出于某种原因,我想要另一棵树:(prog(e if(e1)then(e if(e2)then(e 3))else(e 4)),我能做什么?

编辑:关于更复杂的示例,请参见ANTLR4中使用什么来解决更复杂情况下的歧义(而不是句法谓词?)

共有1个答案

訾俊名
2023-03-14

>

  • 在这种情况下,可以使用语义谓词显式地不允许替换。

    ('else' e | {_input.LA(1) != ELSE}?)
    

    您应该能够使用??运算符而不是else与最外层的if关联。然而,业绩将大幅下降。另一个选项是区分匹配的If/else对与不匹配的If对。

    ifStatement
      : 'if' expression 'then' (statement | block) 'else' (statement | block)
      | 'if' expression 'then' (statementNoIf | block)
      ;
    

  •  类似资料:
    • 在ANTLR v3中,句法谓词可以用来解决歧义,即明确地告诉ANTLR应该选择哪一个选项。ANTLR4似乎只是简单地接受具有类似歧义的语法,但在解析过程中它会报告这些歧义。它生成一个解析树,尽管存在这些歧义(根据文档,通过选择第一个备选方案)。但如果我想让它选择其他选择,我能做什么呢?换句话说,我如何显式地解决歧义? (关于悬而未决的else问题的简单情况,请参见:在ANTLR4中使用什么来解决歧

    • 我有一个非常简单的语法,如下所示: (我需要使用语义谓词,因为我需要解析关键字可以用作标识符的语言)。 参考:https://github.com/antlr/antlr4/blob/master/doc/predicates.md

    • 使用上面的测试数据运行ANTLR4测试平台,输出为 我可以看到第一个标记是ID的<4>,值为'rrv0' 我已经尝试重新安排lexer项目顺序。我还尝试通过在语法规则中显式匹配来使用隐式lexer项(而不是通过显式lexer项)。我也试着做火柴。那些对我来说并不成功。

    • 在ANTLR4中,我有一个lexer规则,说我可以使用任何字符得到任何单词,但空格和换行符除外。其定义如下: 我还有一个lexer规则(定义在than WORD之前),用于进入EVAL模式: 我考虑的另一个选择是将“word”定义为${and}包围的文本以外的任何东西。但我不知道如何创建这样的lexer规则。 我该怎么解决?要区分评价和词?

    • 问题内容: 我是Oracle10g用户。我不得不编写一些SQL查询,并发现了一个神秘的行为(如我所见)。假设我们有一个表,该表能够以某种简单的两级树结构进行连接。下一个查询给我“歧义错误”,这是预期的: 但是,如果我要在联接中再添加一个表,歧义问题将简单地消失: 请问对此有何解释?我完全想念它…完整的测试用例可以在http://pastebin.com/webf513w中找到 问题答案: 对于第三