1

前置演算子と後置演算子の両方を使用して言語を解析できる LR(0) パーサーを構築することは可能ですか? たとえば、 + (足し算) と ! を使った文法があるとします。通常の優先順位の (階乗) 演算子、次に 1+3! 1 + 3 である必要があります。= 1 + 6 = 7 ですが、確かにパーサーが LR(0) の場合、スタックに 1+3 があった場合、シフトではなく減少しますか?

また、正しい連想演算子は問題を引き起こしますか? たとえば、2^3^4 は 2^(3^4) である必要がありますが、パーサーがスタックに 2^3 を持っている場合、どのようにして削減またはシフトを知るのでしょうか?

これが不可能な場合、おそらく文法を変更して適切な場所に括弧を追加することにより、LR(0) パーサーを使用する方法がまだありますか?

4

1 に答える 1

1

LR(0) パーサーには、プレフィックスのない言語 (言語内の文字列が他のプレフィックスではない言語) しか解析できないという弱点があります。5 のようなものは 5! の接頭辞であるため、これは通常、これらのような式を解析するのを少し難しくします。これは、右結合演算子を取得するのが難しい理由も説明しています-次のようなプロダクションを考えると

S→F | F^S

パーサーは F を見た後、それを拡張するか、再度削減するかを判断できないため、シフト/削減の競合が発生します。これは、前述の接頭辞なしのプロパティに関連しています。

LR(0) のこの弱点は、人々が実際にあまり使用しない理由の 1 つです。SLR(1) および LALR(1) パーサーは通常、これらの文法を解析できます。これらのパーサーには、シフトするか削減するかを決定できる先読みのトークンがあるためです。上記の場合、F を削減するか ^ をシフトするかを決定するときに、S の後に ^ が表示されるべき正しい文字列がないため、パーサーは ^ をシフトすることを確認できるため、シフト/削減の競合は発生しません。

于 2016-03-14T16:56:07.637 に答える