20 Şubat 2018 Salı

spirit qi Symbol Parser Sınıfları

Giriş
String Parser sınıfları ile kardeştirler.

qi::symbols
Bu sınıf qi::grammar ile beraber kullanılır. Belirtilen sembol dizisi ile eşleşir.

Tanımlama
Örnek
Elimizde AST isim alanında şöyle bir tanım olsun
namespace AST {

  struct TimeSample {
    enum Direction { up, down } direction; // + or -
    ...
  }
}
Şöyle yaparız.
struct directions : qi::symbols<char, AST::TimeSample::Direction> {
  directions() { add("+", AST::TimeSample::up)("-", AST::TimeSample::down); }
} direction_;
Örnek 
Elimizde AST isim alanında şöyle bir tanım olsun
namespace AST {
  using clock = std::chrono::high_resolution_clock;
  ...
}
Şöyle yaparız.
struct units : qi::symbols<char, AST::clock::duration> {
  units() {
    using namespace std::literals::chrono_literals;
    add("s", 1s)("ms", 1ms)("us", 1us)("µs", 1us)("ns", 1ns);
  }
} units_;
add metodu
Şöyle yaparız.
qi::symbols<char> much;
for (auto kw : {"bar", "baz", "qux", "quux", "corge", "grault", "garply",
 "waldo", "fred", "plugh", "xyzzy", "thud"})
   much.add(kw);
for_each metodu
Şöyle yaparız.
qi::rule<It, std::string()> match_much = qi::raw [ much ];

much.for_each([&](std::string const& kw, qi::unused_type) {
  std::string matched;
  assert(qi::parse(kw.begin(), kw.end(), match_much, matched));
  assert(kw == matched);
});
operator+= metodu
add metodu ile aynıdır. Şöyle yaparız.
qi::symbols<char> find_list;
find_list += "des", "ffe", "asaa";
Şöyle yaparız.
std::string const test = "abc def aaa ffew";

std::string result;
if (qi::parse(test.begin(), test.end(), qr::seek[qi::raw[find_list]], result)) {
  std::cout << result << std::endl;
} else {
  std::cout << "failed." << std::endl;
}
Çıktı olarak şunu alırız.
ffe

Hiç yorum yok:

Yorum Gönder