8 Temmuz 2016 Cuma

boost spirit qi

Giriş
Şu satırı dahil ederiz.
#include <boost/spirit/include/qi.hpp>
Daha kolay kullanmak için şöyle yaparız.
namespace qi = boost::spirit::qi;
qi::grammar
spirit qi grammar struct yazısına taşıdım.

Character Parserlar
qi::char_
Tek bir karakteri okumak için şöyle yaparız.
ch_p("(")
Belirtilen karakter olmadığı müddetçe okumak için şöyle yaparız.
*~ch_p("]")
Arka arkaya karakterleri okumak için şöyle yaparız.
'x' >> 'y' >> 'z'
qi::lit
Şöyle tanımlarız.

...
id_p           = +qi::alpha;
enum_specifier = qi::lit("enum") >> '{' >> (id_p % ',') >> '}';
...

qi::rule<Iterator, std::vector<std::string>(), Skipper> enum_specifier;
qi::rule<Iterator, std::string()> id_p;
...
Character Sınıflandırma Parserlar
qi::alnum
qi spirit Character Sınıflandırma Parserları yazısına taşıdım.

qi::alpha
qi spirit Character Sınıflandırma Parserları yazısına taşıdım.

Numeric Parserlar
qi::double_
Şöyle yaparız.
(double_ >> ',' >> double_ >> ',' >> double_)
Auxilary Parserlar
qi::eps
Şöyle yaparız. Her türlü boşluğu atla ve integer parse et anlamına gelir.
start %= qi::eps > qi::int_[boost::bind(&checkNum, _1)];
qi::eoi
End of input demek. Şöyle yaparız.
#include <boost/spirit/include/qi.hpp>

template <typename Iterator> bool myParser(Iterator first, Iterator last) {
    namespace qi = boost::spirit::qi;
    return qi::parse(first, last, qi::double_ >> qi::eoi);
}

int main() {
  std::string const dstr("2.1");
  bool r = myParser(dstr.begin(), dstr.end());
  return r?0:1;
}
Parser Operators
List Operator
alpha , alpha , alpha şeklinde bir listeyi ifade etmemizi sağlar. Şöyle yaparız.
id_p           = +qi::alpha;
enum_specifier = qi::lit("enum") >> '{' >> (id_p % ',') >> '}';

Hiç yorum yok:

Yorum Gönder