16 Ağustos 2017 Çarşamba

spirit qi Character Classification Sınıfları

Giriş
Açıklaması şöyle
postfix operators as the Kleene Star (‘*’) and the Plus (‘+’) are moved to the front of the corresponding expression and written as prefix operators, and the optional operator (question mark) is rewritten using the unary minus (‘-‘).
Kleeene Star
Kleene Star için şöyle yaparız.
key =  qi::char_("a-zA-Z_") >> *qi::char_("a-zA-Z_0-9");
Optional Operator
Optional Operator (question mark) için şöyle
pair  =  key >> -('=' >> value);
One Or More Operator
Örnek 1
Artı için şöyle yaparız.
value = +qi::char_("a-zA-Z_0-9");
Örnek 2
Ayraç ile ayrılmış bir veya daha fazla kez tekrar eden şeyler için yani şu tür durumlar için
object.member().member().member()
Şöyle yaparız.
member_access_rule = 
  symbol_rule >> +('.' >> symbol_rule) >> '(' >> ')';
Örnek 3
+ ile ayrılmış token'lar için şöyle yaparız.
"X + Y + Z, A + B",
Token grupları da , karakteri ile ayrılmıştır.
typedef std::vector<std::string> element_array;

elem     = qi::lexeme [ +alpha ] % '+';
reaction = elem >> ',' >> elem;

qi::rule<Iterator, reaction_t(), qi::blank_type> reaction;
qi::rule<Iterator, element_array(), qi::blank_type> elem;
qi::alnum
A-Z ve a-z ve 0-9 arasındaki karakterleri kabul eder.  Şununla aynı şeydir.
+qi::char_("A-Za-z0-9")
'-' karakteri ile ayrılmış alfanümerik token için şöyle yaparız.
rule = +qi::alnum % qi::char_('-')
Eğer alfanümerik token ve '-' karakteri istersek şöyle yaparız.
+(qi::alnum | char_('-'))
Kural string döndürsün istersek şöyle yaparız.
qi::rule<Iterator,std::string()> rule;
qi::alpha
Şöyle yaparız.
...
id_p = +qi::alpha;
...
qi::rule <Iterator, std::string()> id_p;
Şöyle yaparız.
variableName = qi::alpha >> +qi::alnum;
...
qi::rule<Iterator, std::string()> variableName;
Şöyle yaparız. "Xi +"  string'ini parse eder.
typedef std::vector<std::string> element_array;

elem     = qi::lexeme [ +alpha ] % '+';
...
qi::rule<Iterator, element_array(), qi::blank_type> elem;
qi::char_
Örnek
key/value map parse etmek için bir örnek şöyle.
Örnek - plus operator
Şöyle yaparız.
+ascii::char_("0-9")
Örnek - plus operator
Şöyle yaparız..
+ascii::char_("0-9a-fA-F-")
Örnek - plus operator
Şöyle yaparız.
+ascii::char_("0-9.:")
Örnek - set
Şöyle yaparız.
ascii::char_('1', '2')
Örnek - variable bind
Elimizde şöyle bir string olsun.
a/b/c
Şöyle yaparız.
char delim = '/';
qi::rule<It, std::string()> element = *~qi::char_(delim);
qi::rule<It, std::vector<std::string>()> path = element % qi::char_(delim);

// use it like:
std::vector<std::string> data;
bool ok = qi::parse(f, l, path, data);
Ya da şöyle yaparız. Bu sefer delim değişkeni dinamik olarak kullanılabilir.
char delim = '/';
qi::rule<It, std::string()> element = *~qi::char_(boost::phoenix::ref(delim));
qi::rule<It, std::vector<std::string>()> path =  
  element % qi::char_(boost::phoenix::ref(delim));

// use it like:
std::vector<std::string> data;
bool ok = qi::parse(f, l, path, data);
Örnek - quoted string
Şöyle yaparız.
quoted_string = '"' >> +(qi::char_ - '"') >> '"';
qi::rule<Iterator, std::string()> quoted_string;
Örnek
Parse edilen alan verilen kurala uymuyorsa default değer atamak için şöyle yaparız.
+qi::char_("a-zA-Z0-9_ .()/-") | attr("(unspecified)");
qi::graph
Şöyle yaparız. Non-space printing characters yani boşluk olmayan metin için kullanılır.
token  = +qi::graph;
Şöyle yaparız.
*qi::lexeme[+qi::graph]
qi::space
Şöyle yaparız. out parametresi olarak bir karakter vector nesnesini doldurur.
+qi::space
Eğer şöyle yaparsak "-" karakteri yüzünden boost::optional "()" karakteri yüzüden boost::tuple nesnesi doldurur.
-(  +qi::space
    >> qi::lit("C:")
    >> qi::int_
    )
Şunu kullanırız.
boost::optional<boost::tuple<std::vector<char>,int>;


Hiç yorum yok:

Yorum Gönder