web-dev-qa-db-ja.com

この間接的な左再帰の段階的な排除

私が見た このアルゴリズム 左再帰をすべて削除するために使用できるはずです。しかし、私はこの特定の文法で問題に直面しています:

A -> Cd
B -> Ce
C -> A | B | f

私が何をしようとしても、私はループに陥ったり、まだ間接的に左再帰的な文法になってしまいます。

この文法に このアルゴリズム を適切に実装するための手順は何ですか?

14
Flion

ルールは、最初に非終端記号のある種の順序を確立してから、間接再帰が発生するすべてのパスを見つけることです。

この場合、順序は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
26
Bokisha

すでにそれを理解しました。

私の混乱は、この順序ではアルゴリズムが何もしないように見えたので、それは間違っているに違いないと考え、最初の反復で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

ウーフー!左再帰のない文法!

8
Flion