30 Ekim 2017 Pazartesi

spirit qi Parser Operators

!a
Not predicate. If the predicate a matches, fail. Otherwise, return a zero length match.

&a
And predicate. If the predicate a matches, return a zero length match. fail. Otherwise, fail.

-a
Optional. Parse a zero or one time.
Örnek
Şöyle yaparız. - operatörü ile string'in 0 veya daha fazla capture group ile başlayabiliceği belirtiliyor.
Capture group ise delimeter olmayan 0 veya daha fazla karakter.
static auto const delim = boost::spirit::x3::char_(",");

for (std::string test : {
  "", "token", 
  ",", "token,", ",token", 
  ",,", ",token,", ",,token", "token,,"
})
{
  std::vector<std::string> result;
  parse(test.begin(), test.end(), -(+~delim) % delim, result);

  for (auto& tok : result)
    std::cout << std::quoted(tok, '\'') << " ";
}

*a
Kleene. Parse a zero or more times

+a
Plus. Parse a one or more times.

a | b
Alternative. Parse a or b

a >>  b
Sequence. Parse a followed by b

a - b
Difference. Parse a but not b
Örnek
Elimizde şöyle bir string olsun. Sınıfın ismini ve kalttığı arayüzleri parse etmek isteylim.
class AClass implements Interface1, Interface2, Interface3,Interface4
Önce bu yapı için bir sınıf tanımlarız.
struct ClassDecl {
  std::string name;
  std::vector<std::string> interfaces;
};
Sınıf ve arayüz isimleri için bir kural tanımlarız.
qi::rule<It, std::string()> ident = qi::alpha >> *(qi::alnum | qi::char_('_'));
Gramer şöyledir. Burada - operator kullanılarak implements ile başlayan ve liste ile devam eden kısım hariç bırakılarak sınıf ismi bulunuyor. Daha sonra arayüz listesi elde ediliyor.
"class" >> ident >> -("implements" >> (ident % ','))

a ||  b
Sequential Or. Parse a or b or a followed by b.

a %  b
List. Parse a delimited b one or more times.
Örnek
Şöyle yaparız. Ayraç olarak satır sonu kullanılır. qi::eol parser'ın çalışması için stream noskipws ile kullanılır.
std::ifstream ifs("input.txt");
ifs >> std::noskipws;

boost::spirit::istream_iterator f(ifs), l;

std::vector<Edge> v;
bool parse_ok = qi::phrase_parse(f, l, (qi::int_ >> qi::int_) % qi::eol, qi::blank, v);
a ^ b
Permutation. Parse a or b or a followed by b or b followed by a







Hiç yorum yok:

Yorum Gönder