Frage

Ich bin Tauchen in boost :: spirit, um ein ASCII-basierten Protokoll zu analysieren. Ich mananged Werte aus der Zeile wie diese mithilfe von Regeln zu extrahieren:

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

ich auch gelingen, diese Regeln in einer sinnvollen Art und Weise zu verbinden. Was ist für einen perfekten Tag fehlt, ist die folgende: Die Datenwerte sind ganze Zahlen, die auf Fließkommawert mit einem festen Umrechnungsfaktor (in der Regel Kräfte von 10) transformiert werden müssen.

Was ich jetzt gerade ist appying diese Skalierungen Faktoren nach dem Parsen. Allerdings würde ich wirklich den Skalierungsfaktor enthalten nur innerhalb der Regeldefinition für das Feld apprechiate. Ich stelle mir so etwas wie folgt aus:

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

Irgendwelche Vorschläge?

Vielen Dank im Voraus Arne

War es hilfreich?

Lösung

Eine Möglichkeit, dies zu tun ist, Boost.Phoenix . Fügen Sie diese Header:

#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

und verwenden Sie dann so etwas wie:

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
];

Obwohl ich phoenix finde ein bisschen schwierig zu bedienen und in der Regel nur schreibe meine eigene Aktion :

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

Und es wie folgt verwendet werden:

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

Dies kann ausführlicher sein, aber ich finde es leichter zu pflegen.

Andere Tipps

Mit Spirit.Qi können Sie [ref(buffer.speed) = _1 * 100] verwenden

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top