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

时间:2014-01-28 20:19:05

标签: parsing antlr antlr4

在ANTLR v3中,句法谓词可用于解决例如悬挂的其他问题。 ANTLR4似乎接受具有类似模糊度的语法,但在解析期间它报告这些模糊性(例如,“第2:29行报告模糊d = 0(e):ambigAlts = {1,2},输入= ......”)。它产生了一个解析树,尽管有这些含糊之处(根据文档,通过选择第一个替代方案)。但是,如果我想让它选择其他替代方案,我该怎么办?换句话说,我该如何明确地解决歧义?

例如,悬空的其他问题:

prog
    :   e EOF
    ;

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

使用这个语法,从输入“if 1 then if then then then then 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)?

1 个答案:

答案 0 :(得分:2)

  • 您可以使用语义谓词在此类情况中明确禁止替代。

    ('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)
      ;