【ぶんみゃくじゆうぶんぽう】

文脈自由文法 とは?

最終更新:
💡 記号の書き換え規則で、構文の形を定義する仕組み

単一の非終端記号を書き換える生成規則で、記号列の構造を定義する文法。終端・非終端・開始記号、完全な導出例と、構文解析と意味解析の違いを解説します。

📌 このページのポイント
文脈自由文法:規則で構文の形を作る小さな文法(開始記号S)S → N + NN → 3 または N → 5規則を使う展開の一例SN + N3 + N3 + 5S・Nは非終端、3・5・+は終端構文が合っていても、型などの確認は別
矢印は規則を適用する順番で、計算結果へ変える図ではありません。3+3、5+3、5+5も生成できますが、一般の算術式をすべて定義する文法ではありません。
ひよこ ひよこ
プログラムの形を、どう決めるの?
ペンギン先生 ペンギン先生
書き換え規則を定める。開始記号、非終端記号、終端記号、生成規則が文法の構成要素だよ。非終端はさらに展開する記号、終端は最後に残る記号。そこから、どんな列を作れるかを考える。
ひよこ ひよこ
「文脈自由」って、前後を無視して読むの?
ペンギン先生 ペンギン先生
入力の順番を無視する意味ではない。規則の左辺が単一の非終端記号で、その周囲の記号列に関係なく置き換えられるという意味だよ。規則に従って作られる列には、順序や構造がある。
ひよこ ひよこ
簡単な例で見たい!
ペンギン先生 ペンギン先生
開始をSとし、規則を「S → N + N」「N → 3」「N → 5」とする。この小さな文法なら、SからN + N、次に3 + N、最後に3 + 5と展開できる。数字の3・5と記号+が終端だよ。
ひよこ ひよこ
3 + 5という計算だけの文法?
ペンギン先生 ペンギン先生
この例は、仕組みを説明する小さな文法だよ。一般的な算術式を全部定義しているわけではない。プログラミング言語では、式や文などの規則を組み合わせ、構文解析で入力の構造を確かめる。
ひよこ ひよこ
構文が合っていれば、プログラムは正しい?
ペンギン先生 ペンギン先生
別の確認も必要だ。型が合うか、変数が宣言されているかなどは、通常、意味解析で扱う。さらに実行時の動作もある。構文を定義できることと、プログラム全体の正しさは区別しよう。
もっと詳しく知りたい人へ

BNFとは同じ言葉?

BNFは文法の規則を書き表す記法です。文脈自由文法は規則の形式に関する概念です。表記の方法と、その規則でどんな列や構造を定義するかを区別して考えます。

同じ列に複数の構文木ができる?

そのような文法は曖昧な文法です。例えば演算の優先順位を区別しない規則では、一つの式に異なる構造を与えることがあります。構文解析で扱う際には、規則や優先順位などを明確にします。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「文脈自由文法」って出てきたら「記号の書き換え規則で、構文の形を定義する仕組み」と思えばだいたいOK!
📖 おまけ:英語の意味
「Context-Free Grammar」 = 文脈に依存しない文法
💬 CFGと略します。単一の非終端記号に適用する規則で、その前後にある記号列を適用条件にしません。

参考資料

← 用語集にもどる