提升::精神排列

时间:2012-04-12 15:23:10

标签: c++ boost boost-spirit boost-spirit-qi

我必须解析以下文本

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_)
        >> '}'
        ;
    }
};

问题是花括号内的部分甚至可以交换;我已经阅读了关于置换运算符 ^ 的内容,但是当至少有一个操作数以任何顺序匹配时,我读到了匹配。我需要我的语法只有在任何顺序中都有匹配时才会匹配。

有人能帮助我吗?

1 个答案:

答案 0 :(得分:6)

Hartmut Kaiser解释了如何执行此操作in this article

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

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

然后,在您的语法中,您需要为positiondirectionupFOVy中的每一个定义规则。然后你的开始语法看起来像(未经测试):

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