【问题标题】:Boost semantic actions with ">" operator使用“>”运算符增强语义动作
【发布时间】:2017-07-11 07:06:50
【问题描述】:

我有一个关于使用“>”运算符提升精神的语义动作的问题

我得到了这个完美的规则..

             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 内容添加到我的解析器中。据我了解,我还必须添加“期望点”以提高输出正确率

所以我将语法更改为这个(将>>替换为>)以提供有关停止回溯并报告错误的信息。

             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))];

此时我得到 _3 和 _4 的 C++ 编译器错误无效索引 .. 所以似乎必须以某种方式更改语义操作,但我不知道如何。

【问题讨论】:

    标签: c++ boost-spirit


    【解决方案1】:

    运算符优先级改变了综合属性结构。

    例如,int_ &gt;&gt; int_ &gt;&gt; int_int_ &gt; int_ &gt; int_ 都合成了一个 tuple&lt;int, int, int&gt;,但如果你混合不同优先级的运算符,你会得到例如tuple&lt;int, tuple&lt;int, int&gt; &gt;tuple&lt;tuple&lt;int, int&gt;, int&gt;/

    现在,对于许多自动属性传播场景,这不会有什么坏处。但是对于语义操作,它会更改语法以剖析属性(请参阅fusion::at_c&lt;&gt;phoenix::at_c&lt;&gt;)。

    记录不足的可能性很大

    #define BOOST_SPIRIT_ACTIONS_ALLOW_ATTR_COMPAT
    

    在特定情况下可能会有所帮助,否则,只需处理它。

    一般来说,避免语义操作是一个很好的指导方针 (Boost Spirit: "Semantic actions are evil"?)。

    【讨论】:

      猜你喜欢
      • 2015-08-03
      • 1970-01-01
      • 1970-01-01
      • 2013-04-14
      • 1970-01-01
      • 1970-01-01
      • 2011-07-10
      • 1970-01-01
      • 2023-03-08
      相关资源
      最近更新 更多