Flex ++ Bisonc ++解析器

时间:2012-07-26 16:47:11

标签: c++ parsing bison flex-lexer

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

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

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

我在解析器中需要这些功能:

  1. Parser应该是一个C ++类,以正常方式定义(标题和cpp文件)
  2. Parser从std::stringstd::stringstream或以空值终止的char*接收数据。
  3. 我感到很困惑。我应该使用flex++/bisonc++还是flex/bison?如何做到这一点,满足上述条件?

3 个答案:

答案 0 :(得分:3)

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

来自Flexc ++网站:

  

与flex和flex ++相反,Flexc ++会生成代码   明确打算供C ++程序使用。着名的flex(1)   程序生成C源代码,而flex ++(1)只提供类似C ++的代码   由flex(1)生成的yylex函数周围的shell很难   支持当前关于C ++软件开发的想法。   与此相反,flexc ++创建了一个提供预定义的C ++类   成员函数lex匹配正则表达式和   一旦正则表达式匹配,可能会执行C ++代码。该   flexc ++生成的代码是纯C ++,允许其用户全部应用   该语言提供的功能。

来自Bisonc ++网站:

  

Bisonc ++是一种通用的解析器生成器,可以转换语法   将LALR(1)无上下文语法描述为C ++类   解析那个语法。一旦你精通bisonc ++,你就可以使用   它开发了各种各样的语言解析器   简单的桌面计算器,以复杂的编程语言。 Bisonc ++是   与Alain Coetmeur编写的程序bison ++高度可比:   所有正确编写的bison ++语法都应该可以转换为   经过很少或没有变化后的bisonc ++语法。任何熟悉的人   bison ++或其前身,野牛,应该能够使用bisonc ++   小麻烦。您需要熟练使用C ++编程   为了使用bisonc ++或理解本手册。

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

答案 1 :(得分:2)

Flex可以生成可重入的C扫描程序。请参阅Flex手册中的第19 Reentrant C scanners节。

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

您是否绝对需要基于C ++解析器和基于std :: string / stringstream的解析器数据?

您是否考虑过Boost.Spirit作为替代方案?

答案 2 :(得分:0)

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