我正在使用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
;
...
如何解决警告?
如果你有这个表达式: +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 的 OperatorExpression 仍然不明确(例如++x?
(,2( x?
将不再匹配。