形式言語理論では、文脈自由文法Gは、その生成規則がすべて次の形式である場合、チョムスキー標準形(ノーム・チョムスキーによって最初に記述された)[ 1 ]であると言われます。[ 2 ] [ 3 ]
ここで、 A、B、Cは非終端記号、文字aは終端記号(定数値を表す記号)、Sは開始記号、εは空文字列を表す。また、BもCも開始記号にはなり得ず、3番目の生成規則は、εが文脈自由文法Gによって生成される言語L ( G )に含まれる場合にのみ出現する。[ 4 ]: 92-93、106
チョムスキー標準形の文法はすべて文脈自由であり、逆に、すべての文脈自由文法は、チョムスキー標準形であり、元の文法のサイズの二乗以下のサイズを持つ同等の文法に変換できます[注1 ]。
文法をチョムスキー標準形に変換するには、一連の単純な変換を特定の順序で適用します。これは、オートマトン理論に関するほとんどの教科書に記載されています。[ 4 ]: 87-94 [ 5 ] [ 6 ] [ 7 ] ここでの説明は、Hopcroft、Ullman(1979)に従いますが、Lange、Leiß(2009)の変換名を使用するように調整されています。[ 8 ] [注2 ]以下の各変換は、チョムスキー標準形に必要な特性の1つを確立します。
新しい開始記号S0と新しいルールを導入する
ここで、Sは前の開始記号です。これは文法によって生成される言語を変更するものではなく、S 0はどの規則の右辺にも出現しません。
各ルールをなくすために
終端記号a が右辺の唯一の記号ではない場合、そのような終端記号ごとに新しい非終端記号N aと新しい規則を導入する。
すべてのルールを変える
に
右辺に複数の終端記号が出現する場合は、それぞれを対応する非終端記号に同時に置き換える。これにより、文法が生成する言語は変更されない。[ 4 ]: 92
各ルールを置き換える
2つ以上の非終端記号X 1 ,..., X nを持つ規則
ここで、A iは新しい非終端記号である。繰り返しになるが、これは文法が生成する言語を変更するものではない。[ 4 ]: 93
εルールは、次の形式のルールです。
ここで、 Aは文法の開始記号であるS0ではない。
この形式の規則をすべて排除するには、まずεを導出するすべての非終端記号の集合を決定します。HopcroftとUllman(1979)は、このような非終端記号をnullableと呼び、次のように計算します。
各ルールを置き換えることで中間文法を取得する
一部null許容X iを省略した全てのバージョンによる。この文法において、左辺が開始記号でない限り、各ε規則を削除することにより、変換された文法が得られる。[ 4 ]: 90
例えば、開始記号S 0の次の文法では、
非終端記号AおよびBは空文字可能だが、CもS 0も空文字可能ではない。したがって、次の中間文法が得られる。[注 3 ]
この文法では、すべてのε規則が「呼び出し箇所にインライン化」されています。 [注4 ] したがって、次のステップではそれらを削除することができ、次の文法が得られます。
この文法は、元の文法例と同じ言語を生成します。 { ab、aba、abaa、abab、abac、abb、abc、b、ba、baa、bab、bac、bb、bc、c } ですが、ε 規則はありません。
単位ルールは、次の形式のルールです。
ここで、A、Bは非終端記号です。それを削除するには、各ルールについて
ここで、 X 1 ... X nは非終端記号と終端記号の文字列であり、ルールを追加します。
これは既に削除された(または削除されつつある)単位規則でない限り、結果として得られる文法で非終端記号Bをスキップすることは、 B が非終端記号Aの単位閉包のメンバーであるため可能である。[ 9 ]
上記の変換を適用する順序を選択する際には、一部の変換が他の変換によって得られた結果を損なう可能性があることを考慮する必要があります。たとえば、STARTをUNITの後に実行すると、ユニットルールが再導入されます。表には、許容される順序が示されています。
さらに、文法サイズの最悪の場合の膨張[注5 ]は変換順序に依存します。| G |を元の文法Gのサイズを表すとすると、最悪の場合のサイズ膨張は、使用される変換アルゴリズムに応じて、 | G | 2から22 |G|の範囲になる可能性があります。 [ 8 ] : 7文法サイズの膨張は、DELとBINの順序に依存します。DELが最初に行われる場合は指数関数的になる可能性がありますが、それ以外の場合は線形です。UNITは、文法のサイズの二次膨張を引き起こす可能性があります。[ 8 ] : 5 START、TERM、BIN、DEL、UNITおよびSTART、BIN、DEL、UNIT、TERMの順序は、最小の(つまり二次の)膨張につながります。

以下の文法は、開始記号Exprで始まり、 CやAlgol60などのプログラミング言語における構文的に有効な算術式の集合を簡略化したものです。ここでは、数値と変数は簡略化のために終端記号として扱われます。これは、コンパイラのフロントエンドでは、通常、それらの内部構造がパーサーによって考慮されないためです。終端記号 "^" は、Algol60 におけるべき乗を表していました。
上記の変換アルゴリズムのステップ「START」では、文法にルールS 0 → Exprが追加されます。ステップ「TERM」の後、文法は次のようになります。
ステップ「BIN」の後、以下の文法が得られます。
ε規則が存在しないため、ステップ「DEL」では文法は変化しません。ステップ「UNIT」の後、チョムスキー標準形である以下の文法が得られます。
ステップ「TERM」で導入されるN aは、PowOp、Open、およびCloseです。ステップ「 BIN」で導入されるA iは、 AddOp_Term、MulOp_Factor、PowOp_Primary、およびExpr_Closeです。
チョムスキー標準形を定義する別の方法[ 4 ]: 92 [ 10 ]は次のとおりです。
形式文法がチョムスキー縮約形であるとは、その生成規則がすべて次の形式である場合をいう。
どこ、そしては非終端記号であり、は終端記号です。この定義を使用する場合、またはは開始記号である可能性があります。空文字列を生成しない文脈自由文法のみが、チョムスキー縮約形に変換できます。
ドナルド・E・クヌースは、バックアス・ナウア記法(BNF)という用語を提案した手紙の中で、 BNFの「すべての定義がそのような形式を持つ構文は『フロイド標準形』であると言える」と示唆した。
どこ、そしては非終端記号であり、は終端記号である。なぜなら、ロバート・W・フロイドは1961年に、任意のBNF構文を上記の構文に変換できることを発見したからである。 [ 11 ] しかし彼はこの用語を取り下げた。「疑いなく多くの人々が独自にこの単純な事実を自分の研究で使用しており、この点はフロイドのメモの主な考察とは付随的なものにすぎないからである。」[ 12 ]フロイドのメモはチョムスキーの1959年の原著論文を引用しているが、クヌースの手紙は引用していない。
理論的な意義に加えて、CNF変換は、例えば文脈自由文法のボトムアップ構文解析であるCYKアルゴリズムやその変種である確率的CKYなど、いくつかのアルゴリズムで前処理ステップとして使用されています。[ 13 ]
{{cite book}}: CS1メンテナンス: アーカイブサービスは非推奨になりました (リンク){{cite book}}: CS1 maint: 数値名: 著者リスト (リンク) (セクション 7.1: チョムスキー標準形の 171-183 ページ)