我继承了一个使用 Ragel 进行字符串解析的 C++ 项目。
这是我第一次看到这样做,我想了解为什么有人会使用 Ragel 而不是 C++ 来解析字符串?
解析器生成器(不恰当地称为“编译器-编译器”)非常好用,可以生成可靠且高效的 C++ 或 C 代码(特别是因为解析理论很好理解)。
一般来说,使用源代码生成器可能是明智之举。有时,特别是在大型项目中,编写自己的项目是明智的(阅读元编程,尤其是SICP甚至J.Pitrat 的博客)。GNU make或ninja等良好的构建自动化工具可以轻松配置为运行 C 或 C++ 代码生成器并在构建时使用它们。
阅读Ragel简介。还将flex、bison、ANTLR、rpcgen、Qt moc、swig、gperf作为 C 或 C++ 生成器的常见示例。
在某些程序中,您甚至可以使用一些JIT 编译库(例如libgccjit或LLVM)在运行时动态生成代码并使用它。在 POSIX 系统上,您还可以在运行时生成临时 C 或 C++ 文件,将其编译为plugin ,然后使用dlopen和dlsym加载该临时插件。拥有关于编译器和解释器的良好文化(例如通过Dragon Book)是值得的。
在您的应用程序中嵌入一些解释器(如lua或guile)也是一种有趣的方法。但这是一个强有力的架构决策。
在许多情况下,生成源代码比手写更容易。当然,这并不总是可能的。
PS。在阅读您的问题之前,我从未听说过 Ragel!