27 Ekim 2017 Cuma

spirit qi locals

Giriş
qi::locals parse edilmiş yerel bir değişken içinde saklanması ve başke bir parser içinde kullanılması içindir.

Örnek
Şöyle yaparız. _len değişkeni payload'un büyüklüğünü tutar. repeat ile bu kadar byte okunur.
template <typename It>
struct FileFormat : qi::grammar<It, FormatData()> {
  FileFormat() : FileFormat::base_type(start) {
    using namespace qi;

    signature  = string("SIGN");     // 4 byte signature, just for example
    header     = repeat(16) [byte_]; // 16 byte header, same

    payload   %= omit[little_word[_len=_1]] >> repeat(_len) [byte_];
    start      = signature >> header >> payload;

    //BOOST_SPIRIT_DEBUG_NODES((start)(signature)(header)(payload))
  }
private:
  qi::rule<It, FormatData()> start;
  qi::rule<It, std::string()> signature, header;

  qi::_a_type _len;
  qi::rule<It, std::string(), qi::locals<uint16_t> > payload;
};

Örnek
Şöyle yaparız.
qi::rule<decltype(it), qi::locals<int> > p;
{
    using namespace qi;
    _a_type objSize; // the first local placeholder

    p = (
        (char_('\x01'))
     >> (char_[objSize = phx::bind(getObjSize, _1)])
     >> (repeat(objSize)[char_])
    );
}

Hiç yorum yok:

Yorum Gönder