我在内存有限的系统上,boost::regex
太大了。有哪些选项可以将我的正则表达式直接编译为 C/C++ 以及我应该排除多少 KB 的代码大小?以尽可能减少内存和代码大小为目标。
我正在寻找小于 100kb 的代码大小和相同的内存使用量。Boost 正则表达式似乎是大约 470kb,这太大了。
我在内存有限的系统上,boost::regex
太大了。有哪些选项可以将我的正则表达式直接编译为 C/C++ 以及我应该排除多少 KB 的代码大小?以尽可能减少内存和代码大小为目标。
我正在寻找小于 100kb 的代码大小和相同的内存使用量。Boost 正则表达式似乎是大约 470kb,这太大了。
lex
(并且flex
)生成通常很小的表驱动的词法分析器;他们回到了 100kB 被认为是超级计算机的时代 :) 基本flex
代码骨架很小(几 kB),表格取决于您拥有多少令牌类型以及正则表达式的复杂程度,但是一个简单的flex
扫描仪表通常也只有几 kB。
但是,如果您不使用它们来构建解释器/编译器,它们确实有一些令人讨厌的特性:首先,它们坚持为您进行输入和缓冲,如果您总是从文件中读取,这很好但是如果您的输入来自套接字或终端(或者,更糟糕的是,被某种翻译器预处理),则可能不那么酷,其次它们是为您有一些简单令牌类型的环境而设计的,并且您有一个负责解释排序的解析器。(因此yacc
或bison
。)当然,您可以使用这些工具来解析 HTTP,并且您甚至可能会发现您已经学到了一些有用的新技能。
有一个名为re2c
(即 C 的正则表达式)的工具,您可能会觉得它更舒服一些。与 不同lex
的是,它会生成定制的 C 代码,这有点笨重,但可以说运行速度稍快一些。我不认为它得到了积极的维护,但几年前我已经取得了相当大的成功。您应该可以在 SourceForge 上找到它。
祝你好运。
人们似乎忘记了这个问题早已被lex
andyacc
解决了。
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 的预编译正则表达式,您可能需要在目标系统上或在仿真下运行编译。