2016-05-31 48 views
1

我想學會使用boost.spirit解析器進行解析。我使用Windows 8.1和VisualStudio 2015.我已經安裝併成功編譯了boost.spirit安裝文檔中的測試程序,所以我的安裝提升看起來很好。使用boost.spirit.parser時無法解譯編譯錯誤

我一直在關注使用paser的boost.org上的教程。我創建了下面的代碼來解析雙:

#include <boost/config/warning_disable.hpp> 
    #include <boost/spirit/include/qi.hpp> 
    #include <boost/spirit/include/phoenix_core.hpp> 
    #include <boost/spirit/include/phoenix_operator.hpp> 
    #include <boost/spirit/include/phoenix_object.hpp> 

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

    template <typename Iterator> 
    bool myParser(Iterator first, Iterator last) { 
     using qi::double_; 
     qi::rule<Iterator, double(), ascii::space_type> myrule; 
     myrule %= double_; 
     bool r = parse(first, last, myrule, ascii::space); 
     return r; 
    } 
    int main() { 
     std::string dstr = std::string("2.1"); 
     bool r = myParser(dstr.begin(), dstr.end()); 
     return 0; 
    } 

我編譯時收到以下錯誤消息從rule.hpp線304:

'bool boost::function4<R,T0,T1,T2,T3>::operator()(T0,T1,T2,T3) const': cannot convert argument 4 from 'const boost::spirit::unused_type' to 'const boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::space,boost::spirit::char_encoding::ascii>> ' 

任何幫助將不勝感激。謝謝

+2

'myrule%= double_;':-D ...我迫不及待地想要讓它進入標準C++庫(不)。 – 6502

+2

@6502爲什麼會發生這種情況(對於EDSL語法的選擇錯誤很少,'%='很古怪,但它的語義也是這樣;根本沒有理由在這裏使用) – sehe

回答

2

正如jv_在鏈接中提到的,您使用的是隊長,但不會調用可接受隊長的phrase_parse API。因此,parse調用嘗試將ascii::space解析器綁定到第一個公開的屬性(它是double)。

分配失敗。

在所有的可能性,你不希望這個簡單的語法一個隊長,我會寫:

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

template <typename Iterator> bool myParser(Iterator first, Iterator last) { 
    namespace qi = boost::spirit::qi; 
    return qi::parse(first, last, qi::double_ >> qi::eoi); 
} 

int main() { 
    std::string const dstr("2.1"); 
    bool r = myParser(dstr.begin(), dstr.end()); 
    return r?0:1; 
} 

注意,檢查所有的輸入被消耗的qi::eol

+0

非常感謝答案和改寫。雖然它是解決雙重矯枉過正我有更復雜的需求,我想錯誤後出錯。我現在有附加語義動作的問題,但在尋求幫助之前,我正在自己做一些調試。 – cmoulikus