我想为我无法修改的对象树编写一个精神解析器。为了简化代码,我可以使用一个表达式示例:
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的回答很好!那里缺少括号和错误使用占位符。但是发生解析错误时内存泄漏怎么办?