0

これがレモンパーサージェネレーター用に書かれた文法です:

%left  PostDecrementation.
%right PreDecrementation.

program ::= expression.
expression ::= Terminal.
expression ::= unaryoperation.
unaryoperation ::= Decrementation expression. [PreDecrementation]
unaryoperation ::= expression Decrementation. [PostDecrementation]

コンパイルしようとすると、ジェネレーターは次の競合を生成します。

State 0:
      program ::= * expression
      expression ::= * Null
      expression ::= * unaryoperation
      unaryoperation ::= * Decrementation expression
      unaryoperation ::= * expression Decrementation

                      Null shift  5
            Decrementation shift  1
                   program accept
                expression shift  2
            unaryoperation shift  4

State 1:
      expression ::= * Null
      expression ::= * unaryoperation
      unaryoperation ::= * Decrementation expression
      unaryoperation ::= Decrementation * expression
      unaryoperation ::= * expression Decrementation

                      Null shift  5
            Decrementation shift  1
                expression shift  3
            unaryoperation shift  4

State 2:
  (0) program ::= expression *
      unaryoperation ::= expression * Decrementation

                         $ reduce 0
            Decrementation shift  6

State 3:
  (3) unaryoperation ::= Decrementation expression *
      unaryoperation ::= expression * Decrementation

            Decrementation shift  6
            Decrementation reduce 3   ** Parsing conflict **
                 {default} reduce 3

State 4:
  (2) expression ::= unaryoperation *

                         {default} reduce 2

State 5:
  (1) expression ::= Null *

                 {default} reduce 1

State 6:
  (4) unaryoperation ::= expression Decrementation *

                 {default} reduce 4

PreIncrementationとPostDecrementationの両方の優先順位と結合性が文法で明示的に指定されているのに、なぜ競合があるのですか?

4

1 に答える 1

0

疑似端末(PostDecrementationおよびPreDecrementation)の優先順位ルールのみを定義しています。実際の端末のデクリメントの優先順位はどこにも定義されていません。

優先順位は、プロダクション(削減可能)とターミナル(シフト可能)の間で常に比較されます。したがって、競合を解決するには、デクリメントの優先順位を指定する必要があります。

個人的には、この場合、優先順位宣言は使用しません。ただし、本当に必要な場合は、おそらく1つの疑似端末を使用し、それを使用する2つのプロダクションのうちの1つの優先順位をDecrementationにする必要があります。

于 2013-01-21T00:45:09.040 に答える