парсер функций с использованием boost-spirit - PullRequest
0 голосов
/ 22 февраля 2019

Я пытаюсь разобрать функции, используя повышение духа.Я получаю ошибку компиляции, когда пытаюсь сохранить соответствующую функцию в строку.

Parser.cpp: 50: 58: ошибка: вызов перегруженного 'ref (std :: string &)' является неоднозначным int_[ref (a) = _1] >> p.definedFunctions [ref (myFunction) = _1]

Код работает нормально, если заменить [ref(myFunction) = _1] на [std::cout<<_1]

Parser.h

#include <spirit/include/qi.hpp>
#include <iostream>
#ifndef PARSER_H
#define PARSER_H

namespace qi = boost::spirit::qi;
class Parser {
public:
    Parser();
    Parser(const Parser& orig);
    virtual ~Parser();
    static std::string parseFuncion(const std::string& s);

private:
    qi::symbols<char, std::string> definedFunctions;
};

#endif /* PARSER_H */

Parser.cpp

#include <iostream>
#include <iomanip>
#include <stdexcept>
#include <cstdlib>
#include <sstream>

#include <spirit/include/qi.hpp>
#include <spirit/include/phoenix.hpp>

#include "Parser.h"
namespace qi = boost::spirit::qi;

Parser::Parser() {
    definedFunctions.add
            ("^"    ,      "pow")
            (">"   ,   "greater")
            ;
}

Parser::Parser(const Parser& orig) {
}

Parser::~Parser() {
}

std::string Parser::parseFuncion(const std::string& s){
    using boost::spirit::qi::_1;
    using boost::spirit::qi::int_;
    using boost::phoenix::ref;
    int a=0, b=0;
    std::string myFunction;
    Parser p;

    const char* first = s.data();
    const char* const end = first + s.size();
    const bool success = boost::spirit::qi::parse(first, end,
                                                  // Implementation of 'full-date' rule from EBNF grammar.
                                                  int_[ ref(a) = _1 ] >> p.definedFunctions [ref(myFunction) = _1]
            >> int_[ ref(b) = _1 ] 
            );
    if (!success || first != end) {
        throw std::logic_error("Parsing failed");
    }
    std::stringstream ss;
    ss<<myFunction<<"("<<a<<","<<b<<")";
    return ss.str();
}

1 Ответ

0 голосов
/ 22 февраля 2019

Поскольку в сообщении об ошибке говорится, что вызов ref неоднозначен, потому что есть std::ref и boost::phoenix::ref.Добавьте

namespace phx = boost::phoenix;

вверху и используйте phx::ref в функции анализа.

...