2011-12-08 72 views
0

我試圖從boost::spirit使用c_escape_ch_p(請參閱here)解析轉義字符串C++。但是我得到一個編譯器錯誤。這裏是我的代碼:如何使用boost :: spirit中的`c_escape_ch_p`解析轉義字符串?

#include <boost/config/warning_disable.hpp> 
#include <boost/spirit/include/qi.hpp> 
#include <boost/spirit/home/classic/utility/escape_char.hpp> 
#include <boost/spirit/home/classic/utility/confix.hpp> 
#include <iostream> 
#include <string> 

namespace client { 
    namespace qi = boost::spirit::qi; 
    namespace ascii = boost::spirit::ascii; 

    template <typename Iterator> 
    bool parse(Iterator first, Iterator last) { 
    using qi::char_; 
    qi::rule< Iterator, std::string(), ascii::space_type > text; 

    using namespace boost::spirit::classic; 
    qi::rule<Iterator, std::string()> myword2 = 
     confix_p('"', *c_escape_ch_p, '"') ; // ERROR! 
    text = myword2; 

    bool r = qi::phrase_parse(first, last, text, ascii::space); 
    if (first != last) 
     return false; 
    return r; 
    } 
} 

int main() { 
    std::string s = "\"foo\""; 
    bool ok = client::parse(s.begin(), s.end()); 
    std::cout << "OK? " << (ok ? "y" : "n") << std::endl; 
    return 0; 
} 

編譯器錯誤是失敗的斷言靜從線實例化confix

// Report invalid expression error as early as possible.                
    // If you got an error_invalid_expression error message here,              
    // then the expression (expr) is not a valid spirit qi expression.             
    BOOST_SPIRIT_ASSERT_MATCH(qi::domain, Expr); 

所以,它說,它不是一個有效的表達式。它如何正確使用?

P.S .:我使用Boost 1.45。

回答

1

您正在嘗試將classic(V1,...)boost :: spirit :: classic和(new,V2)boost :: spirit :: qi相結合。

這是行不通的。較新的東西是一個完整的,不兼容的重寫。請參閱文檔中的'從Spirit 1.8.x移植'注意事項。 至於如何使用boost ::精神::氣解析逃脫C/C++字符串的問題,下面的文章會有所幫助:

Parsing Escaped String Input Using Spirit.Qi

相關問題