gpt4 book ai didi

c++ - 在 boost spirit 解析器中使用指针作为合成属性

转载 作者:搜寻专家 更新时间:2023-10-31 01:13:30 25 4
gpt4 key购买 nike

我想为我无法修改的对象树编写一个精神解析器。为了简化代码,我可以使用表达式示例:

class Expr
{
public:
virtual ~Expr() = 0;
};
Expr::~Expr() {}

class Plus : public Expr
{
public:
Plus (Expr* e1, Expr* e2) : _e1(e1), _e2(e2) {}
~Plus () {}
private:
Expr* _e1;
Expr* _e2;
};

class Num : public Expr
{
public:
Num(double n) : _n(n) {}
private:
double _n;
};

我检查了文档,发现了有用的 BOOST_ADAPT_STRUCT,但是使用规则声明为:

qi::rule<Iterator, Expr()> r;

当规则返回例如 Plus 对象时,我将对对象进行切片。所以我尝试这样:

template <typename Iterator>
struct ExprParser : qi::grammar<Iterator, Expr*(), ascii::space_type>
{

ExprParser()
: ExprParser::base_type (start, "expr")
{
expr = qi::double_ [ qi::_val = phoenix::new_<Num>(::_1) ]
| '('
>> expr
>> '+'
>> expr
>> ')' [ qi::_val = phoenix::new_<Plus>(::_1, ::_2) ]
;

start %= expr;
}

qi::rule<Iterator, Expr*(), ascii::space_type> expr;
qi::rule<Iterator, Expr*(), ascii::space_type> start;
};

但是我在语义操作中的赋值中遇到编译错误。我做错了什么?

编辑

sehe的回答不错!那里缺少括号和错误使用占位符。但是发生解析错误时内存泄漏怎么办?

最佳答案

如文档中所述

在“重要”下,您需要将 qi 占位符与 Phoenix 一起使用。我已经测试了固定代码。你可以在 http://liveworkspace.org/code/48dbfb55a0b7cbd4783b2f9f9a66d6d1 上看到它.

请注意,要编译第二个语义 Action ,需要额外的括号:

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

namespace qi = boost::spirit::qi;
namespace ascii = boost::spirit::ascii;
namespace phoenix = boost::phoenix;

class Expr
{
public:
virtual ~Expr() = 0;
};
Expr::~Expr() {}

class Plus : public Expr
{
public:
Plus (Expr* e1, Expr* e2) : _e1(e1), _e2(e2) {}
~Plus () {}
private:
Expr* _e1;
Expr* _e2;
};

class Num : public Expr
{
public:
Num(double n) : _n(n) {}
private:
double _n;
};

template <typename Iterator>
struct ExprParser : qi::grammar<Iterator, Expr*(), ascii::space_type>
{

ExprParser()
: ExprParser::base_type (start, "expr")
{
expr = qi::double_ [ qi::_val = phoenix::new_<Num>(qi::_1) ]
| ('('
>> expr
>> '+'
>> expr
>> ')') [ qi::_val = phoenix::new_<Plus>(qi::_1, qi::_2) ]
;

start %= expr;
}

qi::rule<Iterator, Expr*(), ascii::space_type> expr;
qi::rule<Iterator, Expr*(), ascii::space_type> start;
};

int main(int argc, const char *argv[])
{
char input[] = "3.14 + 39";
ExprParser<const char*> p;

const char *f = std::begin(input);
const char *l = std::end(input);
qi::phrase_parse(f, l, p, ascii::space);
}

关于c++ - 在 boost spirit 解析器中使用指针作为合成属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12410195/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com