使用“>”提升语义操作操作者

时间:2017-07-11 07:06:51

标签: c++ boost-spirit

我对“>”提升精神的语义行为有疑问操作

我得到了这条完美无缺的规则..

             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 ++编译器错误无效索引。因此似乎必须以某种方式更改语义操作,但我不知道如何。

1 个答案:

答案 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"?)。