0

我继承了一个使用 Ragel 进行字符串解析的 C++ 项目。

这是我第一次看到这样做,我想了解为什么有人会使用 Ragel 而不是 C++ 来解析字符串?

4

1 回答 1

5

解析器生成器(不恰当地称为“编译器-编译器”)非常好用,可以生成可靠且高效的 C++ 或 C 代码(特别是因为解析理论很好理解)。

一般来说,使用源代码生成器可能是明智之举。有时,特别是在大型项目中,编写自己的项目是明智的(阅读元编程,尤其是SICP甚至J.Pitrat 的博客)。GNU makeninja等良好的构建自动化工具可以轻松配置为运行 C 或 C++ 代码生成器并在构建时使用它们。

阅读Ragel简介。还将flexbisonANTLRrpcgenQt mocswiggperf作为 C 或 C++ 生成器的常见示例。

在某些程序中,您甚至可以使用一些JIT 编译库(例如libgccjitLLVM)在运行时动态生成代码并使用它。在 POSIX 系统上,您还可以在运行时生成临时 C 或 C++ 文件,将其编译为plugin ,然后使用dlopendlsym加载该临时插件。拥有关于编译器和解释器的良好文化(例如通过Dragon Book)是值得的。

在您的应用程序中嵌入一些解​​释器(如luaguile)也是一种有趣的方法。但这是一个强有力的架构决策。

在许多情况下,生成源代码比手写更容易。当然,这并不总是可能的。

PS。在阅读您的问题之前,我从未听说过 Ragel!

于 2017-09-29T10:33:15.990 回答