本文简单记录使用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 简用记录的更多相关文章

  1. 在msvc中使用Boost.Spirit.X3

    Preface “Examples of designs that meet most of the criteria for "goodness" (easy to unders ...

  2. ceph 源码安装 configure: error: "Can't find boost spirit headers"

    问题:configure: error: "Can't find boost spirit headers" 解决: 推荐:sudo apt-get install libboos ...

  3. 使用BOOST.SPIRIT.X3的RULE和ACTION进行复杂的语法制导过程

    Preface 上一篇简述了boost.spirit.x3的基本使用方法.在四个简单的示例中,展示了如何使用x3组织构造一个语法产生式,与源码串匹配并生成一个综合属性.这些简单的示例中通过组合x3库中 ...

  4. boost.spirit之解析C++头文件

    环境:win7_64旗舰版,VS2008 场景:C++与lua交互是比较繁琐的,当我们编写一个C++类后,如果要给lua使用,就必须写一个lua包装类,将lua与原始C++类关联起来.其实这部分代码编 ...

  5. 小试 boost spirit

    解释文本文件是日常编程中太平常的一件事情了,一般来说,土鳖点的做法可以直接手写 parser 用循环暴力地去 map 文本上的关键字从而提取相关信息,想省力一点则可以使用 tokenizer 或正则表 ...

  6. unicode 编解码记录

    unicode 万国码.世界上所有的符号都有对应的Unicode code point.一般是2个字节. 这个字节可以通过任意中方式编码为二进制,例如用来保存到文件.一般通过UTF-x(例如utf-8 ...

  7. unicode utf8 学习记录

    显示器- unicode -系统- utf8 -存储设备 Unicode是一套复杂的字符编码标准,简单来说就是将人类使用的每个所谓字符与一个非负整数对应,并且保证不同的字符对应的整数一定不同.UTF- ...

  8. boost多线程使用简例

    原文链接:http://www.cppblog.com/toMyself/archive/2010/09/22/127347.html C++ Boost Thread 编程指南 转自cnblog: ...

  9. Boost学习之语法解析器--Spirit

    Boost.Spirit能使我们轻松地编写出一个简单脚本的语法解析器,它巧妙利用了元编程并重载了大量的C++操作符使得我们能够在C++里直接使用类似EBNF的语法构造出一个完整的语法解析器(同时也把C ...

随机推荐

  1. java动态代理原理

    我们经常会用到Java的动态代理技术, 虽然会使用, 但是自己对其中的原理却不是很了解.比如代理对象是如何产生的, InvocationHandler的invoke方法是如何调用的?今天就来深究下Ja ...

  2. 查找二维数组list[][]中的最大的子数组的和

    之前做过最大一维数组子数组的和的题目,现在将数组扩展成二维: 代码如下: #include<iostream> #define null -858993460 using namespac ...

  3. centos7 安装php7+mysql5.7+nginx+redis

    .1.先修改yum源  https://webtatic.com rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest- ...

  4. 个推,手机推送API的使用

    参考:http://www.cnblogs.com/may-25/p/5501804.html 推送成功后返回的任务Id: String contentId = push.getContentId(m ...

  5. iphone中 input圆角bug

    今天写了个简单的登录注册,在电脑手机(除了iphone)样式都没有问题,但在iphone中却出现了异常,提交的按钮变成圆角被背景渐变的效果,随后又测试两个iphone版都是一个样,断定应该是safar ...

  6. 通用访问 - 用“反射”来设计通用的通信协议,以及配套的SDK、工具

    1. 效果演示 2. 通信协议 功能介绍 特点 TCP协议 WebApi协议 3. SDK与工具 4. 应用示例 迷你网管 通用GIS 系统管理 5. 设计初衷与演化   1. 效果演示     服务 ...

  7. Linux C相关基础

    系统求助 man 函数名 man 2 函数名    -    表示函数是系统调用函数 man 3 函数名    -    表示函数是C的库函数     eg:man fread     man 2 w ...

  8. system_call中断处理过程

    张雨梅   原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-10000 1.给menuos添加命令 改 ...

  9. django框架代码基础

    urls.py 导入相对应的模块from django.conf.urls import url,includefrom django.contrib import adminfrom son1.vi ...

  10. PBOC金融IC卡,卡片与终端交互的13个步骤,简介-第二组(转)

    四:脱机数据认证-可选终端进行脱机数据认证来,认证卡片.记住:对于某个事情,终端与卡片谁单独也说了不算,要二者都能干才能干. 终端依据卡片(AIP)和终端(终端性能)的支持情况,决定是否使用及使用哪种 ...