Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 消除左递归后的语义动作_C++_Boost Spirit_Boost Spirit Qi - Fatal编程技术网

C++ 消除左递归后的语义动作

C++ 消除左递归后的语义动作,c++,boost-spirit,boost-spirit-qi,C++,Boost Spirit,Boost Spirit Qi,在遵循spirit经典常见问题解答中的示例以消除左递归之后,我无法找出Phoenix语义操作的右占位符。我的非工作语法如下所示: template <typename It, typename Skipper = qi::space_type> struct parser : qi::grammar<It, expr(), Skipper> { parser() : parser::base_type(expression) { using

在遵循spirit经典常见问题解答中的示例以消除左递归之后,我无法找出Phoenix语义操作的右占位符。我的非工作语法如下所示:

template <typename It, typename Skipper = qi::space_type>
struct parser : qi::grammar<It, expr(), Skipper>
{
    parser() : parser::base_type(expression)
    {
        using namespace qi;

        expression =
                term                        [_val = _1]
                >> *( (char_('+') >> term)  [_val = phx::construct<binop<op_add>>(_1, _2)]
                    | (char_('-') >> term)  [_val = phx::construct<binop<op_sub>>(_1, _2)]
                    ) ;
        term =
            factor                          [_val = _1]
                >> *( (char_('*') >> factor)    [_val = phx::construct<binop<op_mul>>(_1, _2)]
                    | (char_('/') >> factor)    [_val = phx::construct<binop<op_div>>(_1, _2)]
                   );

        factor =
                uint_                           [_val = _1]
            | var_                          [_val = _1]
            | ('(' >> expression >> ')')    [_val = _1]
            | (char_('-') > factor)         [_val = phx::construct<unop<op_uminus>>(_1)]
            | (char_('+') > factor)         [_val = _1]
            ;


        var_ = qi::lexeme[ +alpha ];

        BOOST_SPIRIT_DEBUG_NODE(expression);
        BOOST_SPIRIT_DEBUG_NODE(term);
        BOOST_SPIRIT_DEBUG_NODE(factor);
        BOOST_SPIRIT_DEBUG_NODE(var_);
    }
  private:
    qi::rule<It, var() , Skipper> var_;
    qi::rule<It, expr(), Skipper> expression, term, factor;
};
模板
结构分析器:qi::grammar
{
parser():parser::base_类型(表达式)
{
使用名称空间qi;
表情=
术语[_val=_1]
>>*((字符('+')>>term)[[u val=phx::construct(_1,_2)]
|(char_u('-')>>term)[[uval=phx::construct(1,2)]
) ;
术语=
系数[_val=_1]
>>*((字符('*')>>因子)[u val=phx::construct(_1,_2)]
|(字符('/')>>因子)[u val=phx::construct(_1,_2)]
);
因素=
uint_u[_val=_1]
|var_u[_val=_1]
|('('>>表达式>>'))[\u val=\u 1]
|(字符('-')>factor)[u val=phx::construct(_1)]
|(字符(+')>因子)[u val=\u 1]
;
var_uqi::词素[+alpha];
BOOST_-SPIRIT_-DEBUG_节点(表达式);
BOOST_-SPIRIT_-DEBUG_节点(术语);
提升精神调试节点(因子);
BOOST_-SPIRIT_-DEBUG_节点(var_);
}
私人:
qi::规则变量;
qi:规则表达式、术语、因子;
};
任何关于正确处理属性的方法的帮助都将不胜感激


谢谢。

我想你实际上并不想这么做

>> *( (char_('+') >> term)  [_val = phx::construct<binop<op_add>>(_1, _2)]
    | (char_('-') >> term)  [_val = phx::construct<binop<op_sub>>(_1, _2)]
这可能会提示您:您刚刚将其分配给<代码>\u val!所以,这就是你的解决方案:

>> *( (char_('+') >> term)  [_val = phx::construct<binop<op_add>>(_val, _2)]
    | (char_('-') >> term)  [_val = phx::construct<binop<op_sub>>(_val, _2)]

)]

为了让你的问题更容易找到,你可能应该添加更多的标签(如和/或)。此外,如果您添加代码,将有语法突出显示。谢谢您的帮助。答案很有道理——phx的使用让它看起来很难!
>> *( (char_('+') >> term)  [_val = phx::construct<binop<op_add>>(_val, _2)]
    | (char_('-') >> term)  [_val = phx::construct<binop<op_sub>>(_val, _2)]
>> *( (lit('+') >> term)  [_val = phx::construct<binop<op_add>>(_val, _1)]
    | (lit('-') >> term)  [_val = phx::construct<binop<op_sub>>(_val, _1