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