2014-10-19 67 views
1

我有一個令人尷尬的簡單問題,我似乎無法包住我的頭。我正在閱讀關於how to parse into structs的增強文檔。該章節的sample code provided很簡單 - 或者我認爲。我想做一個超級簡單的改變。試圖理解Boost Qi解析爲結構

我要拆分的啓動規則:

start %= 
    lit("employee") 
    >> '{' 
    >> int_ >> ',' 
    >> quoted_string >> ',' 
    >> quoted_string >> ',' 
    >> double_ 
    >> '}' 
    ; 

...分成兩個(或更高版本以上)的規則,就像這樣:

params %= 
    >> int_ >> ',' 
    >> quoted_string >> ',' 
    >> quoted_string >> ',' 
    >> double_; 

start %= 
    lit("employee") 
    >> '{' 
    >> params 
    >> '}' 
    ; 

不管是什麼我已經試過我無法正確地將值解析到employee結構中。即使當我得到一個識別輸入的正在運行的程序時,屬性也沒有寫入結構。看起來只有在「頂級」規則中指定了所有內容時,解析才能正常工作。當然,我錯了?!對於我實際需要實現的解析器,我肯定需要更結構化的方法。

另外我不清楚params規則的正確類型應該是什麼。我想qi::rule<Iterator, fusion::vector<int, std::string, std::string, double>, ascii::space_type>,但我的編譯器似乎並不對此很感興趣......

我要指出,我與升壓v1.46.1

回答

2

工作在這種情況下,你可能真的只是使params直接暴露在employee屬性:

Live On Coliru

qi::rule<Iterator, employee(), ascii::space_type> params; 
+0

哦,天哪......臨屋恩,你,sehe!我一直在期待你的答案:)你碰巧知道爲什麼在這種情況下fusion :: vector不能隱式轉換爲目標結構體?您能否將我指向文檔中的相關章節? – djf 2014-10-20 10:33:50

+0

我認爲屬性兼容性規則控制_synthesized_屬性如何轉換爲_exposed屬性_。然而,在你的情況下,它已經是規則定義中的_exposed_屬性類型,因此不容易出現這種兼容性規則(?)。我只能說,通過返回as-if綜合屬性類型來僞裝規則<>'「是一種典型的做法。我不認爲我們可以指出任何直接的文檔(事實上,這是通過設計:屬性compat。magic應該是「直觀的」和實現細節,理想情況下) – sehe 2014-10-20 11:26:59