2

我必须解析以下文本

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

我的选择继续提升:精神,因为我不必处理 flex 或 bison。

我终于有了这个语法

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

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

有人可以帮助我吗?

4

1 回答 1

6

Hartmut Kaiser在本文中解释了如何做到这一点。

您需要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)]
;
于 2012-04-12T19:24:52.080 回答