boost::spirit unicode 简用记录
本文简单记录使用boost::spirit解析有中文关键字的字符串并执行响应动作,类似于语法分析+执行。
关键字:字符串解析 boost::spirit::qi::parse qi::unicode::char_
这几天在使用boost::spirit解析中文字符串表达式,网络上这方面的资料很少,很多介绍还是spirit V1.8版本的(也就是classic版本),我遇到的难点是:如何处理中文关键字、如何使用新版本的spirit库。
这里只使用spirit::qi,在写解析器的时候,只包含两部分内容:1、规则;2、动作。“规则”指定了匹配字符串的内容,“动作”是当解析器遇到这些字符串时要执行的函数。规则+动作,也就是为对字符串的“理解”。规则有点正则表达式的味道。
原理比较简单,麻烦的是各种api的使用,所以这就展示代码了:
中文关键字有宏开关:#define BOOST_SPIRIT_UNICODE;
unicode_user.cc核心代码:
Interpreter::Interpreter() :
Interpreter::base_type(nums) { // nums is final expression
using boost::phoenix::bind;
using boost::spirit::_1;
using boost::spirit::_2;
using boost::spirit::_val; nums = (sign >> num[bind(&Action::num_func, &_action, _val, _1)])[_val=_1+_2]; //test _val and _1 and _2
num = *(qi::unicode::char_(L"零")[bind(&Action::zero_func, &_action, _val, _1)] | qi::unicode::char_(L"一")[_val+=L""]); // test bind
sign = qi::unicode::char_(L"负")[_val=L"-"] | qi::lit(L"正")[_val=L"+"]; // test action
}
1、这里使用了boost::spirit::qi::grammar,用于构造复杂的规则;
2、使用了bind绑定成员函数作为action函数;
3、使用了unicode用于支持关键字为中文的字符串;
4、跟spirit classic版本相比,支持直接在action中填写赋值表达式,使用了内置的_val、_1、_2变量;
5、跟spirit classic版本相比,有部分特殊字符含义变化了,如“!”本来是表示0或者1次,现在要采用“-”来代替;
完整的demo代码见github: boost_spirit_exercise。
有rule,有action,可以用它实现脚本解释器,这里只是简单介绍,不多说。
资料:
1、书籍资料:
http://theboostcpplibraries.com/boost.spirit
2、官网文档:
介绍各种操作字符,如:* + - ! |...
http://www.boost.org/doc/libs/1_60_0/libs/spirit/doc/html/spirit/qi/quick_reference/qi_parsers/operator.html
介绍各种字符匹配,如:char_ lit...
http://www.boost.org/doc/libs/1_60_0/libs/spirit/doc/html/spirit/qi/quick_reference/qi_parsers/char.html
spirit解析类表单格式数据demo:
http://www.boost.org/doc/libs/1_47_0/libs/spirit/example/qi/key_value_sequence.cpp
3、stackoverflow上对解析中文的回答:
http://stackoverflow.com/questions/9852558/how-to-use-boost-spirit-to-parse-chineseunicode-utf-16
本文所在:http://www.cnblogs.com/cswuyg/p/5150070.html
boost::spirit unicode 简用记录的更多相关文章
- 在msvc中使用Boost.Spirit.X3
Preface “Examples of designs that meet most of the criteria for "goodness" (easy to unders ...
- ceph 源码安装 configure: error: "Can't find boost spirit headers"
问题:configure: error: "Can't find boost spirit headers" 解决: 推荐:sudo apt-get install libboos ...
- 使用BOOST.SPIRIT.X3的RULE和ACTION进行复杂的语法制导过程
Preface 上一篇简述了boost.spirit.x3的基本使用方法.在四个简单的示例中,展示了如何使用x3组织构造一个语法产生式,与源码串匹配并生成一个综合属性.这些简单的示例中通过组合x3库中 ...
- boost.spirit之解析C++头文件
环境:win7_64旗舰版,VS2008 场景:C++与lua交互是比较繁琐的,当我们编写一个C++类后,如果要给lua使用,就必须写一个lua包装类,将lua与原始C++类关联起来.其实这部分代码编 ...
- 小试 boost spirit
解释文本文件是日常编程中太平常的一件事情了,一般来说,土鳖点的做法可以直接手写 parser 用循环暴力地去 map 文本上的关键字从而提取相关信息,想省力一点则可以使用 tokenizer 或正则表 ...
- unicode 编解码记录
unicode 万国码.世界上所有的符号都有对应的Unicode code point.一般是2个字节. 这个字节可以通过任意中方式编码为二进制,例如用来保存到文件.一般通过UTF-x(例如utf-8 ...
- unicode utf8 学习记录
显示器- unicode -系统- utf8 -存储设备 Unicode是一套复杂的字符编码标准,简单来说就是将人类使用的每个所谓字符与一个非负整数对应,并且保证不同的字符对应的整数一定不同.UTF- ...
- boost多线程使用简例
原文链接:http://www.cppblog.com/toMyself/archive/2010/09/22/127347.html C++ Boost Thread 编程指南 转自cnblog: ...
- Boost学习之语法解析器--Spirit
Boost.Spirit能使我们轻松地编写出一个简单脚本的语法解析器,它巧妙利用了元编程并重载了大量的C++操作符使得我们能够在C++里直接使用类似EBNF的语法构造出一个完整的语法解析器(同时也把C ...
随机推荐
- java中filter的用法 内部资料 请勿转载 谢谢合作
filter过滤器主要使用于前台向后台传递数据是的过滤操作.程度很简单就不说明了,直接给几个已经写好的代码: 一.使浏览器不缓存页面的过滤器 Java代码 import javax.servlet ...
- poj 2774
传送门:http://poj.org/problem?id=2774 裸的后缀数组,我只是为了贴个版而已 代码 #include <cstdio> #include <cmath&g ...
- 传感器介绍之DHT11
一.DHT11介绍 DHT11 数字温湿度传感器,如图所示,是一款含有已校准数字信号输出的温湿度复合传感器.它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性.传 ...
- disable_irq与disable_irq_nosync使用场景
disable_irq与disable_irq_nosync使用场景 Linux设备驱动,关于中断屏蔽有两个接口:disable_irq和disable_irq_nosync,该两接口使用场景 ...
- 自定义圆饼(利用贝塞尔曲线和CGContext类完成)
-(void)drawRect:(CGRect)rect{ CGFloat w = self.bounds.size.width; CGFloat h = self.bounds.size.heigh ...
- Unbuntu下使用SVN
一.查看SVN版本 svn --version 二.查看SVN仓库 # 查看被svn仓库占用的所有端口 netstat -anp |grep svn # 查看所有端口对应的仓库 ps -ef | gr ...
- HDU1760 A New Tetris Game NP态
A New Tetris Game Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- 如果你恨一个程序员 忽悠他去做iOS开发(戏谑篇)
.state { text-align: right; height: 16px; line-height: 16px; color: #999; padding-top: 5px; overflow ...
- Word,PDF,PPT,TXT之间的转换方法
来源: 刘波的日志 一.把PPT转WORD形式的方法 1.利用"大纲"视图 打开PPT演示文稿,单击"大纲",在左侧"幻灯片/大纲”任务窗格的“大纲” ...
- Node.js 基础库
全局对象 Node.js 中的全局对象是 global,所有全局变量(除了 global 本身以外)都是 global对象的属性. 我们在 Node.js 中能够直接访问到对象通常都是 global ...