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 

相關文章
相關標籤/搜索