8

組み込みのパーサー ( 、など)boost::spirit::qiで構成されるストリームを解析するために to を正常に使用しています。ただし、これらのカテゴリのいずれにも適切に分類されないデータを解析する必要があります。たとえば、16.16 の固定小数点 2 進数を double に変換したいと考えています。たとえば、a に続いて aを解析します (固定小数点数から解析します)。byte_little_wordlittle_word << little_16p16uint16_tdouble

私は最初にセマンティック アクションを考えましたが、パーサーに関連付けられた属性の型を変更しないため、適切ではない (と思います...)。また、従業員の構造体解析の例をこの状況に適応させる方法もわかりません。これは、によって提供される暗黙のキャストに依存しているためboost::fusionです。大きな問題を引き起こさずuint32_tに toからの暗黙的なキャストを定義することは明らかにできないため、このアプローチはここでは機能しません。double

私の傾向は、組み込みのバイナリ プリミティブ パーサーをラップするか、ターミナル パーサーをゼロから作成するために非ターミナルを追加する必要があるということです。のソースを見た後でも、qi_binary.hppどうすればよいかわかりません。誰かがサンプルコードを提供したり、関連する参考文献を教えてくれたりできますか?

4

1 に答える 1

7
    template < typename Iterator >
    struct parser : boost::spirit::qi::grammar < Iterator, double(), boost::spirit::ascii::space_type >
    {
        struct cast_impl
        {
            template < typename A >
            struct result { typedef double type; };

            double operator()(boost::fusion::vector < boost::uint16_t, boost::uint16_t > arg) const
            {
                // cast here
                return 0;
            }
        };

        parser() : parser::base_type(main)
        {
            pair = boost::spirit::qi::little_word >> '.' >> boost::spirit::qi::little_word;
            main = pair[boost::spirit::qi::_val = cast(boost::spirit::qi::_1)];
        }

        boost::spirit::qi::rule < Iterator, boost::fusion::vector < boost::uint16_t, boost::uint16_t > (), boost::spirit::ascii::space_type > pair;
        boost::spirit::qi::rule < Iterator, double(), boost::spirit::ascii::space_type > main;

        boost::phoenix::function<cast_impl> cast;
    };

    int _tmain(int argc, _TCHAR* argv[])
    {
        typedef std::string container;

        container data_ = "\x01\x02.\x01\x02";

        container::iterator iterator_ = data_.begin();

        double value_;

        bool result_ =
            boost::spirit::qi::phrase_parse(iterator_, data_.end(),
            parser < container::iterator > (),
            boost::spirit::ascii::space,
            value_);

        return 0;
    }
于 2012-03-15T12:50:03.770 に答える