Örnek
label=value şeklindeki bir string'i parse edip yapımızın bir değişkenine atamak için şöyle yaparız.
Benzer bir çözüm burada.
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 şöyledirtemplate <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 şöyledirtemplate <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ırauto 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 olsunauto grammar = rule("layer_info", layer_info);
Bu durumda şu string'i parse edebiliriz.Layer "L1" {
number = 23
color = green
visible = true
};
ÖrnekBenzer bir çözüm burada.
Hiç yorum yok:
Yorum Gönder