左の再帰と去ったファクタリング - どちらが最初に行きますか?
-
16-10-2019 - |
質問
残りの再帰と去った因子を含むプロダクションを持っている文法がある場合
$ qquad displaystyle f to fba mid cds mid c $
どちらが優先事項、左再帰、または左因子を去りますか?
解決
左のファクタリングや左再帰の削除などの変換には、優先順位ルールがありません。明らかに、結果として生じる文法は異なる場合がありますが、同じ言語を認識します。
質問の例の文法は、典型的な学部宿題の問題よりも困難です。したがって、私たちの作品を示すことは役に立ちます。
左の再帰
左の再帰を削除する変換を定義しましょう。
与えられた
$ qquad displaystyle a to a alpha_0 mid a alpha_1 mid dots mid a alpha_n mid b beta_0 mid b beta_1 mid dots mid b beta_n $、
このような左の再帰を削除します:
$ qquad displaystyle begin {align} a_h& to b beta_0 mid b beta_1 mid dots mid b beta_n a_t& to alpha_0 mid alpha_1 mid dots mid alpha_n a_ {t^+}& to a_t a_ {t^+} mid a_t a& to a_h a_h a_ {t^+} mid a_h end {align} $ $
上記の一般性は通常、コンパイラテキストでは示されていませんが、Grune&Jacobsのようなテキストを解析します。左のファクタリングは、上記の変換された文法に適用できますが、答えを変更しない追加のルールを導入するだけです。だから私たちはそうします 簡素化する 余分な左因数分解のないプレゼンテーションが実行されます。
この答えでは、単一の非ターミナルのルールのみに関心があるため、間接的な左再帰の問題をカバーしません。ただし、間接左の再帰に対処できることに注意してください。 (それが重要である場合、別の質問を開きます。)
左ファクタリング
左のファクタリングを削除することは、このように行われたほとんどの導入コンパイラテキストにあります。与えられた
$ qquad displaystyle a to xy mid xz $
左のファクタリングの利回り:
$ qquad displaystyle begin {align} a_s& to y mid z a& to x a_s end {align} $
これで、両方の順序で変換が実行されます。
最初にファクタリングを去りました
質問の文法を要因にしましょう
$ qquad displaystyle begin {align} f_s& to ds mid varepsilon f& to fb a mid c f_s end {align} $
そして、左の再帰を削除します。
$ qquad displaystyle begin {align} f_h& to c f_s f_t& to b a f_ {t^+}& to f_t f_ {t^+} | f_t f_s& to ds mid varepsilon f& to f_h f_ {t^+} mid f_h end {align} $
最初に左の回復を削除します
そして、他の注文のために、質問の文法から左の再帰を削除しましょう
$ qquad displaystyle begin {align} f_h& to c ds mid c f_t& to b a f_ {t^+}& to f_t f_ {t^+} mid f_t f& to f_h f_ {t^+} mid f_h end {align} $
そして、ターミナル$ c $を要因にしておきます。
$ qquad displaystyle begin {align} f_ {hs}& to ds mid varepsilon f_h& to c f_ {hs} f_t& to b a f_ {t^+}& to f_t f_ {t^+} mid f_t f& to f_h f_ {t^+} mid f_h end {align} $
ああ、結果として生じる文法は同じです!
一般的に、2つの文法が同等であることを証明することは想像もできません。したがって、シリーズの文法変換が影響を与える可能性がある場合 認識されている言語 それから、それは悲惨です。