我必须解析下面的一段文字
Camera {
position 0 0 0
direction 0 -1 0
up 0 1 0
FOVy 45
}
我选择了 boost:spirit,因为我不必处理 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_)
>> '}'
;
}
};
问题是花括号内的部分甚至可以互换;我读过有关置换运算符 ^ 的内容,但我读到的是当至少一个操作数以任何顺序匹配时才匹配。我需要我的语法只在所有语法以任何顺序出现时才匹配,并且只匹配一次。
有人可以帮帮我吗?
最佳答案
Hartmut Kaiser 解释了如何做到这一点 in this article .
您需要按照文章中的描述定义no_empties_impl
类,然后声明一个函数
phoenix::function<no_empties_impl> const no_empties = no_empties_impl();
然后,在您的语法中,您需要为每个 position
、direction
、up
和 定义规则视野
。然后你的开始语法看起来像(未经测试):
start %=
lit("Camera")
>> '{'
>> position ^ direction ^ up ^ FOVy
>> '}'
[qi::_pass = no_empties(qi::_0)]
;
关于c++ - boost::spirit 排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10126680/