1

ボトムアップパーサーを使用して、たとえば入力文字列1 + 2 * 3を「下」から「上」に移動する方法を理解するのに問題があります。

これが私が使用している文法です(Crafting aCompilerで見つかったものなので正しいと思います)

E = E plus T
  | T;

T = T times integer
  | integer;

これは私の逆の派生です:

int(1)
T(1)
E(1)
E(1) plus int(2)
E(1) plus T(2)
E(1) plus E(2)
E(1) plus E(2) times int(3)
E(1) plus E(2) times E(3) <-- can't do anything here

問題は、入力として整数を取得するたびに、整数が自動的に「変換」されることEです。

私は与えられた文法が正しいことをかなり確信しています。また、いくつかの入力文字列(私が作成したPretty Printerの訪問者を利用)を使用してsableccで試してみましたが、すべて正しい結果が得られます。

そうすれば、問題は文法そのものではなく、自分にあることがわかります。では、私は何を間違っているのでしょうか。

ありがとう!

4

1 に答える 1

1

shift-reduceの競合は、文法で見られる最も一般的なタイプの競合です。あなたの場合、T(2)をE(2)に減らすか、時間をシフトすることができます。デフォルトでは、ほとんどのパーサジェネレータは、リデュースではなくシフトを優先します。ただし、Tの後にプラスをシフトする意味がないことを知っているため、T(1)をE(1)に減らします。

于 2011-04-09T16:35:22.807 に答える