1

私は、パフォーマンス上の理由から、C#ライブラリをC++に移植しています。通常の操作では、このライブラリは、とりわけ、平均長が150文字未満の約150,000の数式(Excelの数式を考えてください)を解析する必要があります。

C#バージョンでは、GOLDパーサーを使用して解析コードを生成しました。1秒以内にすべての150,000式を解析できます。

言語の拡張を考えていたので、C++への移行はANTLRに変更する良いチャンスかもしれないと思いました。(単純な)文法をANTLRに移植し、そこからCコードを生成しました。150,000の式の解析には、12秒以上かかります。これは、式ごとに、新しいANTL3_INPUT_STREAM、トークンストリーム、レクサー、およびパーサーを作成する必要があるためです。少なくともバージョン3.4では、それらを再利用する方法はありません。

誰かが代わりに何を使用するかを私に勧めてくれるとありがたいです-C++またはCコードの生成はC#の種類よりもはるかに複雑に見えますが、GOLDはもちろんオプションです。私の文法はLALRとLL(1)と互換性があります。最も重要な懸念は、小さな入力でのパフォーマンスの解析です。

4

6 に答える 6

9

私はboost::spiritを試してみます。多くの場合、非常に高速です(整数などの単純なものを解析する場合でも、C関数atoi http://alexott.blogspot.com/2010/01/boostspirit2-vs-atoi.htmlよりも高速になる可能性があります)

http://boost-spirit.com/home/

それは素晴らしいものを持っています:ヘッダーのみなので、依存関係地獄、リベラルなライセンス。

ただし、学習曲線は難しいことに注意してください。これは最新のC++(ポインターはありませんが、多くのテンプレートと非常に苛立たしいコンパイルエラー)であるため、CまたはC#から来ると、あまり快適ではない可能性があります。

于 2011-12-02T12:25:56.920 に答える
4

解析する文法が単純な場合は、パーサーを手動で記述するだけです。

ほとんどのパーサージェネレーターは、動作中のパーサーを簡単に作成できるように設計されており、その結果、実行時間が長くなることがよくあります。

于 2011-12-02T12:30:53.367 に答える
3

解析で私が見た中で最高のパフォーマンスは、メタテンプレートプログラミングを使用してC++で文法を表現するBoost.Spirit.Qiからのものでした。しかし、それは心の弱い人のためではありません。

これは十分に絶縁されている必要があり、パーサーを含むファイルのコンパイル時間は数秒に増加します(したがって、そこにできるだけ少ないことを確認してください)。

于 2011-12-02T12:24:07.597 に答える
2

式の構文が十分に単純な場合は、手書きの再帰下降パーサーを作成することを検討してください。非常に高速に実行でき、(十分な注意を払って)構文エラーを適切かつ具体的に報告する機能を提供します。

バイソンを使用することもできますが、手書きの再帰下降パーサーの方がおそらく高速になると思います。

また、フレックスで生成されたレクサーを使用して字句解析を実行し、再帰下降方式で手動で構文解析を実行できます。

参考までに、GCCコンパイラには、少なくともC++およびC用の独自の再帰下降パーサーがあります。パーサジェネレータ(bisonANTLRなど)は使用されなくなりました。

于 2011-12-02T12:31:25.147 に答える
1

expr文法に認識させる代わりにsequence-of-expr

編集:

(バイソン構文)を持つ代わりに:

start: expr { process_expr ($1); }
     ;

持ってる:

start: expr_seq ;

expr_seq:   expr          { process_expr ($1); }
          | expr_seq expr { process_expr ($2); }
          ;
于 2011-12-02T12:22:07.563 に答える
1

私は多くのパーサーを作成しましたが、手書きの再帰下降がその方法です。それらは書くのが簡単で、かなり最適です。

とは言うものの、スピードがあなたが求めているものであるなら、あなたが何を書いても、それをスピードアップするための十分な余地があります。あなたが考えることができることは何でも、あなたはすでにやったであろうから、これらはあなたを驚かせるかもしれない方法であるでしょう。

これがその方法を示すスライドセットです。

于 2011-12-02T13:31:54.190 に答える