!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.
*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.
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.
Permutation. Parse a or b or a followed by b or b followed by 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 ^ bPermutation. Parse a or b or a followed by b or b followed by a
Hiç yorum yok:
Yorum Gönder