10 Kasım 2016 Perşembe

spirit lex tokenize metodu

Önce token'lara sayı veririz. Şöyle yaparız.
// Token ids
enum token_ids {
    ID_EOL= 100
};

// Token definition
template <typename Lexer>
struct var_replace_tokens : boost::spirit::lex::lexer<Lexer> {
  var_replace_tokens() {
    this->self.add ("\n", ID_EOL); // newline characters
  }
};
Her token'ı saymak için functor yaparız. Şöyle yaparız.
// Functor
struct replacer {
  typedef bool result_type;
  template <typename Token>
  bool operator()(Token const& t, std::size_t& lines) const  {
    switch (t.id()) {
      case ID_EOL:
        lines++;
        break;  
    }
    return true;
  }
};
lexer''ı kurarız. Şöyle yaparız.
size_t lines=0;

var_replace_tokens<
 boost::spirit::lex::lexertl::lexer<
   boost::spirit::lex::lexertl::token<
     boost::spirit::istream_iterator> > > var_replace_functor;
lexer'ı functor ile çağırırız. Şöyle yaparız.
cin.unsetf(std::ios::skipws);

boost::spirit::istream_iterator first(cin);
boost::spirit::istream_iterator last;

bool r = boost::spirit::lex::tokenize(first, last, var_replace_functor,
  boost::bind(replacer(), _1, boost::ref(lines)));

if (r) {
  cerr<<"Lines processed: "<<lines<<endl;
}  else {
  string rest(first, last);
  cerr << "Processing failed at: "<<rest<<" (line "<<lines<<")"<<endl;
}



Hiç yorum yok:

Yorum Gönder