Ö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