2

我正在研究 boost::spirit 以解析基于 ASCII 的协议。我设法使用如下规则从行中提取值:

rule<> Speed = uint_parser<unsigned int,10,3,3>()[assign_a(buffer.speed)];

我也成功地将这些规则以一种有意义的方式联系起来。完美的一天缺少以下内容:数据值是整数,需要使用固定的转换因子(通常是 10 的幂)转换为浮点值。

我现在所做的只是在解析后应用这些缩放因子。但是,我真的很想在字段的规则定义中包含比例因子。我想象这样的事情:

rule<> Speed = uint_parser<unsigned int,10,3,3>()[assign_a(buffer.speed,100)];

有什么建议么?

提前感谢阿恩

4

2 回答 2

1

一种方法是使用Boost.Phoenix。包括这些标题:

#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/phoenix_object.hpp> // For static_cast_
#include <boost/spirit/include/phoenix_operator.hpp> // For multiplication

然后使用类似的东西:

using namespace boost::phoenix;
using namespace boost::phoenix::arg_names;

rule<> Speed = uint_parser<unsigned int,10,3,3>()[
    ref(buffer.speed) = static_cast_<double>(arg1) * 100
];

虽然,我发现 phoenix 使用起来有点棘手,通常只写我自己的动作

struct assign_scaled
{
    double& result;
    double scale;

    assign_with_scale(double& r, double scale) : result(r), scale(scale) {}

    void operator()(unsigned int x) const
    {
        result = static_cast<double>(x) * scale;
    }
};

并像这样使用它:

    rule<> Speed = uint_parser<unsigned int,10,3,3>()[assign_scaled(buffer.speed, 100)];

这可能更冗长,但我发现它更容易维护。

于 2009-06-22T13:41:00.267 回答
0

使用 Spirit.Qi,您可以使用[ref(buffer.speed) = _1 * 100]

于 2010-01-08T09:06:02.877 回答