灵气:用期望运算符替换序列时出错

Spirit Qi: Error when replacing sequence with expectation operator

本文关键字:出错 替换 运算符 期望 灵气      更新时间:2023-10-16

我有一个语法,运行良好,包含以下行。

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

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

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

在这种情况下,可以通过在子表达式周围添加一些消除歧义的括号来快速消除问题:

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