本文簡單記錄使用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