就像其他很多問題一樣,我試圖用Boost.Spirit.Qi將簡單的語法解析爲結構樹。Boost.Spirit.Qi:獲取規則的屬性並將其設置爲封閉規則的結構屬性的字段?
我會嘗試提煉出我想要做的最簡單的情況。我有:
struct Integer {
int value;
};
BOOST_FUSION_ADAPT_STRUCT(Integer, (int, value))
後來,裏面的語法結構的,我有以下成員變量:
qi::rule<Iterator, Integer> integer;
,我正與
integer = qi::int_;
定義當我嘗試實際解析一個整數,然而,使用
qi::phrase_parse(iter, end, g, space, myInteger);
myInteger.value
總是在成功解析後未初始化。 同樣,我曾嘗試以下定義(顯然不編譯那些是錯的):
integer = qi::int_[qi::_val = qi::_1]; //compiles, uninitialized value
integer = qi::int_[qi::_r1 = qi::_1]; //doesn't compile
integer = qi::int_[phoenix::bind(&Integer::value, qi::_val) = qi::_1]; //doesn't
integer = qi::int_[phoenix::at_c<0>(qi::_val) = qi::_1]; //doesn't
顯然我誤解一些有關精神,鳳凰,還是其他什麼東西。我的理解是,qi::_1
是qi::int_
的第一個屬性,在此處應該表示解析的整數,方括號中的部分作爲函數對象執行。然後,我假設函數對象將包含integer
屬性qi::_val
並嘗試並將分析的整數賦值給它。我的猜測是,由於我的BOOST_FUSION_ADAPT_STRUCT
調用,兩者將是兼容的,從靜態分析的角度來看,似乎確實如此,但數據並未得到保留。
是否有參考(&)指定我在某處或某處丟失?
我剛剛發現,編譯,雖然它不初始化的數據導致另一種組合:我添加了一個構造函數`Integer`,需要一個值的`value` ,然後將我的整數解析器定義爲整數= qi :: long_long [qi :: _val = phx :: construct(qi :: _ 1)];` –
jtolds
2011-01-06 21:31:31
oops,我的意思是`qi :: int_` – jtolds 2011-01-06 21:54:42