2009-03-05 23 views
2

[wcw | wはaとbの文字列です] などの繰り返し文字列を正規表現で表すことができないのはなぜですか? pls。私は字句解析を初めて学んだので詳細な答えを教えてください。前半を横断中に取得した情報を保持する方法はありませんので おかげで...それはすることができ正規表現字句解析

+0

ベア。既にかなり良い答えがありますが、あなたはそれを利用するための背景を持っていないかもしれません。 –

+0

それは簡単ではありませんでした。しかし、少なくとも楽しい時もありました。ここでは、最適化だけでなく、解析以外のいくつかのアルゴリズムが含まれています。 背景があまりない人にその投稿を明確にする方法はありますか? -.- – Joey

答えて

5

正規表現は、元の形式で、通常の言語/文法を記述します。これらの言語は単純な有限状態マシンで記述できるため、ネストされた構造を含むことはできません。簡略化すると、言語の各単語が厳密に左から右(または右から左)に伸びるように、反復構造が明示的に定義され、静的でなければならないように描ける。

これは、以前の状態からの情報は、それ以降の状態(入力のさらに数文字)に引き継ぐことができないことを意味します。あなたのシンボルがwの場合、入力は、の文字列が正確に同じ文字列wであることを指定することはできません。同様に、各オープンファンクションにもクローン括弧が必要であることを保証することはできません(正規表現自体も正規言語ではないため、正規表現では記述できません:-))。

理論的な計算機科学では、基本的にシーケンス、代替(|)、繰り返し(*)のみで構成された非常に限定された正規表現演算子で作業しました。

しかし、通常、正規表現エンジンは特定のサブパターンをグループ化し、後で参照または抽出することができます。一部のエンジンでは、検索式文字列自体に逆参照を使用することも許可されているため、正規表現以外の表現も可能です。私が正しく覚えていれば、そのような後方参照の使用は文脈自由ではない言語を生成することさえできます。

追加ポインタ:

  • 解析は、私が大学院(コンパイラI)にかかった最も難しいコースの一つの主題であることを念頭に置いてThis StackOverflowの質問
  • Wikipedia
+0

上記のwcwの例は、私が見ることができる限り文脈自由文法を使って行うことはできませんが(確かにwcwcwならばそうではありませんが)、Perlで簡単に確認できます。 –

2

、あなたはそれが「」sおよび「B」のの同じ文字列だことを保証することはできません第2のトラバースに使用する。

関連する問題