1

我正在使用 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
;
...

我该如何解决警告?

4

1 回答 1

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)x?将不再匹配。

于 2013-10-12T10:44:02.550 回答