使用Boost-pripit的功能解析器

function parser using boost-spirit

本文关键字:功能 Boost-pripit 使用      更新时间:2023-10-16

我正在尝试使用Boost Spirit解析功能。当我尝试将匹配函数保存到字符串中时,我会遇到汇编错误。

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();
}

由于错误消息说ref的呼叫是模棱两可的,因为有std::refboost::phoenix::ref。添加

namespace phx = boost::phoenix;

到顶部并在解析功能中使用phx::ref