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

标签 parsing antlr antlr4

在 ANTLR v3 中,句法谓词可用于解决悬空 else 等问题。 ANTLR4 似乎接受具有类似歧义的语法,但在解析期间它会报告这些歧义(例如,“line 2:29 reportAmbiguity d=0 (e): ambigAlts={1, 2}, input=...”)。尽管存在这些歧义(根据文档,通过选择第一个替代方案),它仍会生成解析树。但是,如果我想让它选择其他选择,我该怎么办?换句话说,我怎样才能明确地解决歧义?

例如else悬挂问题:

prog
    :   e EOF
    ;

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

使用这个语法,从输入“if 1 then if 2 then 3 else 4”,它构建了这个解析树:(prog (e if (e 1) then (e if (e 2) then (e 3)否则 (e 4)))).

如果出于某种原因,我想要另一棵树,我该怎么办: (prog (e if (e 1) then (e if (e 2) then (e 3)) else (e 4)) ) ?

编辑:有关更复杂的示例,请参阅 What to use in ANTLR4 to resolve ambiguities in more complex cases (instead of syntactic predicates)? )

最佳答案

  • 在这种情况下,您可以使用语义谓词明确禁止替代方案。

    ('else' e | {_input.LA(1) != ELSE}?)
    
  • 您应该能够使用 ?? 运算符而不是 ? 来更喜欢将 else 与最外层的 相关联>如果。但是,性能将受到很大影响。另一种选择是区分匹配的 if/else 对与不匹配的 if

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

关于parsing - 在 ANTLR4 中使用什么来解决歧义(而不是句法谓词)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21415917/

相关文章:

java - 如何在 Java 迭代器中获取 JSON 值

python - python 样式结构的 BNF 语法

whitespace - 编写 antlr 语法,其中空格有时很重要

java - ANTLR - 左递归去除辅助

java - 从 Antlr4-Java 切换到 ParseKit-Objective-C : Channels in ParseKit?

Java CSV 行分隔

ios - DDMathParser - 如何识别错误是 iOS

java - 在 ANTLR 版本 4 中构建 AST

java - 使用 Java 解析 XML 并获取元素值和属性值

antlr - 是否有任何资源为 excel 函数提供 ANTLR 语法?