77范文网 - 专业文章范例文档资料分享平台

boost spirit介绍

来源:网络收集 时间:2019-02-17 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

一、 Spirit介绍

Spirit,递归下降分析器框架,是传统的过程式代码; 和STL都具有易于理解、流畅、高效等优秀特性。

Spirit主要特性:模块性和可扩展性

Spirit不是给你一个大锤,它提供方便打造大锤的正确成分。 Spirit使用基本元素(终结符)和复合元素(产生式)的层次对象组合来模块化递归下降分析器。现在的Spirit版本使用了大量的表达式模版 (\ Expression Templates \ 和静态多态特性。

Spirit是一个面相对象的递归下降分析器生成器框架,以 模板元编程技术 实现。 表达式模板 使我们能够在C++中使用近似于EBNF范式的语法。 基于表达式模版技术,Spirit可以用C++代码来表示EBNF文法,这样就减少了传统编译器生成器中将EBNF文法转换未c、c++代码的步骤。在spirit中用如下符号来同等替代EBNF文法中的符号:

C++ EBNF = := >> 连接符 | 或者(选择符) () 组合

*前置 *( Kleene Star)

;(结束规则)

Spirit框架以层次结构来组织, 因此 当掌握了最小部分的核心内容和基本概念之后,所需要学习的,仅仅是需要使用的。Spirit的易用性和可伸缩性,使其在开发小型分析器时成为最佳的选择。为了简化开发和部署,Spirit整个框架只包含了头文件,不需要在编译时链接库。所要作的只是把Spirit放到你的包含路径,编译,运行。代码规模?很小。 分析器可以越来越大,嵌套越来越多。无论何时,当你把两个分析器粘到一块儿,你得到的是一个更大的分析器,这是一个重要的概念。

二、Spirit基本概念以及简单用法

1. 基本概念

规则(rule) 分析器(parser)

规则是分析器的组合,而你可以通过规则的 名字 来使用这些不同的组合。 匹配(Match)

扫描器(Scanner)

语义动作(Semantic Actions)

Liner input ---> scanner ---> parser ---> Match ----> actor ---> parser tree( other formats ) 2. Spirit简单使用:

(1) 创建分析器( 可以使用预定义的分析器(\后缀) )

real_p >> *( ch_p(',') >> int_p ) (2) 创建一条规则用于存储复合规则

r = real_p >> *( ch_p(',') >> int_p ) ;

(3) 使用全局函数parse()使用分析器分析格式流

parse_info parse( input, parser, skip_parser ); input: 格式输入流 parser: 格式流分析器

skip_parser: 分析器元素之间字符忽略分析器

parse函数返回一个对象(称为parse_info)用来保留分析的结果。 (4) 语义动作

语义动作依附于分析器,表示当输入匹配分析器时进行的动作。

比如一个分析器 P 和一个函数 F ,如果想让 P 在成功匹配输入时调用 F ,可以以如下的方式连接: P[&F] 。或者F是个函数对象: P[F];函数或函数对象的参数取决于分析器的类型,如果分析器的属性为nil_t,则函数原型为:

Void F( Iterator first, Iterfaotr last); or struct F {

Void opetator()(Iterator first,Iterator last); };

如果分析器的属性类型不为nil_t,则:

Void F(T val); or

Struct F {

Void operator()(T val); };

三、基本概念

3.1 分析器

框架的中心,接受扫描器的输入,并根据语法规则对输入流进行匹配,匹配成功后执行语义动作,进行输入数据的处理。

分析器分成两类:基本元素(Primitives)和复合元素(Composities)。相当于编译器中的终结符和非终结符。 内嵌对象的灵活性和递归的合成,开创了一个统一的分析方法。 派生类可以构成任意复杂度的聚合或算法。复杂的分析器可以仅经由少数元素类合成而创建。 3.2 扫描器

扫描器分析线性输入流并输出给parser使用。 scanner( IteratorT & first_, iter_param_t last_,

PoliciesT const& policies = PoliciesT())

[first_,last_)执行输入流范围,first_采用引用传递方便parser重定位。policies指定扫描器的扫描策略。扫描器策略用于控制扫描器的行为。Spirit预定义了一些扫描器策略,客户程序可以自定义扫描器策略来解析输入流。

3.3 匹配

派生的分析器都要实现一个parse成员函数: typename parser_result::type parse(ScannerT const& scan) const;

parser_result<> 元函数返回给定分析器和扫描器的匹配对象类型。匹配对象的主要作用是报告分析是否成功给parser的调用者。parse成功时, match.length()为成功匹配的字符数(>0);parse失败时,match.length() = -1; match.length()=0也是一个成功的匹配。 分析器都有关联的属性数据,缺省的属性类型为nil_t。如real_p有一个关联的数值属性,即分析过的数据。分析器属性在parse成功时,也通过匹配对象返回。

3.4 语义动作

语义动作hook到parser上,档parser成功匹配输入时,将会出发语义动作函数(actor)。这样可以在语义动作函数中进一步处理分析器的属性信息。

四、 框架组织

Spirit模块化设计:

iterator actor (独立层) debug

attribute dynamic error_handling symbols tree utility

meta --- 元编程技巧 core

scanner primitives composite non_terminal

Spirit有四层和一个独立层。层与层之间时非循环的,即层与层间是相互独立的。低层不依奈于高层,甚至同层间的模块也是相互独立的。 iterator模块:独立于spirit。

actor模块: 独立与spirit,实际上它只是一些函数对象和函数对象生成器而已。 debug模块:提供库级别的parser调试。在需要是会透明的挂钩到spirit核心上。 attribute模块: 介绍高级的语义动作机制,主要是通过继承和合成属性来提取parser层次上的属性。此外,attribute还可以用于控制分析行为,生成动态分析器。 dynamic模块:运行时动态修改的分析器

error_handling模块:异常处理,在Spirit这种嵌套递归调用中非常有用。 symbols模块:符号表管理模块 tree模块:分析树和抽象语法树 utility模块:通用模块

meta模块:为Spirit高级用户提供元编程技术

四、 核心学习(Core)

5.1 Primitives 基本元素(终结符)

Spirit预定义了大量的基于类模版的基本元素,可以方便构建复杂的分析器。 每个基本的分析器都有对应的一个分析器生成函数。

5.1.1 单字符分析器( character literal parser )

(1) 描述

基本分析器(parser primitives) 分析器生成函数(Parser Generator)

chlit ch_p (2) 例子

rule<> r1 = chlit('Z') ; rule<> r2 = ch_p('X') ; (3) 重载问题

两个重载函数模版(boost/spirit/core/composite/impl/sequence.ipp) : template

inline sequence > operator>>(parser const& a, char b) {

return sequence >(a.derived(), b); }

template

inline sequence, B> operator>>(char a, parser const& b) {

return sequence, B>(a, b.derived());

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库boost spirit介绍在线全文阅读。

boost spirit介绍.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/478845.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: