文脈自由文法とは何かを誰かが私に説明できますか?ウィキペディアのエントリを見てから、公式文法のウィキペディアのエントリを見て、私は完全に困惑しました。誰かがこれらのことを説明するほど親切になるでしょうか?
私はこれを不思議に思っています。なぜなら、構文解析を調査したいのですが、一方で、正規表現エンジンの制限も調査したいからです。
これらの用語が直接プログラミングに関連しているのか、それとも一般的な言語学に関連しているのかはわかりません。もしそうなら、私は謝罪します。もしそうなら、おそらくこれは移動できますか?
文脈自由文法は、特定の特性を満たす文法です。コンピューターサイエンスでは、文法は言語を表します。具体的には、正式な言語を記述します。
正式な言語は、一連の文字列(オブジェクトの集合を表す数学用語)であり、一連の記号(Wordの「文字列」のプログラミング使用法に非常に類似した記号のシーケンス)です。正式な言語の簡単な例は、長さ3のすべてのバイナリ文字列のセット、{000、001、010、011、100、101、110、111}です。
文法は、文法で記述された言語で文字列を作成するために行うことができる変換を定義することにより機能します。文法では、開始記号(通常はS)を記号の文字列に変換する方法を説明します。前述の言語の文法は次のとおりです。
S -> BBB
B -> 0
B -> 1
これを解釈する方法は、S
をBBB
に、B
を0に、B
を1.したがって、文字列010を作成するには、S -> BBB -> 0BB -> 01B -> 010
。
文脈自由文法とは、単に置き換えるもの(矢印の左)が単一の「非終端」記号である文法です。非終端記号は、文法で使用する記号で、最終的な文字列には表示されません。上記の文法では、「S」と「B」は非終端記号であり、「0」と「1」は「終端」記号です。文法が好き
S -> AB
AB -> 1
A -> AA
B -> 0
「AB-> 1」のようなルールが含まれているため、規則的ではありません。
言語理論は計算理論に関連しています。どちらのプログラムが可能か、どのプログラムを書くことができるか、そして解決するアルゴリズムを書くことは不可能な問題のタイプを決定することについて、コンピューターサイエンスのより哲学的な側面です。
正規表現は、正規言語を記述する方法です。通常言語とは、決定論的な有限オートマトンによって決定できる言語です。
有限状態マシンに関する記事を読む必要があります。 http://en.wikipedia.org/wiki/Finite_state_machine
通常の言語: http://en.wikipedia.org/wiki/Regular_language
すべての通常言語はコンテキストフリー言語ですが、通常ではないコンテキストフリー言語もあります。 Context Free Languageは、Context Free Grammerまたはプッシュダウンオートマタによって受け入れられるすべての文字列のセットです。プッシュダウンオートマトンは、単一のスタックを持つ有限状態マシンです。 http://en.wikipedia.org/wiki/Pushdown_automaton#PDA_and_Context -free_Languages
文字列が言語内にあるかどうかを判断するためにチューリングマシン(コンピューターで作成できる任意のプログラム)を必要とするより複雑な言語があります。
言語理論は、P vs. NP問題、およびその他の興味深いものにも非常に関連しています。
私のコンピューターサイエンス入門3年目の教科書は、このことを説明するのにかなり優れていました:計算理論入門。マイケル・シプサー。しかし、新しいものを買うのに160ドルほどかかりました。それほど大きくはありません。たぶん、あなたは使用済みのコピーを見つけるか、図書館でコピーを見つけることができます。
編集:
正規表現と高等言語クラスの制限は、過去50年ほどにわたって研究されてきました。通常の言語のポンピング補題に興味があるかもしれません。特定の言語が規則的ではないことを証明する手段です。
http://en.wikipedia.org/wiki/Pumping_lemma_for_regular_languages
言語が正規ではない場合、Context Freeである可能性があります。つまり、Context Free Grammerで記述できるか、またはより高い言語クラスである場合でも、Context FreeのポンピングレンマによってContext Freeではないことを証明できます。正規表現の言語に似た言語。
言語は決定不能な場合もあります。つまり、チューリングマシン(コンピューターで実行できるプログラム)でさえ、文字列をその言語のように受け入れるか拒否するかを決定するようにプログラムできません。
最も興味があるのは、正規表現が決定できる言語を確認する有限状態機械(決定論的および決定論的)と、どの言語が正規でないかを証明するポンピング補題です。
基本的に、ある種のメモリまたはカウントする能力が必要な場合、言語は規則的ではありません。たとえば、括弧を閉じる必要があるかどうかを知るために、機械は括弧を開いたかどうかを記憶する必要があるため、一致する括弧の言語は規則的ではありません。
少なくとも3つのbを含む文字aおよびbを使用するすべての文字列の言語は、通常の言語です:abababa
Aよりもbを多く含む文字aおよびbを使用するすべての文字列の言語は、規則的ではありません。
また、次のように、すべての有限言語が規則的であるとは限りません
Aよりもbを多く含む文字aおよびbを使用した50文字未満のすべての文字列の言語は、(b | abb | bab | bba | aabbb | ababb |。 ..)すべての可能な組み合わせがリストされるまでect。