我正在寻找一个好的解析器生成器,我可以用它来读取我们的大型商业应用程序中的自定义文本文件格式。目前,这种特定的文件格式是使用手工递归解析器读取的,但该格式已经发展和复杂化到该方法变得难以管理的程度。
看来最终的解决方案是为这种格式构建正确的语法,然后使用像 yacc 这样的真正的解析器生成器来读取它,但我无法决定使用哪个这样的生成器,或者即使它们值得麻烦根本不。我研究过 ANTLR 和 Spirit,但我们的项目有超出以下范围的特定限制之前的答案 https://stackoverflow.com/questions/428892/what-parser-generator-do-you-recommend这让我想知道它们是否适合我们。特别是,我需要:
-
使用 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
}
ANTLR 3不支持C++;它声称
生成直接 C 但文档
让它真正发挥作用是排序
的混乱。
它确实生成 C,而且它可以与 Visual Studio 和 C++ 一起使用。我知道这一点是因为我之前已经做过并提交了一个补丁以使其能够与 stdcall 一起使用。
在我们的应用程序中,内存非常宝贵
即使是微小的泄漏也是致命的。我需要
能够覆盖解析器的
使用我们自定义的内存分配器
malloc(),或者至少我需要
给它一个连续的池
它吸取了所有的记忆(并且
我可以整体解除分配
然后)。我可以节省大约200kb
对于解析器可执行文件本身,但是
无论它分配在什么动态堆中
之后解析必须被释放。
我上次检查的antlr3c运行时没有内存泄漏,并使用您描述的内存池范例。然而,它的 API 确实有一个缺点,作者拒绝改变,那就是如果你请求一个节点的字符串,它每次都会创建一个新的副本,直到你释放整个解析器。
我对使用自定义 malloc 的易用性没有任何评论,但它确实有一个宏来定义在整个项目中使用哪个 malloc 函数。
至于可执行文件的大小,我的编译大约有 100 kb,包括一个小的解释器。
我给你的建议是继续学习 ANTLR,因为它仍然符合你的要求,并且你可能需要牺牲更多的时间才能开始为你工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)