Ullmanのコンパイラの本では、シフトリデュース解析で、実行可能なプレフィックスの次の定義が示されています。
「shift-reduceパーサーのスタックに表示される可能性のある右センテンス形式のプレフィックスのセットは、実行可能プレフィックスと呼ばれます。実行可能プレフィックスの同等の定義は、右センテンス形式のプレフィックスであり、右を超えて継続しないことです。そのセンテンスフォームの右端のハンドルの終わり。この定義により、実行可能なプレフィックスの終わりに端末記号を追加して、正しいセンテンスフォームを取得することが常に可能です。したがって、の部分が特定のポイントに見られる入力は、実行可能なプレフィックスに減らすことができます。」
この定義が理解できません。誰かが例を使って実行可能なプレフィックスの意味を説明できますか?
特に、の意味を説明してください
「実行可能なプレフィックスの同等の定義は、それがそのセンテンスフォームの右端のハンドルの右端を超えて継続しない右センテンスフォームのプレフィックスであるということです。」
編集(または実際に書き直す):説明を求めた文は主要な毛玉です!その毛玉をバラバラにするために、言語とオートマトンについて少し復習する必要がありました。 これらの講義ノート その点で非常に役立つことがわかりました。
また、用語がトップダウン展開の観点から定義されることも容易ではありませんが、右端の派生は通常、ボトムアップ構文解析で使用されます。
次の式の文法を使用して説明します。
expr-> expr + term | term term-> term *ファクター| factor factor-> NUMBER | (expr)
expr-> expr + term -> expr + term * factor -> expr + term * NUMBER -> expr + factor * NUMBER -> expr + NUMBER * NUMBER -> expr + term + NUMBER * NUMBER -> expr + NUMBER + NUMBER * NUMBER -> term + NUMBER + NUMBER * NUMBER -> NUMBER + NUMBER + NUMBER * NUMBER
センテンス形式のプレフィックスは、そのセンテンス形式の0個以上の先行記号に減少する入力記号のシーケンスです。空のシーケンスは、すべてのセンテンス形式の接頭辞であり、センテンス形式を構成する記号の完全なシーケンスも、自明にその接頭辞です。
単純な句は、センテンス形式で場所を保持する単一の非終端記号の展開です。例えば、 term * factor
はterm
の拡張であり、term
自体が3つのプロダクションで発生するため、単純なフレーズです。
センテンスフォームのhandleは、そのフォーム内の左端の単純なフレーズです。 (確かに、ここでは「ハンドル」という用語がやや紛らわしいと思います。)右端の派生では、ハンドルは簡単に識別できます。これは、最後に拡張された非終端記号から生じた一連の記号です。 shift-reduceパーサーのようにボトムアップで作業している場合、ハンドルは単純なフレーズであり、次に縮小する必要があります。 (上の派生表を下から上に読んで、どの記号が削減されたかを見て、私が何を意味するかを確認してください。)
右センテンスフォームの実行可能なプレフィックスは、そのフォームのハンドルを超えて拡張されないプレフィックスです。つまり、そのプレフィックスは有効であり、次のものが含まれます。接頭辞がハンドルの最後まで伸びている場合は、ハンドル自体を除いて、還元可能な単純なフレーズはありません。
Shift-reduceパーサーの観点からは、スタックに実行可能なプレフィックスがある限り、スタックの一番上にある(おそらく不完全な)単純なフレーズを新しい非終端記号に減らすか、失敗するかはまだ強制されていません。減らすことができない場合の解析の。次のシンボルをシフトすると、実行可能なプレフィックス以外のものになる場合は、その時点で削減するか失敗する必要があります。
文脈自由言語を解析している場合、テーブル駆動のshift-reduceパーサーの構築に役立つかなり便利なプロパティがあります:コンテキストのすべての実行可能なプレフィックスのセット-自由言語はそれ自体が正規言語です!したがって、実行可能なプレフィックスの正規言語を認識する有限オートマトンを構築し、それを使用してシフトするタイミングと削減するタイミングを決定できます。スタックと有限状態マシンのこの組み合わせは、本質的にプッシュダウンオートマトンであり、これはまさに文脈自由言語を認識するために必要なオートマトンのクラスです。
本で与えられた文法を考えてください(私はここでそれを言い換えています)
E -> E+T | T
T -> T*F | F
F -> (E) | id
e '-> Eを追加することで拡張されます
今、この派生を見てください、
E' -> E
-> E+T
-> E+T*F
主張E + T *は実行可能なプレフィックスです
引数:この派生は正しいセンテンス形式であり、E + T *はその接頭辞です。現在のハンドルはT * Fです(T * FをTに減らすと、開始シンボルに到達できるため、解析が成功します)
したがって、E + T *は、正しいセンテンス形式の接頭辞であり、このセンテンス形式の右端のハンドルを超えて拡張されないため、実行可能な接頭辞です。 :)
それを定義する他の方法は次のとおりです。
The prefixes of right sentential forms that can appear on the stack of a shiftreduce
parser are called viable prefixes.
誰かが(私のように)もっと理解しやすいと思った場合に備えて、実行可能なプレフィックスの正式な定義を提供すると便利だと思いました。
与えられた文法 、私たちはそれを言います の実行可能なプレフィックス 右端の派生が存在する場合
そのような 。
ソース 。