灵气:用期望算子替换sequence时报错

Spirit Qi: Error when replacing sequence with expectation operator

我的语法非常好,包含以下几行。

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

为了获得有意义的错误消息,我想确保 container 不会在遇到 '{' 时立即回溯。但出于某种原因,如果我在 '{' 之后用期望运算符替换序列运算符,我会得到一个巨大的编译器错误。知道问题可能是什么吗?

element是一个boost::variantcontainerlistpair 是自己的结构,应用了 BOOST_FUSION_ADAPT_STRUCT。请在此处查看完整的源代码:https://github.com/fklemme/liberty_tool/blob/master/src/liberty_grammar.hpp#L24

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

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

在这种情况下,可以通过 sub-expression:

周围的一些消除歧义的括号快速消除问题
container = name >> '(' >> -(arg % ',') >> ')' >> ('{' > +element > '}');