Spirit Qi:使用期望运算符替换序列时出错

时间:2018-03-13 17:49:53

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

我的语法完全正常,包含以下几行。

element = container | list | pair;
container = name >> '(' >> -(arg % ',') >> ')' >> '{' >> +element > '}';
// trying to put an expectation operator here --------^
list = name >> '(' > (value % ',') > ')' > ';';
pair = name >> ':' > value > ';';

要获得有意义的错误消息,我想确保container一旦点击'{'就不会回溯。但由于某种原因,如果我在'{'之后用期望运算符替换序列运算符,我会遇到巨大的编译错误。任何想法可能是什么问题?

elementboost::variant; containerlistpair是应用了BOOST_FUSION_ADAPT_STRUCT的自有结构。请查看完整源代码:https://github.com/fklemme/liberty_tool/blob/master/src/liberty_grammar.hpp#L24

1 个答案:

答案 0 :(得分:2)

是。由于operator>>operator>的优先级不相等,因此生成的合成属性类型不同。

实际上,它不再自动与预期的公开属性类型兼容。

在这种情况下,可以通过围绕子表达式使用一些明确的括号来快速消除问题:

container = name >> '(' >> -(arg % ',') >> ')' >> ('{' > +element > '}');