Giriş
Şu satırı dahil ederiz.
Şöyle yaparız
get_line metodu
iterator'ün satır numarasını verir.
Örnek
Şöyle yapaırz. line_no kuralı işleyince line_number metodunu tetikler. Bu metod line_number_f yapısının operator() metodunu çalıştırır.
Şu satırı dahil ederiz.
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>
#include <boost/spirit/include/support_line_pos_iterator.hpp>
#include <boost/spirit/repository/include/qi_iter_pos.hpp>
Constructor - boost::spirit::istream_iterator + boost::spirit::istream_iteratorŞöyle yaparız
using Underlying = boost::spirit::istream_iterator;
using It = boost::spirit::line_pos_iterator<Underlying>;
std::ifstream ifs("main.cpp");
It f(Underlying{ifs >> std::noskipws}), l;
Diğerget_line metodu
iterator'ün satır numarasını verir.
Örnek
Şöyle yapaırz. line_no kuralı işleyince line_number metodunu tetikler. Bu metod line_number_f yapısının operator() metodunu çalıştırır.
namespace qi = boost::spirit::qi;
namespace qr = boost::spirit::repository::qi;
using LineNum = size_t;
struct line_number_f {
template <typename It> LineNum operator()(It it) const { return get_line(it); }
};
static boost::phoenix::function<line_number_f> line_number_;
qi::rule<It, LineNum()> line_no = qr::iter_pos [ qi::_val = line_number_(qi::_1) ];
std::multimap<LineNum, std::string> words;
if (qi::phrase_parse(f, l, +(line_no >> qi::lexeme[+qi::graph]), qi::space, words)) {
...
}
Daha sonra multimap'e erişmek için şöyle yaparız.std::cout << "Line 20 contains:\n";
auto p = words.equal_range(20);
for (auto it = p.first; it != p.second; ++it)
std::cout << " - '" << it->second << "'\n";
Çıktı olarak şunu alırızLine 20 contains:
- 'int'
- 'main()'
- '{'
Hiç yorum yok:
Yorum Gönder