“决策可以匹配输入,例如”'?'“使用多个替代方案:在xText中使用1,2”

时间:2013-10-11 17:09:24

标签: parsing eclipse-plugin antlr context-free-grammar xtext

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

我该如何解决警告?

1 个答案:

答案 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不再匹配了。