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