私が見た このアルゴリズム 左再帰をすべて削除するために使用できるはずです。しかし、私はこの特定の文法で問題に直面しています:
A -> Cd
B -> Ce
C -> A | B | f
私が何をしようとしても、私はループに陥ったり、まだ間接的に左再帰的な文法になってしまいます。
この文法に このアルゴリズム を適切に実装するための手順は何ですか?
ルールは、最初に非終端記号のある種の順序を確立してから、間接再帰が発生するすべてのパスを見つけることです。
この場合、順序はA <B <Cになり、非終端記号Cの再帰の可能なパスは次のようになります。
C=> A => Cd
そして
C=> B => Ce
したがって、Cの新しいルールは
C=> Cd | Ce | f
これで、直接左再帰を削除するだけで済みます。
C=> fC'
C'=> dC' | eC' | eps
結果として得られる非再帰的な文法は次のようになります。
A => Cd
B => Ce
C => fC'
C' => dC' | eC' | eps
すでにそれを理解しました。
私の混乱は、この順序ではアルゴリズムが何もしないように見えたので、それは間違っているに違いないと考え、最初の反復でA-> Cdを置き換え始めました(jを無視するとiを超えることはできません)無限ループに入ります。
1)ルールを並べ替えることによって:
C -> A | B | f
A -> Cd
B -> Ce
2)AのCを置き換える-> Cd
C -> A | B | f
A -> Ad | Bd | fd
B -> Ce
3)Bはまだjの範囲内にないので、そのままにして、Aの直接左再帰を置き換えます。
C -> A | B | f
A -> BdA' | fdA'
A'-> dA' | epsylon
B -> Ce
4)BのCを置き換える-> Ce
C -> A | B | f
A -> BdA' | fdA'
A'-> dA' | epsylon
B -> Ae | Be | fe
5)まだ完了していません!また、新しいルールB-> Aeを置き換える必要があります(Aの生成はjの範囲内です)
C -> A | B | f
A -> BdA' | fdA'
A'-> dA' | epsylon
B -> BdA'e | fdA'e | Be | fe
6)Bのプロダクションで直接左再帰を置き換える
C -> A | B | f
A -> BdA' | fdA'
A'-> dA' | epsylon
B -> fdA'eB' | feB'
B'-> dA'eB' | eB' | epsylon
ウーフー!左再帰のない文法!