在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)?)
答案 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)
;