我对“>”提升精神的语义行为有疑问操作
我得到了这条完美无缺的规则..
ifelse = (iter_pos >>
nocaselit(L"if") > expression > nocaselit(L"then") >>
block_statements_eol > -ifelse_ifelse > nocaselit(L"end") > nocaselit(L"if") >>
iter_pos)
[_val = construct<common_node>(type_cmd_ifelse,LOCATION(_1,_5), key_cond, _2, key_seq, _3, key_else, phoenix::bind(&makeOptNode, _4))];
要添加一些错误处理,我还将on_error内容添加到我的解析器中。据我所知,我还必须添加“期望点”以提升输出错误正确
因此我将语法更改为此语法(将&gt;&gt;替换为&gt;)以提供有关停止回溯和报告错误的信息。
{{1}}
此时我得到了_3和_4的C ++编译器错误无效索引。因此似乎必须以某种方式更改语义操作,但我不知道如何。
答案 0 :(得分:1)
运算符优先级会更改合成的属性结构。
例如,int_ >> int_ >> int_
和int_ > int_ > int_
合成tuple<int, int, int>
,但如果您混合使用不同优先级的运算符,则可以获得tuple<int, tuple<int, int> >
或tuple<tuple<int, int>, int>
/
现在,对于许多自动属性传播方案,这不会受到伤害。但对于语义操作,它会更改语法以剖析属性(请参阅fusion::at_c<>
和phoenix::at_c<>
)。
有可能未充分记录
#define BOOST_SPIRIT_ACTIONS_ALLOW_ATTR_COMPAT
可能会在特定情况下提供帮助,但除此之外,只需处理它。
一般而言,避免语义行为是一个很好的准则(Boost Spirit: "Semantic actions are evil"?)。