6

私はまだコンピュータサイエンスの形式言語の分野に慣れていないので、私の質問はばかげているかもしれません。私はC++で単純なNMEAパーサーを書いていますが、次のものを選択する必要があります。

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

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

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

4

3 に答える 3

7

簡単な経験則は次のとおりです。解析しようとしているデータの文法が正規の場合、正規表現を使用します。そうでない場合でも、正規表現は機能する可能性があります (ほとんどの正規表現エンジンは非正規文法もサポートしているため)。

別の側面は、解析されたデータで何をしようとしているのかです。1 つのフィールドだけに関心がある場合は、おそらく正規表現の方が読みやすいでしょう。深くネストされた構造を読み取る必要がある場合は、パーサーの方が保守しやすい可能性があります。

于 2009-07-22T11:35:58.793 に答える
4

正規表現パーサージェネレーターです。

ウィキペディアから:

正規表現 (複数形 regexes、regexps、または regexen で regex または regexp と省略される) は、正規表現プロセッサ (パーサー ジェネレータとして機能するか、テキストを調べて部分を識別するプログラム) によって解釈できる形式言語で記述されます。提供された仕様に一致します。

1 回だけ確認する必要があるリストを調べている場合は、リストをファイルに保存して、そこから読み取ります。毎回違うものをチェックしている場合は、正規表現を使用して結果を配列などに保存します。

あなたが思っているよりもはるかに速いです。この投稿よりも大きな表現を見てきました。

コード化する言語に関係なく、好きなだけネストできることを追加します。再利用性を最大限に高めるために、セクションで行うこともできます。

于 2009-07-22T11:34:23.070 に答える
2

Sneakyness が指摘しているように、驚くほど強力な大きくて複雑な正規表現を使用できます。私はこの例をいくつか見てきましたが、単なる人間が維持できるものはありませんでした. Expressoを使用しても、それほど役に立ちませんでした。理解するのはまだ難しく、変更するのは危険でした。したがって、Grep に固執する知識人でない限り、この方向性はお勧めしません。

代わりに、文法に集中し、コンパイラ コンパイラに面倒な作業を任せることを検討してください。

于 2009-07-22T12:57:01.930 に答える