本文简单记录使用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 

posted on 2016-01-22 00:37  烛秋  阅读(1513)  评论(0编辑  收藏  举报