【ぶんみゃくじゆうぶんぽう】
文脈自由文法 とは?
最終更新:
💡 記号の書き換え規則で、構文の形を定義する仕組み
単一の非終端記号を書き換える生成規則で、記号列の構造を定義する文法。終端・非終端・開始記号、完全な導出例と、構文解析と意味解析の違いを解説します。
📌 このページのポイント
- 各生成規則の左辺は単一の非終端記号
- 開始記号から書き換え、終端記号だけの列を得る
- 文脈自由は、周囲の記号列を条件にしないという意味
- 構文が合っていても、型や宣言などの確認は別に必要
プログラムの形を、どう決めるの?
書き換え規則を定める。開始記号、非終端記号、終端記号、生成規則が文法の構成要素だよ。非終端はさらに展開する記号、終端は最後に残る記号。そこから、どんな列を作れるかを考える。
「文脈自由」って、前後を無視して読むの?
入力の順番を無視する意味ではない。規則の左辺が単一の非終端記号で、その周囲の記号列に関係なく置き換えられるという意味だよ。規則に従って作られる列には、順序や構造がある。
簡単な例で見たい!
開始を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と略します。単一の非終端記号に適用する規則で、その前後にある記号列を適用条件にしません。