【问题标题】:Flex++ Bisonc++ parserFlex++ Bisonc++ 解析器
【发布时间】:2012-07-25 07:45:38
【问题描述】:

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

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

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

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

  1. 解析器应该是一个 C++ 类,以正常方式定义(一个头文件和一个 cpp 文件)
  2. 解析器从std::string 或std::stringstream 或以空结尾的char* 接收数据。

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

【问题讨论】:

    标签: c++ parsing bison flex-lexer


    【解决方案1】:

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

    来自 Flexc++ 网站:

    Flexc++ 与 flex 和 flex++ 不同,生成的代码是 明确供 C++ 程序使用。著名的 flex(1) 程序生成 C 源代码,而 flex++(1) 仅提供了一个类似 C++ 的 shell 围绕由 flex(1) 生成的 yylex 函数,几乎没有 支持当今关于 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++ 类,用于重入扫描/解析。

    【讨论】:

    • 我连flexc++都编译不了!刚刚下载了源代码。没有makefile,没有cmake!
    • 我之前没有听说过icmake。似乎是用于编译flexc++ 的构建系统。谢谢
    • @sorush-r 作者 Frank Brokken 制作了很多自己的实用程序。除了 flexc++、bisoc++、icmake,他还做了标记语言 (yodl) 等等。哦,他是 C++ Anations 文档的作者cppannotations.sourceforge.net
    • @sorush-r 如果您的意思是第 23.9 节 icce.rug.nl/documents/cplusplus/cplusplus23.html#l576,就是这样。如果您逐行执行此操作,则在您到达 23.9.2 时应该会得到一个可编译的示例。
    • @sorush-r 毅力会为你带来回报,只要试着在当时理解一个步骤。我有幸成为弗兰克·布罗肯(Frank Brokken)任教的同一所大学的学生,当时正在编写注释!那是在旧的 C++98 标准准备好之前,编译器损坏等等。但不知何故,我通过了那门课。现在容易多了,祝你好运!
    【解决方案2】:

    Flex 可以生成一个可重入的 C 扫描器。请参阅 Flex 手册中的 19 Reentrant C scanners 部分。

    同样,Bison 可以生成一个可重入的 C 解析器。有关详细信息,请参阅 Bison 手册中的 3.8.11 A Pure (Reentrant) Parser 部分。

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

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

    【讨论】:

    • 没有。我可以更改我的代码以生成要解析的char*s。但无法读取来自stdin的输入
    • @sorush-r:您应该能够通过重新定义 YY_INPUT() 宏来更改 Flex C 扫描仪输入的来源。请参阅 Flex 手册中的Section 9 The Generated Scanner。我也会认真研究 Boost.Spirit。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多