7

我正在尝试在我的项目中使用flexandbison为文件结构生成解析器代码。主要编程语言为 C++,项目采用 OO 设计,主要并行运行。

我听说生成flexbison解析器是 C 代码,它们不能重入。谷歌搜索,我发现flex++bisonc++。不幸的是,没有简单的教程可以开始。大多数示例都基于bison/flex. 有些人以某种方式将bison/flex解析器集成到他们的 C++ 代码中。他们应该是“棘手的”......

flex++和的文档对bisonc++我没有帮助。教程和示例,它们都从标准输入获取输入并在标准输出上打印一些消息。

我的解析器需要这些功能:

  1. Parser 应该是一个 C++ 类,以正常方式定义(一个头文件和一个 cpp 文件)
  2. Parser 从std::stringorstd::stringstream或 null-terminated接收数据char*

我感到很困惑。我应该使用flex++/bisonc++orflex/bison吗?以及如何做到这一点,满足上述条件?

4

3 回答 3

3

有 flex/bison、flex++/bison++ 和 flexc++/bisonc++。我认为最好选择这三对中的一对,而不是混合/匹配 flex++ 和 bisonc++。以下是Flexc++Bisonc++的用户指南。

来自 Flexc++ 网站:

与 flex 和 flex++ 不同,Flexc++ 生成明确供 C++ 程序使用的代码。著名的 flex(1) 程序生成 C 源代码,而 flex++(1) 仅围绕由 flex(1) 生成的 yylex 函数提供了一个类似 C++ 的外壳,几乎不支持当前有关 C++ 软件开发的想法。与此相反,flexc++ 创建了一个 C++ 类,它提供了一个预定义的成员函数 lex,将输入与正则表达式匹配,并且一旦匹配正则表达式就可能执行 C++ 代码。flexc++ 生成的代码是纯 C++,允许其用户应用该语言提供的所有功能。

来自 Bisonc++ 网站:

Bisonc++ 是一个通用解析器生成器,它将 LALR(1) 上下文无关文法的文法描述转换为 C++ 类以解析该文法。一旦您精通 bisonc++,您就可以使用它来开发范围广泛的语言解析器,从用于简单桌面计算器的解析器到复杂的编程语言。Bisonc++ 与 Alain Coetmeur 编写的程序 bison++ 具有高度可比性:所有正确编写的 bison++ 语法都应该在很少或没有变化后都可以转换为 bisonc++ 语法。任何熟悉 bison++ 或其前身 bison 的人都应该能够轻松使用 bisonc++。您需要熟练使用 C++ 编程才能使用 bisonc++ 或理解本手册。

所以 flexc++/bisonc++ 不仅仅是旧的 flex/bison 实用程序的包装器。它们生成完整的 C++ 类,用于重入扫描/解析。

于 2012-07-26T17:58:37.503 回答
2

Flex 可以生成一个可重入的 C 扫描器。请参阅Flex 手册中的第19 节可重入 C 扫描仪。

类似地,Bison 可以生成一个可重入的 C 解析器。有关详细信息,请参阅 Bison 手册中的第3.8.11 节 A Pure (Reentrant) Parser

你绝对需要一个 C++ 解析器和基于 std::string/stringstream 的解析器数据吗?

您是否将Boost.Spirit视为替代方案?

于 2012-07-26T17:40:34.597 回答
0

LRSTAR产品(LR(k) 解析器和 DFA 词法分析器生成器)基于 C++。在 Widowns 上运行并有六个 Visual Studio 项目。该代码还可以使用“gcc”和其他编译器进行编译。有用于词法分析器和解析器、符号表、AST 的类。完整的源代码可用。它得到了很好的评价。我应该知道。我是作者。

于 2018-08-21T19:35:42.943 回答