2011-08-16 86 views
1

我想要使用boost :: spirit來解析字符標記,並且有很大的困難。下面是示例代碼,我的工作:boost :: spirit char /字符串混合

#include <boost/spirit/include/qi.hpp> 
#include <iostream> 
#include <string> 

using namespace std; 
namespace qi = boost::spirit::qi; 
namespace ascii = boost::spirit::ascii; 

template <typename Iterator> 
struct tok_parser : qi::grammar<Iterator, string(), ascii::space_type> 
{ 
    tok_parser() : tok_parser::base_type(start) 
    { 
    tok1 = qi::char_("AB"); 
    tok2 = qi::char_("12"); 
    mytoks = (qi::lit("A1") | qi::lit("A2") | qi::lit("B1") | qi::lit("B2")); 
    start = mytoks; 
    //start = tok1 >> tok2; // error 1 
    //start = +mytoks;  // error 2 
    } 
    qi::rule<Iterator, string(), ascii::space_type> start; 
    qi::rule<Iterator, string(), ascii::space_type> mytoks; 
    qi::rule<Iterator, char, ascii::space_type> tok1; 
    qi::rule<Iterator, char, ascii::space_type> tok2; 
}; 

int main(int argc, char** argv) 
{ 
    tok_parser<string::const_iterator> g; // Our grammar 
    string str = argv[1]; 
    string::const_iterator iter = str.begin(); 
    string::const_iterator end = str.end(); 
    bool r = phrase_parse(iter, end, g, boost::spirit::ascii::space, str); 

    if (r && iter == end) 
     cout << "Parsing succeeded\n"; 
    else 
     cout << "Parsing failed\n"; 

    return 0; 
} 

錯誤1:

我想要做的是創建兩個令牌的規則,使我解析所有A1,A2,B1的,B2而不必列出所有文字排列。如代碼所示,它編譯並識別目標令牌。但是,如果我嘗試建立我的解析器了tok1和tok2規則的,它不會產生編譯有關類型不匹配的錯誤:

error: invalid static_cast from type âboost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::ascii> >â to type âcharâ 

我認爲這與試圖創造出字符串的字符做。我玩過任何類型猜測的排列,但都失敗了。

錯誤2:

此外,我想允許解析令牌任意數量的,不幸的是,+運算符前面加上預期要麼不起作用。

任何提示?

回答

3

對於規則,屬性總是需要使用函數聲明語法聲明:

qi::rule<Iterator, char(), ascii::space_type> tok1; 
qi::rule<Iterator, char(), ascii::space_type> tok2; 

這應該解決您的編譯器的問題。

WRT您的置換問題:我建議你做一些事情,如:

rule<Iterator, string(), ascii::space_type> r = char_("AB") >> char_("12"); 

將匹配 'A1', 'A2', 'B1',或 'B2'。

創建另一個規則允許所需的重複:

rule<Iterator, vector<string>(), ascii::space_type> rs = +r; 
+0

謝謝你的提示,精神也相當簡單/複合/妙/可怕庫。 –

相關問題