2013-01-14 64 views
2

我想解析文本文件中的浮點數並將其插入符號表中;解析器和符號表由spirit :: qi提供。將boost :: phoenix :: bind與boost :: spirit :: qi :: symbols :: add一起使用

這裏是我的代碼:

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

#include <stdint.h> 
#include <iostream> 
#include <string> 
template<typename VTYPE> 
struct VTable : boost::spirit::qi::symbols<char, VTYPE> { 
    VTable() {} // empty 
}; 

int main() { 
using boost::spirit::qi::_1; 
using boost::spirit::qi::eps; 
using boost::spirit::qi::rule; 
using boost::spirit::qi::ascii::space; 
using boost::spirit::qi::space_type; 
using boost::spirit::qi::real_parser; 
using boost::spirit::qi::int_parser; 
using boost::spirit::qi::strict_real_policies; 
    VTable<double> floatDecs; 
    floatDecs.add("hallo", 15.26)("duDa", 18.5); 

const std::string some = "some"; 
    rule<std::string::iterator, double> value = real_parser<double, strict_real_policies<double>>() [ boost::phoenix::bind(&VTable<double>::add, floatDecs, boost::phoenix::cref(some), _1) ]; 

    std::cout << boost::spirit::qi::phrase_parse(test.begin(), test.end(), value, space); 
    return 0; 
} 

在這裏的問題在於升壓::鳳::綁定,但我不知道如何解決這個問題(我是相當新的這個庫)。

+0

[如何在語法中添加qi :: symbols ?](http://stackoverflow.com/questions/8780604/how-to-add-qisymbols-in-grammariterator-雙倍) – sehe

+1

@se答案中的綁定表達式比我的可怕性要小得多:p。 – 2013-01-14 10:54:01

+0

你真的認爲有些[]是數組嗎?這看起來不像我會好像它會編譯 – FatalFlaw

回答

3

這是一個工作版本。之後,我會列出你的問題。

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

#include <stdint.h> 
#include <iostream> 
#include <string> 
template<typename VTYPE> 
struct VTable : boost::spirit::qi::symbols<char, VTYPE> { 
    VTable() {} // empty 
}; 

int main() { 
using boost::spirit::qi::_1; 
using boost::spirit::qi::eps; 
using boost::spirit::qi::rule; 
using boost::spirit::qi::ascii::space; 
using boost::spirit::qi::space_type; 
using boost::spirit::qi::real_parser; 
using boost::spirit::qi::int_parser; 
using boost::spirit::qi::strict_real_policies; 

    VTable<double> floatDecs; 
    floatDecs.add("hallo", 15.26)("duDa", 18.5); 

    const char some[] = "some"; 

    rule<std::string::iterator, double()> value = 
      real_parser<double, strict_real_policies<double> >() 
      [ boost::phoenix::bind(floatDecs.add, boost::phoenix::val(some), _1) ]; 

    std::string test("10.6"); 

    std::string::iterator b(test.begin()), e(test.end()); 

    std::cout << boost::spirit::qi::phrase_parse(b, e, value, space); 

    return 0; 
} 

首先,要用作add()參數的變量需要修復。

const char some[] = "some"; 

接下來,你需要修復的語法在規則模板參數:

rule<std::string::iterator, double()> 

注意括號,使仿函數的聲明,而不是香草雙,懶惰評估的兩倍。

接下來,您需要使用上述語法來進行語義操作。

[ boost::phoenix::bind(floatDecs.add, boost::phoenix::val(some), _1) ]; 

老實說,我不知道爲什麼這工作,因爲我不是一個鳳凰的專家,但上面「sehe的」評論的鏈接提供了答案。此外,你正在用cref叫出錯誤的樹,從add()的聲明中沒有跡象表明參考是必需的。 val是您需要將some變量變爲phoenix-happy惰性參數的內容。

最後,你只需要提供一些合理的測試數據。

上面的代碼現在應該適合你。

相關問題