spirit x3 etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
spirit x3 etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

14 Haziran 2016 Salı

boost spirit x3

Bir struct parse etmek için şöyle yaparız.
//#define BOOST_SPIRIT_X3_DEBUG

#include <fstream>
#include <iostream>
#include <string>
#include <type_traits>
#include <vector>

#include <boost/fusion/include/adapt_struct.hpp>
#include <boost/fusion/include/io.hpp>
#include <boost/spirit/home/x3.hpp>
#include <boost/spirit/home/x3/support/ast/variant.hpp>

namespace x3 = boost::spirit::x3;

struct person
{
    std::string name;
    std::vector<std::string> friends;
};

BOOST_FUSION_ADAPT_STRUCT(
    person,
    (std::string, name)
    (std::vector<std::string>, friends)
);

auto const name = x3::rule<struct name_class, std::string> { "name" }
                = x3::raw[x3::lexeme[x3::alpha >> *x3::alnum]];

auto const root = x3::rule<struct person_class, person> { "person" }
                = name >> *name;

int main(int, char**)
{
  std::string const input = "bob john ellie";
  auto it = input.begin();
  auto end = input.end();

  person p;
  if (phrase_parse(it, end, root >> x3::eoi, x3::space, p))
  {
    std::cout << "parse succeeded" << std::endl;
    std::cout << p.name << " has " << p.friends.size() << " friends."
              << std::endl;
  }
  else
  {
    std::cout << "parse failed" << std::endl;
    if (it != end)
      std::cout << "remaining: " << std::string(it, end) << std::endl;
  }

  return 0;
}