boost.spirit i parsowanie wierszy ze strumienia IOStream

0

Mamy oto kod:
#include <boost/spirit/core.hpp>
#include <boost/spirit/iterator/multi_pass.hpp>

using namespace boost::spirit;
using namespace std;

ifstream in("input_file.txt"); // we get our input from this file

typedef char char_t;
typedef multi_pass<istreambuf_iterator<char_t> > iterator_t;

typedef skip_parser_iteration_policy<space_parser> iter_policy_t;
typedef scanner_policies<iter_policy_t> scanner_policies_t;
typedef scanner<iterator_t, scanner_policies_t> scanner_t;

typedef rule<scanner_t> rule_t;

iter_policy_t iter_policy(space_p);
scanner_policies_t policies(iter_policy);
iterator_t first(
    make_multi_pass(std::istreambuf_iterator<char_t>(in)));

scanner_t scan(
    first, make_multi_pass(std::istreambuf_iterator<char_t>()),
    policies);

rule_t      n_list = real_p >> *(',' >> real_p);
match<>     m = n_list.parse(scan);

Ten kod jest ściągnięty ze dokumentacji boost.spirit z tematu "The multi_pass".
Powyższy program analizuje Od razu cały plik input_file.txt parserem n_list a nie kolejne wiersze.
Pytanie:Jak przekształcić powyższy program by parsował kolejne wiersze parserem n_list a nie jednocześnie cały plik.
Za każdą pomoc wdzięcznie dziękuję!

0

w boost::spirit parsery generalnie oparte na iteratorach, i sa niezalezne od konkretnego typu iteratora. powinno wystarczyc podmiana iteratorow z istreambuf_iterator<char_t> na przyklad na std::const_iterator, zakladjac ze poszczegolne linie bedziesz trzymac w std::string

0

A nie wystarczy napisać swój własny iterator, który nierozróżnia końca linii od końca pliku z funckją good() zwaracającą true gdy nie koniec pliku false gdy koniec.

0

ozywanie starych watkow czesto sie mija z celem.. jak cos potrzebujesz zaloz watek nowy i daj linka do archiwalnego, zamiast ozywiac archiwalny..

A nie wystarczy napisać swój własny iterator, który nierozróżnia końca linii od końca pliku z funckją good() zwaracającą true gdy nie koniec pliku false gdy koniec

  1. po co pisac wlasny skoro sa gotowe?
  2. co by taki iterator dal? autor postu umie obslugiwac iteratory plikowe, chodzilo o 'przylozenie' istniejacego parsera na konkretne, kolejne linie
  3. czym by sie owa good() roznila od filestream::good() ? i co on aby wnosila? jakos nie widze zysku

1 użytkowników online, w tym zalogowanych: 0, gości: 1