2

私はメモリが制限されたシステムを使用していますboost::regexが、大きすぎます。正規表現をC/C ++に直接コンパイルするためにどのようなオプションがあり、何KBのコードサイズを除外する必要がありますか?メモリとコードサイズを可能な限り削減することを目的としています。

私は100kb未満のコードサイズと同じメモリ使用量を探しています。Boost正規表現は約470kbであるように見えますが、これは大きすぎます。

4

3 に答える 3

4

lex(およびflex)一般的にかなり小さいテーブル駆動型レクサーを生成します。100kBがスーパーコンピューターと見なされていた時代にさかのぼります:)基本的なflexコードスケルトンは小さく(数kB)、テーブルはトークンタイプの数と正規表現の複雑さに依存しますが、単純なflexスキャナーですテーブルは通常、数kBでもあります。

ただし、インタプリタ/コンパイラの構築にそれらを使用していない場合、それらにはいくつかの厄介な特性があります。まず、入力とバッファリングを行うことを要求します。これは、常にファイルから読み取る場合に便利です。ただし、入力がソケットまたはターミナルからのものである場合(または、さらに悪いことに、ある種のトランスレーターによって前処理されている場合)は、クールではない可能性があります。次に、いくつかの単純なトークンタイプがあり、シーケンスの解釈を担当するパーサー。(したがってyacc、またはbison。)これらのツールを使用してHTTPを解析することはできますが、確かに、いくつかの有用な新しいスキルを習得したことに気付くかもしれません。

re2cもう少し快適に感じるかもしれないと呼ばれるツール(つまり、Cの正規表現)があります。とは異なりlex、カスタマイズされたCコードを生成します。これはかなりかさばりますが、ほぼ間違いなくわずかに高速に実行されます。積極的に整備されているとは思いませんが、数年前にはかなりの成功を収めました。あなたはSourceForgeでそれを見つけることができるはずです。

幸運を。

于 2012-09-20T03:32:15.147 に答える
2

人々はこの問題がずっと前にlexyaccによって解決されたことを忘れているようです。

于 2012-09-20T02:15:55.470 に答える
1

re2cはまさにそれを行うように設計されたアプリケーションです

http://sourceforge.net/projects/re2c/

(debianパッケージなどとしても利用可能)

ライセンス:パブリックドメイン

あるいは、正規表現をバイトコードにコンパイルし、pcre2のインタープリター部分(または任意の正規表現スタイル)をリンクすることも可能です。例:

https://www.pcre.org/current/doc/html/pcre2api.html#SEC25

コンパイルされたパターンをディスクまたは他の場所に保存し、後でリロードすることができますが、いくつかの制限があります。パターンがリロードされるホストは、同じバージョンのPCRE2を同じコード単位幅で実行している必要があり、同じエンディアン、ポインター幅、およびPCRE2_SIZEタイプを持っている必要があります。コンパイルされたパターンを保存する前に、それらを「シリアル化された」形式に変換する必要があります。これは、PCRE2の場合は実際には単なるバイトコードダンプです。名前がpcre2_serialize_で始まる関数は、シリアル化された形式との間の変換に使用されます。それらは、pcre2serializeのドキュメントで説明されています。PCRE2シリアル化は、コンパイルされたパターンをJavaや.NETシリアル化のような抽象形式に変換しないことに注意してください。

したがって、RCRE2のプリコンパイルされた正規表現を含めるには、ターゲットシステム上またはエミュレーション下でコンパイルを実行する必要がある場合があります。

于 2019-02-07T00:28:45.383 に答える