我的语法完全正常,包含以下几行。
element = container | list | pair;
container = name >> '(' >> -(arg % ',') >> ')' >> '{' >> +element > '}';
// trying to put an expectation operator here --------^
list = name >> '(' > (value % ',') > ')' > ';';
pair = name >> ':' > value > ';';
要获得有意义的错误消息,我想确保container
一旦点击'{'
就不会回溯。但由于某种原因,如果我在'{'
之后用期望运算符替换序列运算符,我会遇到巨大的编译错误。任何想法可能是什么问题?
element
是boost::variant
; container
,list
和pair
是应用了BOOST_FUSION_ADAPT_STRUCT
的自有结构。请查看完整源代码:https://github.com/fklemme/liberty_tool/blob/master/src/liberty_grammar.hpp#L24
答案 0 :(得分:2)
是。由于operator>>
和operator>
的优先级不相等,因此生成的合成属性类型不同。
实际上,它不再自动与预期的公开属性类型兼容。
在这种情况下,可以通过围绕子表达式使用一些明确的括号来快速消除问题:
container = name >> '(' >> -(arg % ',') >> ')' >> ('{' > +element > '}');