オートマトンの正規表現と文法の違い


12

オートマトンは初めてで、昨日だけ正規表現の簡単な紹介を受けました。正規表現を定義するさまざまなルールを読みました。しかし、正規表現と言語の文法を区別することはできません(正規表現の文法は教えられていません)。

文法は言語で有効な文字列を生成するのに役立つことを理解していますが、それが正規表現を定義するためのルールの状態です。それで、違いはどこにありますか?教授に聞いたところ、彼は正規表現は言語の最も基本的な文字列であり、文法はあらゆる言語の規則のセットであり、正規表現よりも高次であると言った。誰かがさらに詳細な情報を提供できますか?

回答:


22

正規表現、正規文法、および有限オートマトンは、同じものに対する3つの異なる形式です。それらのいずれかから他に変換するアルゴリズムがあります。

3つすべてを持っている基本的な理由は、それらが独立して作成され、Kleeneによって証明された同値の最初のセット(他にもいくつかの形式があります)です(この結果、またはその一部はKleeneの定理と呼ばれます)。

したがって、そのコンテキストでは、モデルを実行する方法に応じて、すべて通常の言語の文字列を認識または生成します。数学的には、その意味で違いはありません。

もちろん、形式の詳細のために、特定のタスクに対して1つのモデルが別のモデルよりも使いやすい場合があります。さらに、人間の頭の中でのそれらの働き方は、コンピューターのような有限オートマトンの「感じ」、小さな部分文字列からストリングを構築しているように正規表現の「感じ」、より伝統的な文法のような「感じ」がしばしば異なる言語の文の派生または分類(当然ながら歴史を見ると)。

2つを比較するために、それらを定義しましょう:

正規表現

そのため、正規表現は次のように再帰的に定義されます。

  1. は正規表現です∅
  2. は正規表現ですε
  3. すべてのための正規表現です ∈ Σaa∈Σ
  4. 場合はとBは正規表現ですその後、 AB
    • 正規表現(concatentation)でありますA⋅B
    • は正規表現(代替)ですA∣B
    • は正規表現です(Kleene star)A∗

いくつかのセマンティクス(つまり、演算子を解釈して文字列を取得する方法)とともに、通常の言語から文字列を生成する方法を取得します。

通常の文法

正規文法は、4つのタプルから成りNは、非端末の集合であり、Σは、端末の集合であり、Sは開始非終端記号であり、Pは、そのプロダクションの集合であります開始記号を段階的にΣ ∗の文字列に変更する方法を教えてください。Pは、2つのタイプのいずれか(両方ではない)からプロダクションを引き出すことができます。(N,Σ,P,S∈N)NΣSPΣ∗P

右線形文法

非端末、C、端末aおよび空の文字列εの場合、すべての規則は次の形式になります。BCaε

  1. B→a
  2. B→aC
  3. B→ε

左線形文法

左線形文法は同じですが、ルール#2はです。B→Ca

熟考すること

したがって、これらの定義を見て、それらを試してみると、正規表現が一致ルールのように見えるか、文字列を少しずつ処理する方法に見えることがわかります。

文法は文字列のセクションを「ラベル付け」し、新しいラベルの下にラベルをグループ化して文字列を検証するように見えます(つまり、から文字列へ、またはその逆に到達できれば幸いです)。S

ただし、これらは実際に同じ基本的なことを行っており、それらの機能のメタファーをどのように表示するかは、本当にあなた次第です。


文法が言語の文字列を生成するという事実にもっと重点を置きますが、正規表現(あなたが言ったように)は、言語のすべての文字列に一致する(または「テスト」する)一致パターンです。
— ランG.

@RanG。、それは確かにそれを考えるための通常の方法ですが、あなたは両方を反転させることができます。ボトムアップ解析では、文字列を文法と照らし合わせてテストし、正規表現を言語のコンパクトな記述として使用できます(おそらくこれはあまり一般的ではありませんが)。
— ルークマティソン

NSR

NRRP

@simpleBob、ああ、それは間違いなくタイプミスです。ありがとう!
— ルーク・マシソン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.