文脈自由文法への正規表現


7

特定の正規表現を生成する文脈自由文法を直接書くためのアルゴリズムがあるかどうか誰でも知っていますか?


5
「a *(a | b)」のような有効な正規表現文字列を生成するCFGが必要ですか、それとも正規表現「a *(a | b)」が指定された「aaaaab」のような文字列を生成するCFGが必要ですか?
Alex ten Brink

回答:


9

与えられた正規表現と同じ言語を生成する文法を取得したいと思います。

これは、次の手順で実現できます。

  1. 正規表現をNFAに変換します。
  2. NFAを(正しい)正規の文法に変換します。

どちらの翻訳も標準であり、正式な言語とオートマトンに関する基本的な教科書でカバーされています。通常の文法も文脈自由であることに注意してください。


はい、私の答えよりも優れています。
Hendrik Jan

4

はい。詳細は明記せずに、おおまかな答えを示します。

まず、式を解析する必要があります。これは、単純な再帰的なまともなパーサーを使用して行うことができます。ウェブ上のいくつかの例。

次に、再帰から戻るときに、「セマンティック」ルールをパーサーに追加する必要があります。これらは、あらゆる正式な言語理論コースの標準です。もしS1 そして S2 式を生成する非ターミナルです E1 そして E2 次に、生成できます E1+E2 沿って S とルール SS1SS2。連結を生成できますE1E2 沿って S とルール SS1S2E1 沿って S とルール SS1SSλ。毎回新しい非ターミナルを選択すると仮定します。


1

以前の回答と同様に、与えられた正規表現と同じ言語を生成する文法を取得したいと思います r

文脈自由文法を構築するための再帰的アルゴリズム GL(G)=L(r) 次のようになります:

  • もし r=、プロダクションルールのない文法を出力します(または SS ルールが必要な場合)。
  • もし r=Λ、出力 SΛ
  • もし r=a (式は1文字のみ)、出力 Sa
  • もし r=ab (和集合、+または|とも表記):素な文法を構築 a そして b 開始記号付き Sa そして Sb、それらを組み合わせて追加 SSaSb
  • もし r=lr (連結、また、 ):互いに素な文法を構築する l そして r 開始記号付き Sl そして Sr、それらを組み合わせて追加 SSlSr
  • もし r=x (クリーネスター):文法を構築する x スタートシンボル付き Sx そして追加 SSxSΛ

これは本質的にヘンドリックの回答と同等ですが、より詳細な情報が役立つ場合があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.