24 Ağustos 2017 Perşembe

spirit x3 property

Örnek
label=value şeklindeki bir string'i parse edip yapımızın bir değişkenine atamak için şöyle yaparız.
auto property = [](auto label, auto member) {
  return rule(label, x3::as_parser(label) >> '=' >> make_member_parser(member));
};
make_member_parser metodu şöyledir
template <typename T>
auto make_member_parser(int T::* const member) //for int
{ return x3::int_ [propagate(member)]; }

template <typename T>
auto make_member_parser(bool T::* const member) //for bool
{ return x3::bool_ [propagate(member)]; }

template <typename T>
auto make_member_parser(std::string T::* const member) //for custom parser
{ return x3::raw[colors] [propagate(member)]; 
Burada kullanılan colors custom bir parser olup şöyledir.
struct colors_type : x3::symbols<char> {
  colors_type() {
    this->add("red")("blue")("green")("black");
  }
} static const colors;
propagate şöyledir
template <typename T> auto propagate(T member) {
  return [=](auto& ctx){ x3::traits::move_to(x3::_attr(ctx), x3::_val(ctx).*member); };
}
Elimizde custom bir parser olsun
// custom type parsers
auto quoted = rule<std::string>("quoted",
  x3::lexeme [ '"' >> *('\\' >> x3::char_ | ~x3::char_('"')) >> '"' ]);
İlk rule şöyle olsun. Yani Layer kelimesi ile başlayıp ".." quoted string ile devam etsin. Quoted string içindeki değer layerName alanına atanır
auto name = rule("name", "Layer" >> quoted [propagate(&LayerInfo::layerName)]);
Devam eden rule'lar şöyle olsun. Layer ".." 'dan sonra number veya color veya visible rule'ları gelebilir.
auto number     = property("number", &LayerInfo::layerNumber);
auto color      = property("color", &LayerInfo::color);
auto visible    = property("visible", &LayerInfo::visible);

auto layer_info = name >> '{' >> +(number | color | visible) >> '}';
Başlangıç kuralı ise şöyle olsun
auto grammar    = rule("layer_info", layer_info);
Bu durumda şu string'i parse edebiliriz.
Layer "L1" {
    number = 23
    color = green
    visible = true
};
Örnek
Benzer bir çözüm burada.

Hiç yorum yok:

Yorum Gönder