Electronic Joint Business

Solution for E-Business

Flex 和 Bison 简介 (三) 支持 C++

和一些收费软件相比,Flex 和 Bison 在某一些方面还是相对比较的弱的,比如说 Flex 对 C++ 的支持还处在实验状态,这意味着在将来的版本中有可能发生较大的改动,而且目前的解决方案在一些细节上处理得还并不好,但作为一个免费软件,Flex 和 Bison 总体上还是非常不错的软件,而且生成的词法生成器不依赖于其他库文件,可移植性比较好。 如果你更倾向于 Flex 和 Bison ,而不是用我们在第二节末尾提到的商业收费软件 Parser Generator 来生成资源模板解析器,那么请跟随本文来了解一下 Flex 和 Bison 是如何支持 C++ 的。 Flex 对 C++ 支持的基本是通过继承来完成的。在头文件 FlexLexer.h中定义了两个类 FlexLexer 和 yyFlexLexer。前者是一个抽象类,定义了 Flex 所生成的词法分析器的接口(interface),比如yylex();后者则继承自FlexLexer,是词法分析器的实现类,封装了词法分析器用到的状态变量等。因此,在默认的 C++ 模式下,Flex 的任务就是根据 “.l” 源文件自动生成 yyFlexLexer 中各成员函数的定义。规则的动作代码自然是被合成为 yyFlexLexer::yylex() 的实现啦,因此在规则动作中我们访问的变量和函数实际都是 yyFlexLexer 类的成员(或者是yylex()的参数 ),而不再是全局变量或全局函数。这便是 Flex 对 C++ 解决方案的基本原理。 这里还有一个问题。即在默认情况下,Flex 把生成的代码都放在了 yyFlexLexer 这一个类里,而事实上,实现类是应该有多个的,尤其是当我们的程序需要多个词法分析器的时候,每个词法分析器都应该对应一个实现类。Flex […]

, ,

Leave a Reply

Your email address will not be published. Required fields are marked *

Time limit is exhausted. Please reload CAPTCHA.