• 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"1"]); // 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 

  • 相关阅读:
    07、从0到1:API测试怎么做?
    06、软件测试工程师的核心竞争力是什么?
    05、如何高效填写软件缺陷报告?
    04、你知道软件开发各阶段都有哪些自动化测试技术吗?
    03、为什么要做自动化测试?什么样的项目适合做自动化测试
    02、如何设计一个"好的"测试用例
    01、你真的懂测试吗?从"用户登录"测试谈起
    2020年03月15号--提升团队工作效率的一些方法
    01月02号总结
    ietester
  • 原文地址:https://www.cnblogs.com/cswuyg/p/5150070.html
Copyright © 2020-2023  润新知