2011-03-22 83 views
2

這可能是一個很容易的問題,尤其是因爲我已經成功使用QI來解析簡單結構一段時間了,並且可能應該已經知道答案,但它躲開我不管......Boost :: Spirit :: Qi自動規則和條件操作

比方說,我們有這樣一個容器:

struct GenderTally 
{ 
std::vector<std::string> males; 
std::vector<std::string> females; 
}; 

和像

m:Steve; 
f:Dora; 
f:Martha; 
m:Joe; 
... 

輸入文件隨着出現特定類別的對象以任何順序,並不是所有的對象都可能出現。

我會在這裏跳過融合適應,但它會是兩個字符串向量。

我的問題是,構造一個語法來填充這樣的條件容器。 到目前爲止,我通過多次解析輸入來解決此問題,每次都使用專門的語法。 在這個例子中,這將是一個男性和女性。在QI迷你XML教程中,我得到了自動規則帶走語義動作的印象,但我承認,我是一名新手,仍然被QI使用的核心(模板)魔法API嚇倒。所以,即使我知道這是壞的,糟糕的形式......我會非常感激在這裏得到一個真實的實例,因爲我正在經歷一些大燈堵塞的主要鹿。 編輯: 不一定非得是這個結構,只是......一個使用自動規則的語法的實際例子,並將其放入適當的桶中。

回答

5

我想你的情況做的是這樣的:

BOOST_FUSION_ADAPT_STRUCT(
    GenderTally, 
    (std::vector<std::string>, males) 
    (std::vector<std::string>, females) 
); 

rule<Iterator, std::string()> r = +alnum; 
rule<Iterator, GenderTally()> g = 
    *( ("f:" >> r)[phx::push_back(at_c<0>(_val), _1)] 
    | ("m:" >> r)[phx::push_back(at_c<1>(_val), _1)] 
    ); 

不是很好,但還是對付你有什麼最簡單的方法。

如果你有不同的數據結構,像

struct Gender { 
    char gender; 
    std::string name; 
}; 

typedef std::vector<Gender> GenderTally; 

BOOST_FUSION_ADAPT_STRUCT(
    Gender, 
    (char, gender) 
    (std::string, name) 
); 

你可以以不同的寫:

rule<Iterator, std::string()> r = +alnum; 
rule<Iterator, GenderTally()> g = *(char_('f') >> ':' >> r | char_('m') >> ':' >> r); 

但是,只有當我們有很多修復這個代碼可能與SVN主幹工作僅在最近提交的屬性處理。

缺點是你需要一個單獨的後處理步驟來整理男性和女性。

+0

謝謝你的回答。是的,到目前爲止,我使用第二種方法,簡單的結構與單獨的後處理步驟。我只是想知道這樣一個基本無關緊要的問題是否可以用同樣微不足道的方法來解決,而方法1看起來微不足道,但它仍然以一種實際的方式在我的頭上。那麼,我認爲即使是複雜的解析器幾乎總是這樣嗎?只是解析和沒有計算,如排序,而不是使用後處理? – Erius 2011-03-22 14:06:28

相關問題