在 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/