2009-07-22 3 views
6

私はまだコンピュータサイエンスの形式言語の分野には入っていないので、多分私の質問は馬鹿です。パーサージェネレーターを使うとき、正規表現はいつ十分ですか?

私の最初のアイデアは、単純な有限状態マシンを手作業で構築することでしたが、私は仕事が少なく、より効率的に行うことができたと考えました。 。以前は正規表現を使っていましたが、NMEAの正規表現は非常に長く、それに合わせるのに「長い時間」を要すると思います。

次に、パーサージェネレータを使用することを考えました。私はすべて同じ方法を使用していると思う:彼らはFSAを生成する。しかし、私はどちらがより効率的であるかは分かりません。あなたはいつ正規表現の代わりにパーサージェネレータを使うのですか(私はパーサージェネレータで正規表現を書くことができると思います)?

違いを説明してください、私は理論と経験の両方に興味があります。

答えて

7

簡単に言うと、解析するデータの文法がregularの場合は、正規表現を使用します。そうでない場合、正規表現はまだ動作するかもしれません(ほとんどの正規表現エンジンも非正規文法をサポートしています)が、それは痛いかもしれません(複雑/悪い性能)。

もう1つの点は、解析されたデータを使って何をしようとしているかです。 1つのフィールドだけに興味があるならば、正規表現はおそらく読みやすくなります。深くネストされた構造体を読み込む必要がある場合、パーサーはより保守性が高いでしょう。

4

Regex は、パーサジェネレータです。ウィキペディアから

正規表現(複数形の正規表現、正規表現、またはregexenと、正規表現または正規表現と略す)は、正規表現処理、プログラムが解釈可能な形式言語で記述されていますパーサジェネレータとして機能するか、テキストを調べて、指定された仕様に一致するパーツを識別します。

リストを1回だけ上書きする必要がある場合は、リストをファイルに保存してそこから読んでください。あなたが毎回違うものをチェックしているならば、正規表現を使って結果を配列などに格納します。

これは、想定していたよりもはるかに高速です。私はこのポストよりも大きな表現を見た。

どのような言語でも、あなたが好きなだけ入れ子にすることができます。再利用性を最大限にするために、セクション単位で行うこともできます。

2

Sneakynessが指摘するように、驚くほど強力な大きくて複雑な正規表現を持つことができます。私はこれのいくつかの例を見てきましたが、単なる死者によって維持可能なものはありませんでした。 Expressoを使用しても、あまりにも助かりました。それを理解するのは難しく、変更するのは危険でした。だから、あなたがGrepを固定している野蛮人でなければ、私はこの方向性をお勧めしません。

代わりに、文法に焦点を当てて、compiler compilerにあなたのために重労働をさせることを検討してください。

関連する問題