2

我在内存有限的系统上,boost::regex太大了。有哪些选项可以将我的正则表达式直接编译为 C/C++ 以及我应该排除多少 KB 的代码大小?以尽可能减少内存和代码大小为目标。

我正在寻找小于 100kb 的代码大小和相同的内存使用量。Boost 正则表达式似乎是大约 470kb,这太大了。

4

3 回答 3

4

lex(并且flex)生成通常很小的表驱动的词法分析器;他们回到了 100kB 被认为是超级计算机的时代 :) 基本flex代码骨架很小(几 kB),表格取决于您拥有多少令牌类型以及正则表达式的复杂程度,但是一个简单的flex扫描仪表通常也只有几 kB。

但是,如果您不使用它们来构建解释器/编译器,它们确实有一些令人讨厌的特性:首先,它们坚持为您进行输入和缓冲,如果您总是从文件中读取,这很好但是如果您的输入来自套接字或终端(或者,更糟糕的是,被某种翻译器预处理),则可能不那么酷,其次它们是为您有一些简单令牌类型的环境而设计的,并且您有一个负责解释排序的解析器。(因此yaccbison。)当然,您可以使用这些工具来解析 HTTP,并且您甚至可能会发现您已经学到了一些有用的新技能。

有一个名为re2c(即 C 的正则表达式)的工具,您可能会觉得它更舒服一些。与 不同lex的是,它会生成定制的 C 代码,这有点笨重,但可以说运行速度稍快一些。我不认为它得到了积极的维护,但几年前我已经取得了相当大的成功。您应该可以在 SourceForge 上找到它。

祝你好运。

于 2012-09-20T03:32:15.147 回答
2

人们似乎忘记了这个问题早已被lexandyacc解决了。

于 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 回答