我正在使用xText为新语言编写新的eclipse插件。但是当我尝试生成代码时,Antlr会给我这个警告:
Decision can match input such as "'?'" using multiple alternatives: 1, 2
我确定,在评论了很多代码后,问题出现在以下代码片段中:
...
Expression:
operatorExpr=OperatorExpr (condExpr=CondExpr)?
|exprPrimary=ExprPrimary (condExpr=CondExpr)?
;
CondExpr:
'?'
;
ExprPrimary:
Identifier
;
OperatorExpr:
'+' expression=Expression
;
...
我该如何解决警告?
答案 0 :(得分:2)
如果您有这个表达式:+x?
,可以通过两种方式进行分析:
Expression
-> operatorExpr : OperatorExpr
-> +
-> expression : Expression
-> exprPrimary : ExprPrimary = x
-> condExpr : ?
Expression
-> operatorExpr : OperatorExpr
-> +
-> expression : Expression
-> exprPrimary : ExprPrimary = x
-> condExpr : ?
condExpr可以设置在顶部表达式或内部表达式。
要解决此问题,您可以在主规则中仅保留第二个condExpr。无论如何,这是xtext将解决你的歧义的默认方式(意味着你的当前语法将选择第二个解析)。
如果你做另一种方式,只留下第一个condExpr,你会遇到两个问题:1)对于具有内部OperatorExpression(例如++x?
)的OperatorExpression,语法仍然不明确,以及2){{1不再匹配了。