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