
スポンサードリンク
こんにちは、ももやまです。
前回は1文字だけの先読みで構文解析ができる文法であるLL(1)文法について説明していきました。
しかし、文法の中に左再帰な規則が入ってしまうと、文法内の他の規則に関わらず、絶対にLL(1)文法となることはありません。言い換えると、左再帰な規則は先読みしながらの構文解析の壁の1つといえます。
そこで今回は、
- そもそも左再帰とは?
- 左再帰な規則が入るとLL(1)文法でなくなる理由
- 左再帰の除去(例題・練習問題あり)
について、お勉強していきましょう。
本記事では特に指示がない限り、文章中に出てくる小文字・大文字・ギリシャ文字は
- 小文字
, , , , … → 終端記号 - 大文字
, , , , … → 非終端記号 を除くギリシャ文字 , , … → 終端記号と非終端記号から出来る文字列
(例: , , , など…) → 空文字
を表します。
※
目次 [hide]
スポンサードリンク
1. 左再帰・左再帰文法とは?
左再帰(規則)とは、生成規則の中に生成元の非終端記号と生成先の文字列の1文字目(先頭)が同じになっている規則、つまり規則中に
また、左再帰
例えば、生成規則が
左再帰文法には、左再帰の核部分
[余談1] 右再帰とは?
「左再帰があるなら、右再帰な文法もあるんじゃね?」と思った人もいると思います。
想像の通り、右再帰もあります。具体的には、
右再帰文法も、左再帰文法と同じように規則の核部分に加えて再帰をストップする規則の形
[余談2] 間接的な左(右)再帰
下の文法
同じように下の文法
※ 今回の記事では、
スポンサードリンク
2. 左再帰文法の問題点
左再帰が含まれている文法(左再帰文法)の最大の問題点は、絶対にLL(1)文法とはならないからです。言い換えると、左再帰が含まれている文法は、1文字先読みすることで後戻りなしに構文解析することができません。
LL(1)文法にならない理由を具体例を踏まえてみていきましょう。
例えば、次の左再帰規則
ここで、もしLL(1)文法であれば、1文字先読みするだけで
しかしこの2つの規則は、
:生成先の先頭 は最終的に により になる :生成先の先頭 である
ため、1文字先読みしたとしても、どちらの規則を適用すればよいかわかりません。
厳密に証明してみる
[お知らせ] 証明で使うDirector集合・First集合・Follow集合の解説はこちらで行っています。もっと厳密に、Director集合を使って左再帰規則
まず、生成規則
※
また、
※
よって、
※ ほんの一部の条件に対してでもDirector集合の積集合が
右再帰文法は大丈夫なの?
右再帰文法(生成規則に右再帰が含まれている)だからといって絶対にLL(1)文法ではなくなるとは限りません。
例えば、
:生成先の先頭 は である :生成先の先頭 は である
のため、生成先の先頭文字を見るだけで
スポンサードリンク
3. 左再帰の除去
(1) 左再帰除去の手順
左再帰文法は、次の公式を使うことによって簡単に左再帰ではない文法に書き換えることができます。
左再帰が含まれる規則
ここで、
の先頭文字は 以外である。
(先頭以外であれば の中に が含まれていてもOK) , は非終端記号だけ、終端記号だけで構成されていてもOK
※1. 左再帰に関係がない非終端記号(上の例の場合は
※2. 変形後は非終端記号
※3.
[公式導出] (やみくもに丸暗記するのではなく、導出過程を理解してから覚えましょう!)
まず最初に左再帰が含まれる規則

すると、
のように、
つまり、左再帰の規則を書き換える際には、左再帰ではない規則で
ここからは、左再帰規則
[ア]
[イ] 0回以上の
つぎに、
そのため、0回以上の
※
(a), (b)をまとめる
あとは [ア] と [イ] の規則を合わせるだけで、左再帰の除去をした(元の文法と等価な)文法の完成です!
(2) 例題で確認 [左再帰の除去]
次の文法
(1)
(2)
[解説1]
(1)
生成規則
(2)
左再帰が発生している部分について、下のように
あとは、左再帰の除去規則を使って規則を書き換えればOKです。
左再帰の発生に関係のない非終端記号(今回の場合は
※ ピンク色を付けて書いた部分は忘れがちなので要注意!
(3) 左再帰が複数含まれる場合
下のように左再帰が複数含まれる規則
[色の意味]
桃色の規則 … 左再帰の核となる
水色の規則 … 左再帰をストップする規則
左再帰が含まれていない
左再帰が複数含まれる規則
ここで、
, , … は空文字以外であれば何でもOK , , … の先頭文字は 以外である。
(先頭以外であれば の中に が含まれていてもOK) , , …, , , … は非終端記号だけ、終端記号だけで構成されていてもOK
※1. 左再帰に関係がない非終端記号(上の例の場合は
※2. 変形後は非終端記号
(4) 例題で確認 [左再帰が複数含まれる場合]
次の文法
左再帰の直接的な原因は
ここで、
なので、文字列を
あとは、左再帰の除去公式で置き換えてあげればOKです!
左再帰の発生に関係のない非終端記号(今回の場合は
5. 練習問題
それでは、今回習った左再帰の除去について2問の練習問題を用意しました。
練習1. 左再帰が1つの場合
次の文法
(1)
(2)
練習2. 左再帰が複数ある場合
次の文法
6. 練習問題の答え
解答1. 左再帰が1つの場合
(1)
生成規則
(2)
まず、左再帰が発生している
あとは、左再帰の除去規則を使って規則を書き換えればOK。
左再帰の発生に関係のない非終端記号(今回の場合は
解答2. 左再帰が複数の場合
左再帰の直接的な原因は
また、
なので、
あとは、左再帰の除去公式で置き換えるだけ。
左再帰の発生に関係のない非終端記号(今回の場合は
7. さいごに
今回は、左再帰が含まれる文法(左再帰文法)と、左再帰の除去について説明していきました。
最後に左再帰の除去公式をおさらいしておきましょう!

左再帰文法の問題点や、左再帰の除去について少しでも理解していただけたのであれば本当にうれしいです!
関連広告・スポンサードリンク