提升::精神排列

Mat*_*ien 2 c++ boost boost-spirit boost-spirit-qi

我必须解析下面的一段文字

Camera {
    position 0 0 0
    direction 0 -1 0
    up 0 1 0
    FOVy 45
}
Run Code Online (Sandbox Code Playgroud)

我的选择继续提升:精神,因为我没有处理弹性或野牛.

我终于有了这个语法

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_)
        >> '}'
        ;
    }
};
Run Code Online (Sandbox Code Playgroud)

问题是花括号内的部分甚至可以交换; 我已经阅读了关于置换运算符^但是当至少有一个操作数以任何顺序匹配时,我读到匹配.我需要我的语法才能匹配只有当所有这些都按任何顺序而且只有一次时.

有人能帮助我吗?

小智 6

Hartmut Kaiser 在本文中解释了如何执行此操作.

您将要no_empties_impl按照文章中的描述定义类,然后声明一个函数

phoenix::function<no_empties_impl> const no_empties = no_empties_impl();
Run Code Online (Sandbox Code Playgroud)

然后,在你的语法,你要定义每个规则position,direction,up,和FOVy.然后你的开始语法看起来像(未经测试):

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