
形式文法とは、記号の集合と、それらの記号の一部をアルファベット上の形式言語のあらゆる可能な文字列に書き換えるための生成規則の集合である。文法は文字列の意味を記述するものではなく、その形式のみを記述する。
応用数学において、形式言語理論は形式文法と形式言語を研究する学問分野である。その応用分野は、理論計算機科学、理論言語学、形式意味論、数理論理学など多岐にわたる。
形式文法は、文字列を書き換えるための規則の集合であり、書き換えを開始する「開始記号」も含まれています。そのため、文法は通常、言語生成器として考えられています。しかし、文法は、与えられた文字列がその言語に属するか、文法的に誤りであるかを判断するコンピューティング機能であるパーサーの基礎としても使用できます。このようなパーサーを記述するために、形式言語理論では、オートマトン理論として知られる別の形式体系を使用します。オートマトン理論の結果の1つは、特定の形式言語の認識器を設計することができないということです。[ 1 ]
多くの言語では、文字列の意味が構文に基づいて構造化されています。これは構成的意味論と呼ばれる手法です。このような場合、文字列の意味を記述する最初のステップは、文字列を部分ごとに分解し、その解析された形式(コンピュータサイエンスでは構文解析木、生成文法では深層構造と呼ばれる)を調べることです。
文法は主に、文字列を変換するための生成規則、つまり書き換え規則の集合から構成されます。各規則は、特定の文字列(その左辺)を別の文字列(その右辺)に置き換えることを指定します。規則は、その左辺を含むすべての文字列に適用でき、その結果、左辺の出現箇所が右辺に置き換えられた文字列が生成されます。
これらの規則によって完全に定義されるセミ・テュー体系とは異なり、文法はさらに2種類の記号、すなわち非終端記号と終端記号を区別します。各左辺には少なくとも1つの非終端記号が含まれていなければなりません。また、開始記号と呼ばれる特別な非終端記号も区別します。
文法によって生成される言語は、単一の開始記号からなる文字列から、その規則を(場合によっては繰り返し)適用することによって生成できる、非終端記号を含まないすべての文字列の集合として定義される。同一の単一の文字列を生成する方法が本質的に複数存在する場合、その文法は曖昧であると言われる。
以下の例では、終端記号はaとbであり、開始記号はSです。
次のような生成ルールがあると仮定します。
次に、 Sから始め、それに適用するルールを選択します。ルール 1 を選択すると、文字列aSbが得られます。次に、再びルール 1 を選択すると、S がaSbに置き換えられ、文字列aaSbbが得られます。次に、ルール 2 を選択すると、 S がbaに置き換えられ、文字列aababbが得られ、処理は完了です。この一連の選択を、記号を使ってより簡潔に記述できます。。
文法の言語は無限集合である、 どこは繰り返し回数(そして特に、 は生成規則 1 が適用された回数を表します。この文法は文脈自由(左辺には単一の非終端記号のみが現れる)で、曖昧さがありません。
ルールが代わりに以下のようになっていると仮定しましょう。
この文法は、規則 3 により文脈自由ではなく、規則 2 がシーケンスを生成するために使用できる複数の方法により曖昧です。s.
しかし、生成される言語は、単に空でない文字列の集合であり、s および/またはs。これは簡単にわかります。からルール2を2回使用して生成しますルール1を2回、ルール3を1回適用してこれは、任意の空でないシーケンスを生成できることを意味します。s を s に置き換え、それぞれを s に置き換えます。または我々の好きなように。
同じ言語は、文脈に依存しない、曖昧さのない文法によっても生成できる。例えば、規則を持つ正規文法などである。
1950年代にノーム・チョムスキーによって最初に提案された生成文法の古典的な形式化では、 [ 2 ] [ 3 ]文法Gは次の要素から構成されます。
文法は正式にはタプルとして定義される。このような形式文法は、文献では書き換えシステムまたは句構造文法と呼ばれることが多い。 [ 5 ] [ 6 ]
文法の動作は、文字列上の関係によって定義できる。
文法実質的にはセミ・トゥーシステム文字列の書き換えは全く同じ方法で行われます。唯一の違いは、書き換えルールで置換する必要のある特定の非終端記号を区別し、指定された開始記号からの書き換えのみに関心がある点です。非終端記号を含まない文字列に変換します。
これらの例では、形式言語は集合構成記法を用いて指定されます。
文法を考慮するどこ、、は開始記号であり、以下の生成ルールで構成されます。
この文法は言語を定義するどこn 個の連続する文字列を表す's。したがって、言語は 1 個以上の文字列の集合です。の後に同じ数のの後に同じ数のの。
文字列の派生の例をいくつか挙げますは:
ノーム・チョムスキーが1956年に生成文法を初めて形式化したとき、 [ 2 ]彼はそれらを現在チョムスキー階層として知られるタイプに分類しました。これらのタイプの違いは、生成規則がますます厳格になり、そのため表現できる形式言語が少なくなることです。重要な2つのタイプは、文脈自由文法(タイプ2)と正規文法(タイプ3)です。このような文法で記述できる言語は、それぞれ文脈自由言語と正規言語と呼ばれます。チューリングマシンが受け入れ可能なあらゆる言語を表現できる無制限文法(タイプ0)に比べるとはるかに強力ではありませんが、これらの2つの制限付き文法は、それらのパーサーを効率的に実装できるため、最もよく使用されます。[ 8 ]例えば、すべての正規言語は有限状態機械で認識でき、文脈自由文法の有用な部分集合については、それらの文法が生成する対応する言語を認識する効率的なLLパーサーとLRパーサーを生成するよく知られたアルゴリズムがあります。
文脈自由文法とは、各生成規則の左辺が単一の非終端記号のみで構成される文法のことである。この制約は自明ではなく、すべての言語が文脈自由文法で生成できるわけではない。生成可能な言語は文脈自由言語と呼ばれる。
言語上記で定義された言語は文脈自由言語ではなく、これは文脈自由言語のポンピング補題を用いて厳密に証明できるが、例えば言語は(少なくとも1つ)続いて同じ数の's) は文脈自由であり、文法によって定義できますと、、開始記号、および以下の生成ルール:
文脈自由言語は、アーリーの認識器などのアルゴリズムでは時間(ビッグオー記法を参照)で、高速行列乗算アルゴリズムでは3乗未満の時間で実現できます。[ 9 ]つまり、あらゆる文脈自由言語に対して、文字列を入力として受け取り、時間で決定する機械を構築できます。文字列が言語のメンバーであるかどうかの時間、は文字列の長さです。[ 10 ]決定論的文脈自由言語は、線形時間で認識できる文脈自由言語のサブセットです。[ 11 ]この言語の集合またはそのサブセットを対象とするさまざまなアルゴリズムが存在します。
正規文法では、左辺は再び単一の非終端記号のみで構成されますが、今度は右辺にも制限が課されます。右辺は空文字列、単一の終端記号、または単一の終端記号の後に非終端記号が続く形式のいずれかであり、それ以外は許容されません。(より広い定義が用いられる場合もあり、より長い終端記号の列や、他の記号を含まない単一の非終端記号の列を許容することで、同じ言語クラスを定義しつつ、言語の表記を容易にすることができます。)
言語上記で定義した言語は正規言語ではなく、(少なくとも1つ)少なくとも1つが続く(数字は異なる場合がある)は、文法によって定義できるとおりである。と、、開始記号、および以下の生成ルール:
正規文法によって生成されたすべての言語は認識できます有限状態機械による時間。実際には、正規文法は一般的に正規表現を使用して表現されますが、実際に使用されている正規表現の形式の中には、厳密には正規言語を生成しないものもあり、そのような逸脱のために線形認識性能を示さないものもあります。
チョムスキーの形式文法の階層構造に対する多くの拡張や変形が、言語学者とコンピュータ科学者の両方によって開発されてきた。その目的は、通常、表現力を高めるため、あるいは分析や構文解析を容易にするためである。開発された文法の形式には、以下のようなものがある。
再帰文法とは、再帰的な生成規則を含む文法のことです。たとえば、文脈自由言語の文法は、非終端記号Aが存在し、それを生成規則に通してAを左端の記号とする文字列を生成できる場合、左再帰的であると言えます。[ 16 ]再帰文法の例としては、2 つのコンマで区切られた文中の節が挙げられます。[ 17 ]チョムスキー階層のすべてのタイプの文法は再帰的になり得ます。
構文解析アルゴリズムに関する文献は膨大に存在するが、これらのアルゴリズムのほとんどは、解析対象の言語が生成形式文法によって最初に記述され、その生成文法を動作する構文解析器に変換することを目標としている。厳密に言えば、生成文法は言語を解析するために使用されるアルゴリズムとは全く異なるものであり、様々なアルゴリズムは、整形式とみなされる生成規則の形式に関して異なる制約を持っている。
別の方法としては、まず言語を解析文法で形式化するというものがあり、これは言語の構文解析器の構造と意味論により直接的に対応する。解析文法の形式化の例としては、以下のようなものがある。