我正在尝试在项目中使用flex
和bison
来生成文件结构的解析器代码。主要编程语言是C ++,项目主要是并行运行的OO设计。
我听说flex
和bison
生成的解析器是C代码,它们不是重新检测的。谷歌搜索,我找到了flex++
和bisonc++
。不幸的是,没有简单的入门教程。大多数示例都基于bison/flex
。有些人以某种方式将bison/flex
解析器集成到他们的C ++代码中。他们应该是“棘手的”...
flex++
和bisonc++
的文档对我和我没有帮助。教程和示例,它们都从stdin获取输入并在stdout上打印一些消息。
我在解析器中需要这些功能:
std::string
或std::stringstream
或以空值终止的char*
接收数据。我感到很困惑。我应该使用flex++/bisonc++
还是flex/bison
?如何做到这一点,满足上述条件?
答案 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的类。完整的源代码可用。它得到好评。我应该知道。我是作者。