Parsing &引用;决策可以匹配输入,例如''&引用;使用多个备选方案:1,2“;在xText中

Parsing &引用;决策可以匹配输入,例如''&引用;使用多个备选方案:1,2“;在xText中,parsing,eclipse-plugin,antlr,context-free-grammar,xtext,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=ExprPr

我正在使用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)运算符表达式与内部运算符表达式的语法仍然不明确(
++x?
),以及2)
x?
将不再匹配