没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
一、 Spirit 介绍
Spirit,递归下降分析器框架,是传统的过程式代码; 和 STL 都具有易于理解、流畅、
高效等优秀特性。
Spirit 主要特性:模块性和可扩展性
Spirit 不是给你一个大锤,它提供方便打造大锤的正确成分。 Spirit 使用基本元素(终
结符)和复合元素(产生式)的层次对象组合来模块化递归下降分析器。现在的 Spirit 版本使
用了大量的表达式模版 (" Expression Templates ", C++ Report, June 1995) 和静态多态特性。
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) 创建分析器( 可以使用预定义的分析器("_p"后缀) )
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 5rst, Iterfaotr last); or
struct F
{
Void opetator()(Iterator 5rst,Iterator last);
};
如果分析器的属性类型不为 nil_t,则:
Void F(T val); or
Struct F
{
Void operator()(T val);
};
三、基本概念
3.1 分析器
框架的中心,接受扫描器的输入,并根据语法规则对输入流进行匹配,匹配成功后执
行语义动作,进行输入数据的处理。
分析器分成两类:基本元素(Primitives)和复合元素(Composities)。相当于编译器中的
终结符和非终结符。 内嵌对象的灵活性和递归的合成,开创了一个统一的分析方法。 派
生类可以构成任意复杂度的聚合或算法。复杂的分析器可以仅经由少数元素类合成而创建
3.2 扫描器
扫描器分析线性输入流并输出给 parser 使用。
scanner( IteratorT & 5rst_,
iter_param_t last_,
PoliciesT const& policies = PoliciesT())
[5rst_,last_)执行输入流范围,5rst_采用引用传递方便 parser 重定位。policies 指
定扫描器的扫描策略。扫描器策略用于控制扫描器的行为。Spirit 预定义了一些扫描器策
略,客户程序可以自定义扫描器策略来解析输入流。
3.3 匹配
派生的分析器都要实现一个 parse 成员函数:
typename parser_result<self_t, ScannerT>::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 语义动作
剩余13页未读,继续阅读
资源评论
chuang0619
- 粉丝: 0
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- XILINXFPGA源码Xilinxspratan3xcs100E(VGAPS2)
- XILINXFPGA源码XilinxSPARTAN-3E入门开发板实例
- XILINXFPGA源码XilinxSdramVerilog和VHDL版本文档
- 物联网智能家居方案-基于Nucleo-STM32L073&机智云(大赛作品,文档齐全,可直接运行)(文档加Matlab源码)
- XILINXFPGA源码XilinxISE9.xFPGACPLD设计源码
- 成都市地图含高新区(高新南区,高新西区),天府新区,东部新区虚拟行政区划
- XILINXFPGA源码XilinxEDK设计试验
- XILINXFPGA源码XilinxEDKMicroBlaze内置USB固件程序
- 基于 django 的视频点播后台管理系统源代码+数据库
- 基于Java的网上医院预约挂号系统的设计与实现(部署视频)-kaic.mp4
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功