欢迎来到天天文库
浏览记录
ID:38364039
大小:91.00 KB
页数:14页
时间:2019-06-11
《boost spirit介绍》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、一、Spirit介绍Spirit,递归下降分析器框架,是传统的过程式代码;和STL都具有易于理解、流畅、高效等优秀特性。Spirit主要特性:模块性和可扩展性Spirit不是给你一个大锤,它提供方便打造大锤的正确成分。Spirit使用基本元素(终结符)和复合元素(产生式)的层次对象组合来模块化递归下降分析器。现在的Spirit版本使用了大量的表达式模版("ExpressionTemplates",C++Report,June1995)和静态多态特性。Spirit是一个面相对象的递归下降分析器生成器框架,以模板元编程技术实现。表达式模板使我们能够在C++中使用近似于
2、EBNF范式的语法。基于表达式模版技术,Spirit可以用C++代码来表示EBNF文法,这样就减少了传统编译器生成器中将EBNF文法转换未c、c++代码的步骤。在spirit中用如下符号来同等替代EBNF文法中的符号:C++EBNF=:=>>连接符
3、或者(选择符)()组合*前置*(KleeneStar);(结束规则)Spirit框架以层次结构来组织,因此当掌握了最小部分的核心内容和基本概念之后,所需要学习的,仅仅是需要使用的。Spirit的易用性和可伸缩性,使其在开发小型分析器时成为最佳的选择。为了简化开发和部署,Spirit整个框架只包含了头文件,不需要在编译时
4、链接库。所要作的只是把Spirit放到你的包含路径,编译,运行。代码规模?很小。分析器可以越来越大,嵌套越来越多。无论何时,当你把两个分析器粘到一块儿,你得到的是一个更大的分析器,这是一个重要的概念。二、Spirit基本概念以及简单用法1.基本概念规则(rule)分析器(parser)规则是分析器的组合,而你可以通过规则的名字来使用这些不同的组合。匹配(Match)扫描器(Scanner)语义动作(SemanticActions)Linerinput--->scanner--->parser--->Match---->actor--->parsertree(oth
5、erformats)2.Spirit简单使用:(1)创建分析器(可以使用预定义的分析器("_p"后缀))real_p>>*(ch_p(',')>>int_p)(2)创建一条规则用于存储复合规则r=real_p>>*(ch_p(',')>>int_p);(3)使用全局函数parse()使用分析器分析格式流parse_infoparse(input,parser,skip_parser);input:格式输入流parser:格式流分析器skip_parser:分析器元素之间字符忽略分析器parse函数返回一个对象(称为parse_info)用来保留分析的结果。(4)语
6、义动作语义动作依附于分析器,表示当输入匹配分析器时进行的动作。比如一个分析器P和一个函数F,如果想让P在成功匹配输入时调用F,可以以如下的方式连接:P[&F]。或者F是个函数对象:P[F];函数或函数对象的参数取决于分析器的类型,如果分析器的属性为nil_t,则函数原型为:VoidF(Iteratorfirst,Iterfaotrlast);orstructF{Voidopetator()(Iteratorfirst,Iteratorlast);};如果分析器的属性类型不为nil_t,则:VoidF(Tval);orStructF{Voidoperator()(T
7、val);};三、基本概念3.1分析器框架的中心,接受扫描器的输入,并根据语法规则对输入流进行匹配,匹配成功后执行语义动作,进行输入数据的处理。分析器分成两类:基本元素(Primitives)和复合元素(Composities)。相当于编译器中的终结符和非终结符。内嵌对象的灵活性和递归的合成,开创了一个统一的分析方法。派生类可以构成任意复杂度的聚合或算法。复杂的分析器可以仅经由少数元素类合成而创建。3.2扫描器扫描器分析线性输入流并输出给parser使用。scanner(IteratorT&first_,iter_param_tlast_,PoliciesTcon
8、st&policies=PoliciesT())[first_,last_)执行输入流范围,first_采用引用传递方便parser重定位。policies指定扫描器的扫描策略。扫描器策略用于控制扫描器的行为。Spirit预定义了一些扫描器策略,客户程序可以自定义扫描器策略来解析输入流。3.3匹配派生的分析器都要实现一个parse成员函数:typenameparser_result::typeparse(ScannerTconst&scan)const;parser_result<>元函数返回给定分析器和扫描器的匹配对象类型。匹配
9、对象的主要
此文档下载收益归作者所有