2012-04-12 41 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)] 
;