将正则表达式转换/编译为C代码

时间:2012-09-20 02:02:02

标签: c++ regex compiler-construction

我在内存有限的系统上,boost::regex太大了。有什么选择可以直接将我的正则表达式编译成C / C ++,除了我需要多少KB的代码大小?目标是尽可能减少内存和代码大小。

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

3 个答案:

答案 0 :(得分:4)

lex(和flex)产生表格驱动的词法分析器,通常很小;他们回到100kB被认为是超级计算机的日子:)基本flex代码框架很小(几KB),表格取决于你有多少令牌类型和正则表达式有多复杂,但简单的flex扫描仪表通常也只有几个KB。

但是,如果你没有使用它们来构建解释器/编译器,它们确实有一些恼人的特性:首先,它们坚持为你做输入和缓冲,如果你总是在阅读,这很好如果您的输入来自套接字或终端(或者更糟糕的是,由某种翻译器进行预处理),那么从文件中可能会变得不那么酷;其次,它们是针对您拥有一些简单令牌类型的环境而设计的,并且你有一个解析器负责解释排序。 (因此yaccbison。当然,您可以使用这些工具来解析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的预编译正则表达式,您可能需要在目标系统上或在仿真下运行编译。