我正在寻找一个好的解析器生成器,可用于在我们的大型商业应用程序中读取自定义文本文件格式。目前,这种特定的文件格式是使用手工递归解析器读取的,但格式已经增长和复杂化,以至于这种方法变得无法管理。
似乎最终的解决方案是为这种格式构建一个适当的语法,然后使用像 yacc 这样的真正的解析器生成器来读取它,但我无法决定使用哪个这样的生成器,或者即使它们值得麻烦一点也不。我看过 ANTLR 和 Spirit,但我们的项目有超出早期答案的特定限制,这让我想知道它们是否适合我们。特别是,我需要:
- 使用 MSVC 生成 C 或 C++ 代码的解析器。ANTLR 3 不支持 C++;它声称可以生成直接的 C,但是关于让它实际工作的文档有点令人困惑。
- 严重限制内存使用。在我们的应用程序中,内存非常宝贵,即使是微小的泄漏也是致命的。我需要能够覆盖解析器的内存分配器以使用我们的自定义 malloc(),或者至少我需要给它一个连续的池,它从中提取所有内存(并且我可以在之后解除分配整体)。我可以为解析器可执行文件本身腾出大约 200kb 的空间,但是它在解析中分配的任何动态堆都必须在之后被释放。
- 很好的表现。这不太重要,但我们应该能够在 3ghz 处理器上在一秒钟内解析 100kb 的文本。
- 必须是无 GPL 的。我们不能使用 GNU 代码。
我喜欢 ANTLRworks 的 IDE 和调试工具,但看起来让它的 C 目标真正与我们的应用程序一起工作将是一项艰巨的任务。在我开始讨论之前,ANTLR 是适合这项工作的工具吗?
有问题的文本格式类似于:
attribute "FluxCapacitance" real constant
asset DeLorean
{
//comment foo bar baz
model "delorean.mdl"
animation "gullwing.anm"
references "Marty"
loadonce
}
template TimeMachine
{
attribute FluxCapacitance 10
asset DeLorean
}