1

新しい言語用の新しい Eclipse プラグインを作成するために xText を使用しています。しかし、コード 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?、次の 2 つの方法で分析できます。

Expression
->  operatorExpr : OperatorExpr
    ->  +
    ->  expression : Expression
        ->  exprPrimary : ExprPrimary = x
->  condExpr : ?

Expression
->  operatorExpr : OperatorExpr
    ->  +
    ->  expression : Expression
        ->  exprPrimary : ExprPrimary = x
        ->  condExpr : ?

condExpr は、一番上の Expression または内側の Expression に設定できます。

この問題を解決するには、メイン ルールに 2 番目の condExpr だけを残すことができます。とにかく、これは xtext があいまいさを解決するデフォルトの方法です (つまり、現在の文法では 2 番目の解析が選択されます)。

逆に、最初の condExpr だけを残すと、次の 2 つの問題が発生します。1) 内部 OperatorExpression を持つ OperatorExpression の文法は依然としてあいまいであり (++x?たとえば)、2)x?もはや一致しません。

于 2013-10-12T10:44:02.550 に答える