5

我正在尝试编写一个解析器(作为第一步,当然它会被扩展很多)解析一个双精度并通过将该双精度传递给我的类的工厂方法来创建我的类 ExpressionTree 的一个对象。这是我的第一次尝试

struct operands : qi::grammar<string::iterator, ExpressionTree()> 
{

    operands() : operands::base_type(start) 
    {
        start = qi::double_[qi::_val = ExpressionTree::number(qi::_1)];
    }

    qi::rule<string::iterator, ExpressionTree()> start;

};

这不会编译 ( can't convert from boost::spirit::_1_type to double) 因为(如果我理解正确的话)qi::_1不是双精度数,而仅计算为双精度数。

我尝试boost::bind(&ExpressionTree::number, _1)以任何方式使用,但我不知道如何获得分配给属性的结果_val

如果有人能指出我正确的方向,我将不胜感激。

4

1 回答 1

4

您需要在语义操作中使用惰性参与者。

我假设number是静态一元函数或非静态零元(而不是例如类型):

start = qi::double_ [ qi::_val = boost::phoenix::bind(&ExpressionTree::number, qi::_1)];

如果它是一种类型:

start = qi::double_ [ qi::_val = boost::phoenix::construct<ExpressionTree::number>(qi::_1)];

也可以看看

于 2013-05-14T16:15:31.973 回答