技能一覧 › 大学数学 オートマトン・形式言語

文脈自由文法の導出と導出木

生成規則から開始記号 を書き換えて文字列を導出でき、最左導出と導出木(構文木)の対応を使って、与えられた文字列が文法で生成されるかを確かめ、小さな例で導出木を描ける

前提

中学までに習ったことだけで始められます。

説明

文脈自由文法とは、記号を書き換える規則の集まりで、文字列の集合(言語)を定めるものです。開始記号 から規則に従って書き換えを繰り返し、文字列を作る操作を導出といいます。この技能を使うと、ある文字列がその文法で作れるかを確かめられ、作り方を木の形(導出木)で表せるようになります。プログラミング言語の構文解析や、括弧の対応のような入れ子の構造を扱う場面で使います。

なぜそうしてよいのか

文法は次の 4 つで決まります。
(1) 終端記号:最終的な文字列に現れる文字( など小文字)。
(2) 非終端記号:まだ書き換える途中の記号( など大文字)。
(3) 生成規則: の形の規則。「非終端記号 を記号列 に置き換えてよい」という意味です。左辺が非終端記号 1 個だけなので、周りの記号(文脈)に関係なく置き換えられます。これが「文脈自由」という名前の由来です。 は と の 2 つの規則をまとめて書いたものです。長さ 0 の文字列(空文字列)は と書きます。
(4) 開始記号 。

記号列の中の非終端記号 1 個を、規則 1 つで置き換えることを 1 段の導出といい、 で表します。0 段以上の導出をまとめたものは で表します。 となり、 が終端記号だけでできているとき、「 は文法で生成される」といいます。生成される文字列すべての集合を、その文法の言語といいます。

同じ文字列でも、どの非終端記号から先に置き換えるかで導出の順番はいくつも考えられます。しかし「どの非終端記号を、どの規則で置き換えたか」だけを記録すると、導出は木の形になります。根を とし、規則 を使った節点 の下に子 を左から順に付けた木です。これを導出木(構文木)といいます。 を使ったときは、子として を 1 個付けます。葉を左から順に読むと、生成された文字列になります( の葉は読み飛ばします)。

導出木は置き換えの順番を忘れた記録です。そこで順番を「いつも最も左の非終端記号を置き換える」と決めます。こうした導出を最左導出といいます。最左導出は、木を根から左側優先でたどる順に節点を展開することに当たります。そのため、導出木 1 つに対して最左導出がちょうど 1 つ対応します。したがって「 が生成されるか」を調べるときは、最左導出だけを探せば十分です。このとき、置き換える場所を迷う必要はなく、迷うのは使う規則だけになります。

手順

  1. 文法を読み取る:終端記号・非終端記号・開始記号 と、各非終端記号の規則をすべて書き出す。

  2. 開始記号 から始め、今の記号列の中で最も左にある非終端記号を 1 つ選ぶ。

  3. その非終端記号を左辺にもつ規則のうち、目標の文字列 と矛盾しないものを選んで置き換える(1 段で置き換えるのは 1 個だけ)。矛盾しないかは、記号列の左端に並んだ終端記号が の先頭と一致するかで判断する。規則に がない文法では、記号列の長さが を超えないかも確認する。

  4. 非終端記号がなくなるまで手順 2・3 を繰り返す。結果が に一致すれば であり、 は生成される。行き詰まったら前の段に戻って別の規則を試す。すべての可能性が失敗すれば、 は生成されない。

  5. 導出木を描く:根を とし、各段で置き換えた非終端記号の節点の下に、使った規則の右辺の記号を左から順に子として付ける。葉を左から読んで になることを確かめる。

例題

非終端記号を 、終端記号を 、開始記号を とし、生成規則を 、、 とする文法を考える。文字列 がこの文法で生成されることを最左導出で示し、その最左導出で生成規則を使う回数( の個数)を求めよ。

例題の解答

手順 1: の規則は だけです。 の規則は と 、 の規則は です。 の規則はないので、記号列の長さは を超えてはいけません。

手順 2・3(1 段目): を で置き換えて 。

2 段目:最も左の非終端記号は です。 を選ぶと になり、 は にしかならないので で終わってしまい、 に届きません。そこで を選び、 とします。左端の終端記号 は の先頭と一致し、長さは です。

3 段目:最も左の非終端記号は再び です。 を選ぶと で長さが になり、 を超えるので不可です。そこで を選び、 とします。

4 段目(手順 4):残る非終端記号 を で置き換えて 。非終端記号がなくなり、目標と一致しました。

まとめると、最左導出は

となり、 は生成されます。各段で選べる規則は 1 通りに決まったので、最左導出はこれ 1 つだけです。

手順 5(導出木):根 の子は左から です。その の子は左から で、下の の子は です。 の子は です。葉を左から読むと で、 になります。子をもつ節点(、上の 、下の 、)はちょうど 4 個です。これは導出の段数と一致しています。

よって、生成規則を使う回数は 回です。

答え:

よくある誤り

この説明は AI が書き、別の AI が例題を独立に解いて答えを確かめ、説明を一歩ずつ査読しました。

入口の問題

この技能を使う問題

この技能の次に学べること