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