ANTLR解析器生成器最适合具有受限内存的C++应用程序吗?

Cra*_*rks 7 c c++ parsing antlr

我正在寻找一个很好的解析器生成器,我可以用它来读取我们的大型商业应用程序中的自定义文本文件格式.目前,这种特殊的文件格式是使用手工递归解析器读取的,但格式已经增长并且复杂化到这种方法变得无法管理的程度.

似乎最终的解决方案是为这种格式构建一个正确的语法,然后使用像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
}
Run Code Online (Sandbox Code Playgroud)

Unk*_*own 4

ANTLR 3不支持C++;它声称可以生成直接的 C,但是关于让它实际工作的文档有点令人困惑。

它确实生成 C,而且它可以与 Visual Studio 和 C++ 一起使用。我知道这一点是因为我之前已经做过并提交了一个补丁以使其能够与 stdcall 一起使用。

在我们的应用程序中,内存非常宝贵,即使是微小的泄漏也是致命的。我需要能够重写解析器的内存分配器以使用我们的自定义 malloc(),或者至少我需要给它一个连续的池,它从中提取所有内存(并且我可以在之后整体释放它)。我可以为解析器可执行文件本身腾出大约 200kb 的空间,但是它在解析中分配的任何动态堆都必须在之后释放。

我上次检查的antlr3c运行时没有内存泄漏,并使用您描述的内存池范例。然而,它的 API 确实有一个缺点,作者拒绝改变,那就是如果你请求一个节点的字符串,它每次都会创建一个新的副本,直到你释放整个解析器。

我对使用自定义 malloc 的易用性没有任何评论,但它确实有一个宏来定义在整个项目中使用哪个 malloc 函数。

至于可执行文件的大小,我的编译大小约为 100 kb,包括一个小型解释器。

我给你的建议是继续学习 ANTLR,因为它仍然符合你的要求,并且你可能需要牺牲更多的时间才能开始为你工作。