2

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

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

到目前为止的搜索:

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

4

3 回答 3

3

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 机器)。

于 2012-06-01T14:48:49.890 回答
1

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

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

于 2012-06-01T07:14:30.853 回答
1

ANTLR可以生成 C++代码,尽管恕我直言,我发现对 C++ 的支持有点弱,它更像 C 代码。它仍然是使用 ANTLRWorks 的良好环境,为您提供语法树的图形表示。

于 2012-06-01T07:01:11.093 回答