boost::spirit unicode 简用记录

本文简单记录使用boost::spirit解析有中文关键字的字符串并执行响应动做,相似于语法分析+执行。html

关键字:字符串解析 boost::spirit::qi::parse qi::unicode::char_ git

这几天在使用boost::spirit解析中文字符串表达式,网络上这方面的资料不多,不少介绍仍是spirit V1.8版本的(也就是classic版本),我遇到的难点是:如何处理中文关键字、如何使用新版本的spirit库。github

这里只使用spirit::qi,在写解析器的时候,只包含两部份内容:一、规则;二、动做。“规则”指定了匹配字符串的内容,“动做”是当解析器遇到这些字符串时要执行的函数。规则+动做,也就是为对字符串的“理解”。规则有点正则表达式的味道。正则表达式

原理比较简单,麻烦的是各类api的使用,因此这就展现代码了:express

中文关键字有宏开关:#define BOOST_SPIRIT_UNICODE;api

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
    }

一、这里使用了boost::spirit::qi::grammar,用于构造复杂的规则;tcp

二、使用了bind绑定成员函数做为action函数;函数

三、使用了unicode用于支持关键字为中文的字符串;ui

四、跟spirit classic版本相比,支持直接在action中填写赋值表达式,使用了内置的_val、_一、_2变量;

五、跟spirit classic版本相比,有部分特殊字符含义变化了,如“!”原本是表示0或者1次,如今要采用“-”来代替;

完整的demo代码见github: boost_spirit_exercise

有rule,有action,能够用它实现脚本解释器,这里只是简单介绍,很少说。

资料:

一、书籍资料:

http://theboostcpplibraries.com/boost.spirit

二、官网文档:

介绍各类操做字符,如:* + - ! |...

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

三、stackoverflow上对解析中文的回答:

http://stackoverflow.com/questions/9852558/how-to-use-boost-spirit-to-parse-chineseunicode-utf-16

 

本文所在:http://www.cnblogs.com/cswuyg/p/5150070.html 

相关文章
相关标签/搜索