我必须解析以下文本
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_)
>> '}'
;
}
};
问题是花括号内的部分甚至可以交换;我已经阅读了关于置换运算符 ^ 的内容,但是当至少有一个操作数以任何顺序匹配时,我读到了匹配。我需要我的语法只有在任何顺序中都有匹配时才会匹配。
有人能帮助我吗?
答案 0 :(得分:6)
Hartmut Kaiser解释了如何执行此操作in this article。
您需要按照文章中的描述定义no_empties_impl
类,然后声明一个函数
phoenix::function<no_empties_impl> const no_empties = no_empties_impl();
然后,在您的语法中,您需要为position
,direction
,up
和FOVy
中的每一个定义规则。然后你的开始语法看起来像(未经测试):
start %=
lit("Camera")
>> '{'
>> position ^ direction ^ up ^ FOVy
>> '}'
[qi::_pass = no_empties(qi::_0)]
;