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 ...
随机推荐
- 最常用的ES6特性
遇到了要写出es6新特性的题目,所以查阅了资料来总结一下,点击查看原文. 进入正题,最常用的ES6特性有:let, const, class, extends, super, arrow functi ...
- 大白的webservice
1.什么是web服务: web服务是一种可以用来解决跨网络应用集成问题的开发模式,这种模式为实现"软件即服务"提供了技术保障. 2.web服务的三个核心 (SOAP,WSDL,UD ...
- Cocosd-x的坐标系
OpenGL 坐标系 : 原点在屏幕左下角,x 轴向右,y 轴向上. UI坐标体系 : 原点在屏幕左上角,x 轴向右,y 轴向下. 屏幕坐标系: UI 世界坐标系: 也叫绝 ...
- ubuntu安装py27 spyder
sudo apt-get install python-qt4 python-sphinx sudo pip install spyder sudo pip install -U spyder 一般网 ...
- 工作中积累整理-CSS样式表(一)
[layout] clear:该属性的值指出了不允许有浮动对象的边. 默认值:none none: 允许两边都可以有浮动对象 both: 不允许有浮动对象 left: 不允许左边有浮动对象 right ...
- 7.dotnet core 如何发邮件
需要用到的Nuget包 "MailKit": "1.8.1", 方法 /// <summary> /// 发送邮件(支持Html发送,支持添加一个附 ...
- Linux系统下配置Tomcat
1.将下载好的tomcat文件拷贝至/usr/java文件夹中: cp apache-tomcat-7.0.72.tar.gz /usr/java 2.进入/usr/java文件夹: cd /usr/ ...
- Java知识积累2-StringReverse实现文字(单词)倒叙输出
package String; import java.util.Stack;import java.util.StringTokenizer; public class StringReverse ...
- socket了解(转)
http://blog.chinaunix.net/uid-26000296-id-3758651.html http://blog.csdn.net/mengyafei43/article/deta ...
- maven中运行hibernate5的一些注意事项
问题1:Could not bind factory to JNDI hibernate.cfg.xml中<sessionFactory> 标签中的name="foo" ...