Синтаксический анализатор выражений Boost :: Spirit

У меня другая проблема с моим парсером boost :: spirit.

template<typename Iterator>
struct expression: qi::grammar<Iterator, ast::expression(), ascii::space_type> {
    expression() :
        expression::base_type(expr) {
        number %= lexeme[double_];
        varname %= lexeme[alpha >> *(alnum | '_')];

        binop = (expr >> '+' >> expr)[_val = construct<ast::binary_op<ast::add>>(_1,_2)]
              | (expr >> '-' >> expr)[_val = construct<ast::binary_op<ast::sub>>(_1,_2)]
              | (expr >> '*' >> expr)[_val = construct<ast::binary_op<ast::mul>>(_1,_2)]
              | (expr >> '/' >> expr)[_val = construct<ast::binary_op<ast::div>>(_1,_2)] ;

        expr %= number | varname | binop;
    }

    qi::rule<Iterator, ast::expression(), ascii::space_type> expr;
    qi::rule<Iterator, ast::expression(), ascii::space_type> binop;
    qi::rule<Iterator, std::string(), ascii::space_type> varname;
    qi::rule<Iterator, double(), ascii::space_type> number;
};

Это был мой парсер. Он отлично проанализировал «3.1415» и «var» , но когда я попытался разобрать «1 + 2» , он сообщил мне, что синтаксический анализ завершился неудачно . Затем я попытался изменить правило binop на

    binop = expr >>
           (('+' >> expr)[_val = construct<ast::binary_op<ast::add>>(_1, _2)]
          | ('-' >> expr)[_val = construct<ast::binary_op<ast::sub>>(_1, _2)]
          | ('*' >> expr)[_val = construct<ast::binary_op<ast::mul>>(_1, _2)]
          | ('/' >> expr)[_val = construct<ast::binary_op<ast::div>>(_1, _2)]);

, но теперь он, конечно, не может построить AST, потому что установлены _1 и _2 иначе. Я видел только что-то вроде _r1 , но как новичок в Boost я не совсем понимаю, как boost :: phoenix и boost :: spirit взаимодействовать.

Как это решить?

10
задан Lanbo 11 December 2011 в 15:06
поделиться