【问题标题】:parser generator that generates stand-alone C++ code生成独立 C++ 代码的解析器生成器
【发布时间】:2012-06-01 06:55:02
【问题描述】:

是否有生成独立 C++ 代码的 LALR 解析器生成器?我希望它会生成两个名为“Parser.cpp”和“Parser.hpp”的文件,并且生成的解析器在一个可以用于解析的类中实现(我可以包装在任何命名空间中)需要。

我想用它来获得乐趣(即小型个人项目),并且我希望输出是独立的(没有任何标题),这样我就知道我可以在任何有 C++ 编译器的地方编译它。

到目前为止的搜索:

我看过 flex/bison,但 AFAIK 它们都需要特殊的头文件和库。我也看过一点 ANTLR,但它可以生成独立的 C++ 代码对我来说并不明显。如果有人可以确认它可以,那么我可能会更多地研究它。

【问题讨论】:

  • ANTLR 3.x可以生成C代码,可以在C++中使用,但是不生成C++代码。正在针对 C++ 目标进行工作,但这仍处于早期阶段,AFAIK。
  • 有关解析器生成器的列表,包括它们生成的解析器类(LALR、LL、GLR 等)和目标语言,请参阅:en.wikipedia.org/wiki/Comparison_of_parser_generators
  • 如果你一开始就用 C++ 编写语法,那么你就不需要生成 C++ 代码。 AX 和 Spirit 都允许您这样做,除非您遇到递归下降问题。您也可以查看维基百科:en.wikipedia.org/wiki/Comparison_of_parser_generators

标签: c++ parsing parser-generator


【解决方案1】:

GOLD Parser(Bart Kiers 提到了 Wikipedia 上的列表)支持 C 和 C++ 语言。它不会生成完全独立的 C/C++ 源代码文件。它所做的只是生成可供“解析引擎”使用的 Lexer/Parser 表。

为了完成你的任务(或类似的事情),我做了以下事情:

  1. 以 Gold 格式准备您的 LALR 语法

  2. 生成解析表(一个二进制文件)

  3. 使用旧技巧将二进制文件转换为头文件,如

    无符号字符 ParseTable[] = { ... };

  4. 从“解析引擎”源修改加载器(或者使用支持内存加载的 C 版本,我记得)

  5. 将 GPEngine(如果是 C++ 版本)的源代码组合到 .h/.cpp 对中。

  6. 将 ParseTable 附加到 .cpp

当然,这不是那么简单,但原则上所有步骤都可以在一个“组合”脚本中完成,该脚本可以与多种语法一起使用。

我想主要的缺点是 GOLD 是封闭源代码且仅限 Windows(这意味着要生成解析表,您必须使用 Windows 机器)。

【讨论】:

    【解决方案2】:

    ANTLR can generate C++ 代码虽然恕我直言,我发现对 C++ 的支持有点弱,它更像 C 代码。使用 ANTLRWorks 为您提供语法树的图形表示仍然是一个很好的环境。

    【讨论】:

    • ANTLR 最酷的地方在于它与 stringtemplates 的集成,不包括 C++。 stringtemplates 不太可能被移植到 C++,因为它的功能与类似 Java 的语言(例如 C#)深度集成。另一个很酷的东西是令人印象深刻的图形语法调试器 - 但我个人发现它更分散注意力而不是有用。
    • @PatrickFromberg 是的 ANTRL 确实在 Java 中大放异彩,自从我使用它已经有一段时间了,所以自从我使用它(2011 年)以来,它可能在 C++ 上变得更好了
    【解决方案3】:

    flex+bison 的输出由两个 .c 文件和一个 .h 文件组成。这些是完全独立的,因为您只需将它们编译到您的应用程序中以使用解析器。不需要额外的库或头文件(除了标准 C 库)。

    除非我误解了你的要求,否则你绝对可以用 flex+bison 做你想做的事。

    【讨论】:

    • 真的吗?用的时候觉得编译的时候需要链接(-lfl)。
    • 其实经过一点研究,我想你是right...
    • 或者实际上可能不是:flex.sourceforge.net/manual/Cxx.html。我刚刚尝试从没有安装 flex/bison 的 linux 机器编译源代码,它抱怨找不到 FlexLexer.h。 Srry.. 在接受之前我可能应该更彻底...
    • 我想知道这是否可能是指定 C++ 解析器而不是 C 解析器的结果。在纯 C 中没有额外的依赖项。 - 只需阅读您的链接,是的,就是这样。我想您可以随时获取 FlexLexer.h 的副本并将其添加到您的项目中。或者,您可以为纯 C 解析器创建自己的 C++ 包装器。
    • flex 和 bison 都能够创建 C++ 类。看看我的一个已经失效的项目:github.com/rioki/libConfig/tree/master/Source 唯一的缺点是野牛使用联合,因此你需要在任何地方使用指针。使用 C++11 可能会更好,但我没有尝试。
    猜你喜欢
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多