形式文法
[Wikipedia|▼Menu]

形式文法(けいしきぶんぽう、Formal Grammar)は、形式的に与えられた(形式体系を参照)文法である。「言語」をその言語における文の集合として与えるものとして、ここでは、(有限の)文字群上の有限長の文字列の(通常無限な)集合が、形式的に記述される。「形式言語」も参照

形式文法にはふたつの捉えかたがある。それは「生成」と「分析」である。#チョムスキー階層の節および単独記事に詳細があるが、両者は対応するので、ある意味では同じものをそれぞれ逆の側から見たものにすぎない。

以下で「文法の規則(構文規則)の集まり」と呼んでいるのは、具体的には、句構造規則#基本モデルにあるようなものである。また終端記号と非終端記号の記事も参照のこと。

生成文法(Generative grammar)は、文法の規則(構文規則)の集まりを「トップレベルの非終端記号(たとえば <文>)から始めて、右辺に書き換える書き換え規則を適用していくことによって言語の文字列を生成することができる規則の集まり」と見るものである。

分析的文法(Analytic grammar)は、文法の規則(構文規則)の集まりを「任意の終端記号列に対し、パターンが一致すれば右辺から左辺に書き換え規則が適用できる規則の集まりであり、最終的にトップレベルの非終端記号(たとえば <文>)が得られれば受理されたとして、入力の列がその言語に含まれるか否かを判定できるもの」と見るものである。

生成文法は、ある言語に含まれる文字列を生成するアルゴリズムを定式化するもの、分析的文法は、ある言語に含まれる文字列を構文解析し受理するアルゴリズムを定式化するもの、とも言える(この2者への分類は、構文解析の手法の分類の、トップダウン構文解析ボトムアップ構文解析といくぶんかまぎらわしい。実際に、トップダウン構文解析は流れとして左辺から右辺への書換えとなっている点は生成的であるのに対し、一方のボトムアップ構文解析は右辺から左辺への「還元」(reduce)を主要な動作とする点で分析的である。しかし、どちらも構文解析を目的とするという点では、分析的文法にあたる)。
生成文法詳細は「生成文法」を参照

生成文法は文字列変換規則の集まりである。ある言語の文字列を生成するには、まずひとつの「開始」文字だけから成る文字列から始めて、規則を適当な回数適用して文字列を書き換えていく。逆に言えば、その言語はその規則群によって生成される全文字列を含む。ある規則の組み合わせで生成された文字列について、別の規則の適用の仕方でも同じ文字列が生成できる場合、その文法は曖昧であると言う。

たとえば、' a {\displaystyle a} ' と ' b {\displaystyle b} ' から成る文字セットがあり、開始記号 ' S {\displaystyle S} ' に対して以下の規則を適用するものとする。1. S ⟶ a S b {\displaystyle S\longrightarrow aSb} 2. S ⟶ b a {\displaystyle S\longrightarrow ba}

そこで、" S {\displaystyle S} " から開始して、適用する規則を選んでいくことができる。規則1を選ぶと、開始記号 ' S {\displaystyle S} ' から ' a S b {\displaystyle aSb} ' に変換されるので " a S b {\displaystyle aSb} " が得られる。再度規則1を選ぶと、' S {\displaystyle S} ' が ' a S b {\displaystyle aSb} ' に変換されるので全体として " a a S b b {\displaystyle aaSbb} " となる。この過程は最終的に本来の文字セット(つまり ' a {\displaystyle a} ' と ' b {\displaystyle b} ')だけから構成される文字列になるまで続けられる。さて、終了させるために規則2を適用すると ' S {\displaystyle S} ' が ' b a {\displaystyle ba} ' に変換されるので、最終的に " a a b a b b {\displaystyle aababb} " を得る。この過程をまとめると S ⟶ a S b ⟶ a a S b b ⟶ a a b a b b {\displaystyle S\longrightarrow aSb\longrightarrow aaSbb\longrightarrow aababb} となる。この文法による言語はこのような過程で生成される全文字列 { b a , a b a b , a a b a b b , a a a b a b b b , . . . } {\displaystyle \left\{ba,abab,aababb,aaababbb,...\right\}} を含む。
形式的定義

生成文法の定式化は1950年代ノーム・チョムスキーによって最初に提案された[1][2]。文法 G は以下の構成要素から成る。

非終端記号」の有限集合 N {\displaystyle N} 。

終端記号」の有限集合 Σ {\displaystyle \Sigma } 。 N {\displaystyle N} とは共通の元を持たない。

「生成規則」の有限集合 P {\displaystyle P} 。各生成規則は以下のような形式である。
( Σ ∪ N ) ∗ {\displaystyle (\Sigma \cup N)^{*}} 内の文字列 ⟶ ( Σ ∪ N ) ∗ {\displaystyle \longrightarrow (\Sigma \cup N)^{*}} 内の文字列(ここで ∗ {\displaystyle {}^{*}} はクリーネスターであり、 ∪ {\displaystyle \cup } は和集合であり) ⟶ {\displaystyle \longrightarrow } の左側には少なくともひとつ以上の非終端記号を含まなければならない。

N {\displaystyle N} 内の記号 S {\displaystyle S} は「開始記号」である。

一般にこのような形式文法 G {\displaystyle G} は 4要素 ( N , Σ , P , S ) {\displaystyle (N,\Sigma ,P,S)} で要約される。

形式文法 G = ( N , Σ , P , S ) {\displaystyle G=(N,\Sigma ,P,S)} の言語は L ( G ) {\displaystyle {\boldsymbol {L}}(G)} と記述され、開始記号 S {\displaystyle S} に P {\displaystyle P} の規則を非終端記号が無くなるまで適用して得られる( Σ {\displaystyle \Sigma } 内の文字から構成される)全ての文字列として定義される。

以下の例では、形式言語集合の内包的記法で記述している。

N = { S , B } {\displaystyle N=\left\{S,B\right\}} , Σ = { a , b , c } {\displaystyle \Sigma =\left\{a,b,c\right\}} の文法 G {\displaystyle G} について、生成規則 P {\displaystyle P} が以下の規則から構成される。1. S ⟶ a B S c {\displaystyle S\longrightarrow aBSc} 2. S ⟶ a b c {\displaystyle S\longrightarrow abc} 3. B a ⟶ a B {\displaystyle Ba\longrightarrow aB} 4. B b ⟶ b b {\displaystyle Bb\longrightarrow bb}

また、非終端記号 S {\displaystyle S} は開始記号である。 L ( G ) {\displaystyle {\boldsymbol {L}}(G)} における文字列生成の実例は以下のようになる。

S ⟶ ( 2 ) a b c {\displaystyle {\boldsymbol {S}}\longrightarrow (2)abc}

S ⟶ ( 1 ) a B S c ⟶ ( 2 ) a B a b c c ⟶ ( 3 ) a a B b c c ⟶ ( 4 ) a a b b c c {\displaystyle {\boldsymbol {S}}\longrightarrow (1)aB{\boldsymbol {S}}c\longrightarrow (2)a{\boldsymbol {Ba}}bcc\longrightarrow (3)aa{\boldsymbol {Bb}}cc\longrightarrow (4)aabbcc}

S ⟶ ( 1 ) a B S c ⟶ ( 1 ) a B a B S c c ⟶ ( 2 ) a B a B a b c c c ⟶ ( 3 ) a a B B a b c c c ⟶ ( 3 ) a a B a B b c c c {\displaystyle {\boldsymbol {S}}\longrightarrow (1)aB{\boldsymbol {S}}c\longrightarrow (1)aBaB{\boldsymbol {S}}cc\longrightarrow (2)a{\boldsymbol {Ba}}Babccc\longrightarrow (3)aaB{\boldsymbol {Ba}}bccc\longrightarrow (3)aa{\boldsymbol {Ba}}Bbccc} ⟶ ( 3 ) a a a B B b c c c ⟶ ( 4 ) a a a B b b c c c ⟶ ( 4 ) a a a b b b c c c {\displaystyle \longrightarrow (3)aaaB{\boldsymbol {Bb}}ccc\longrightarrow (4)aaa{\boldsymbol {Bb}}bccc\longrightarrow (4)aaabbbccc}

(カッコ内の番号は適用した生成規則の番号であり、変換された部分がボールド体で示されている。)

以上のようにこの言語は、 { a n b n c n 。 n > 0 } {\displaystyle \left\{a^{n}b^{n}c^{n}|n>0\right\}} という形式を表している( a n {\displaystyle a^{n}} は n 個の a {\displaystyle a} が並んだ文字列を意味する)。従って、この言語は正数個の 'a' を含み、その後に同じ個数の 'b' とさらに同じ個数の 'c' を並べた全ての文字列から構成される。

生成的形式文法はリンデンマイヤーシステム(Lシステム)と等価であるが、相違点もある。


次ページ
記事の検索
おまかせリスト
▼オプションを表示
ブックマーク登録
mixiチェック!
Twitterに投稿
オプション/リンク一覧
話題のニュース
列車運行情報
暇つぶしWikipedia

Size:31 KB
出典: フリー百科事典『ウィキペディア(Wikipedia)
担当:undef