2012-04-12 43 views
2

我要解析如下一段文字的boost ::精神排列

Camera { 
    position 0 0 0 
    direction 0 -1 0 
    up 0 1 0 
    FOVy 45 
} 

我的選擇升壓去:精神,因爲我沒有處理彎曲或野牛。

我終於有了這個語法

struct camera_grammar : qi::grammar<Iterator, camera(), ascii::space_type> 
{ 
    qi::rule<Iterator, camera(), ascii::space_type> start; 

    camera_grammar() : camera_grammar::base_type(start) 
    { 
     start %= 
     lit("Camera") 
     >> '{' 
     >> (lit("position") >> float_ >> float_ >> float_) 
     >> (lit("direction") >> float_ >> float_ >> float_) 
     >> (lit("up") >> float_ >> float_ >> float_) 
     >> (lit("FOVy") >> int_) 
     >> '}' 
     ; 
    } 
}; 

的問題是,在大括號內的零部件甚至可以互換;我已閱讀關於排列運算符^,但是當至少有一個操作數按任意順序匹配時,我會讀取匹配結果。我需要我的語法才能匹配,只有當他們以任何順序和一次只有一個。

有人可以幫我嗎?

回答

6

Hartmut Kaiser解釋瞭如何做到這一點in this article

您將要在文章中描述的定義no_empties_impl類,然後將函數聲明爲

phoenix::function<no_empties_impl> const no_empties = no_empties_impl(); 

然後,在你的語法,你要定義爲每position規則,directionupFOVy。那麼你的開始語法看起來像(未經測試):

start %= 
lit("Camera") 
>> '{' 
>> position^direction^up^FOVy 
>> '}' 
    [qi::_pass = no_empties(qi::_0)] 
;