2013-05-14 126 views
4

我正在嘗試編寫一個解析器(作爲第一步,當然它將被擴展很多)解析一個double並通過將該double傳遞給工廠來創建我的類ExpressionTree的一個對象我班的方法。 這是我第一次嘗試Boost Spirit佔位符類型轉換

struct operands : qi::grammar<string::iterator, ExpressionTree()> 
{ 

    operands() : operands::base_type(start) 
    { 
     start = qi::double_[qi::_val = ExpressionTree::number(qi::_1)]; 
    } 

    qi::rule<string::iterator, ExpressionTree()> start; 

}; 

這並不編譯(can't convert from boost::spirit::_1_type to double),因爲(如果我理解正確)qi::_1是不是雙,但只計算爲一個雙。

我試圖以任何方式使用boost::bind(&ExpressionTree::number, _1),但我不知道我怎麼那麼能得到賦予屬性_val

的結果,我將不勝感激,如果任何人都可以在正確的方向指向我。

回答

4

您需要在語義操作中使用懶惰的actor。

我假設number是一個靜態的一元函數或一個非靜態無參(代替,如A型):

start = qi::double_ [ qi::_val = boost::phoenix::bind(&ExpressionTree::number, qi::_1)]; 

如果它是一個類型:

start = qi::double_ [ qi::_val = boost::phoenix::construct<ExpressionTree::number>(qi::_1)]; 

見也

+0

作品完美,感謝 – DanielAbele 2013-05-17 07:43:58