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

2023-12-31

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

看来最终的解决方案是为这种格式构建正确的语法,然后使用像 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(使用前将#替换为@)

ANTLR 解析器生成器最适合内存有限的 C++ 应用程序吗? 的相关文章

  • 起订量要求?违背了目的?

    是否需要虚拟化您想要模拟的所有属性访问器就违背了模拟的目的 我的意思是 如果我必须修改我的对象并虚拟化我想要模拟的每个访问器 我难道不能继承我的类并自己模拟它吗 你的问题非常有效 但如果你仔细想想 没有其他方法可以模拟课程 如果你采用一个接
  • Accept() 是线程安全的吗?

    我目前正在用 C 语言为我正在做的课程编写一个简单的网络服务器 我们的一项要求是实现一个线程池来使用 pthread 处理连接 我知道我将如何粗略地执行此操作 在主线程中调用accept并将文件描述符传递给freee线程 但是我的朋友建议了
  • 如何从RichTextBox中获取显示的文本?

    如何获得显示的RichTextBox 中的文本 我的意思是 如果 RichTextBox 滚动到末尾 我只想接收那些对我来说可见的行 P S 获得第一个显示的字符串就足够了 您想使用 RichTextBox GetCharIndexFrom
  • 使用API​​隐藏程序标题栏

    它可以使用 c 和 windows api 删除窗口控制台标题栏 如果是的话如何 请 这个简单的应用程序隐藏并显示其所在控制台的标题栏 它会立即将控制台标题更改为 guid 以查找窗口句柄 然后 它使用 ToggleTitleBar 使用找
  • 矩阵向量变换

    我正在编写一个代码来制作软件蒙皮器 骨骼 皮肤动画 并且我正处于 优化 阶段 蒙皮器工作得很好 并且在 Core 上 1 09 毫秒内对 4900 个三角形网格与 22 个骨骼进行蒙皮Duo 2 Ghz 笔记本 我需要知道的是 1 有人可以
  • 存储过程上的 OdbcCommand - 输出参数上出现“未提供参数”错误

    我正在尝试执行存储过程 通过 ODBC 驱动程序针对 SQL Server 2005 但收到以下错误 过程或函数 GetNodeID 需要参数 ID 但未提供该参数 ID 是我的过程的 OUTPUT 参数 在存储过程中指定了一个输入 mac
  • 指向字节数组的指针

    由于 Misra C 的要求 我的一位同事想要使用指针声明 但我遇到了一些问题 Misra 安全关键指南 不会让我们纯粹的程序员使用指针 但会让我们对数组字节进行操作 他打算获取一个指向字节数组的指针 因此我们不会在堆栈上传递实际的数组 T
  • 操纵 setter 以避免 null

    通常我们有 public string code get set 如果最终有人将代码设置为 null 我需要避免空引用异常 我尝试这个想法 有什么帮助吗 public string code get set if code null cod
  • 编译器错误“错误:在文件范围内可变地修改了‘字符串’”

    考虑 include
  • 更改 IdentityServer4 实体框架表名称

    我正在尝试更改由 IdentityServer4 的 PersistedGrantDb 和 ConfigurationDb 创建的默认表名称 并让实体框架生成正确的 SQL 例如 而不是使用实体IdentityServer4 EntityF
  • 以编程方式更新 ClickOnce 应用程序的部署清单会导致缺少 4.0 中所需的 <兼容框架> 元素

    我正在致力于自动化 NET 4 0 ClickOnce WPF 应用程序的安装程序 该应用程序需要在应用程序配置文件 我经历了寻找必须遵循的具体步骤的棘手过程Mage exe http msdn microsoft com en us li
  • 如何用 C 语言练习 Unix 编程?

    经过五年的专业 Java 以及较小程度上的 Python 编程并慢慢感觉到我的计算机科学教育逐渐消失 我决定要拓宽我的视野 对世界的一般用处 并做一些 对我来说 感觉更重要的事情就像我真的对机器有影响一样 我选择学习 C 和 Unix 编程
  • 如何使用收益返回和递归获得字母的每个组合?

    我有几个像这样的字符串列表 可能有几十个列表 1 A B C 2 1 2 3 3 D E F 这三个仅作为示例 用户可以从几十个具有不同数量元素的类似列表中进行选择 再举个例子 这对于用户来说也是一个完全有效的选择 25 empty 4 1
  • 如何访问窗口?

    我正在尝试使用其句柄访问特定窗口 即System IntPtr value Getting the process of Visual Studio program var process Process GetProcessesByNam
  • #pragma pack(16) 和 #pragma pack(8) 的效果总是相同吗?

    我正在尝试使用来对齐数据成员 pragma pack n http msdn microsoft com en us library 2e70t5y1 28v vs 100 29 aspx 以下面为例 include
  • 如何将对象转换为传递给函数的类型?

    这不会编译 但我想做的只是将对象转换为传递给函数的 t public void My Func Object input Type t t object ab TypeDescriptor GetConverter t ConvertFro
  • 从有符号字符转换为无符号字符然后再转换回来?

    我正在使用 JNI 并有一个 jbyte 类型的数组 其中 jbyte 表示为有符号字符 即范围从 128 到 127 jbyte 表示图像像素 对于图像处理 我们通常希望像素分量的范围为0到255 因此 我想将jbyte值转换为0到255
  • g++ C++0x 枚举类编译器警告

    我一直在将可怕的 C 类型安全伪枚举重构为新的 C 0x 类型安全枚举 因为它们是way更具可读性 不管怎样 我在导出的类中使用它们 所以我明确地将它们标记为导出 enum class attribute visibility defaul
  • 启动画面后主窗口出现在其他窗口后面

    我有一个带有启动屏幕的 Windows 窗体应用程序 当我运行该应用程序时 启动屏幕显示正常 消失并加载应用程序的主窗体 但是 当我加载主窗体时 它出现在包含该应用程序的 Windows 资源管理器目录下 这是运行启动画面然后运行主窗体的代
  • 新的 .NET 6 控制台模板中的 C# 函数重载不起作用

    我在尝试重载该函数时遇到错误Print object in the 新的 NET 6 C 控制台应用程序模板 https learn microsoft com en us dotnet core tutorials top level t

随机推荐