Ich schreibe einen Lexer mit boost :: spirit :: lex, aber alle Beispiele, die ich finden kann, scheinen davon auszugehen, dass Sie zuerst die gesamte Datei in RAM gelesen haben. Ich möchte einen Lexer schreiben, der nicht die gesamte Zeichenfolge im RAM benötigt, ist das möglich? Oder muss ich etwas anderes verwenden?Wie Boost :: Spirit :: Lex verwendet wird, um eine Datei zu lexieren, ohne zuerst die gesamte Datei in den Speicher einzulesen?
Ich versuchte mit istream_iterator, aber Boost gibt mir einen Kompilierfehler, wenn ich const char * als Iterator-Typen verwenden.
z.B. Alle Beispiele, die ich finden kann, im Grunde tun:
lex_functor_type< lex::lexertl::lexer<> > lex_functor;
// assumes entire file is in memory
char const* first = str.c_str();
char const* last = &first[str.size()];
bool r = lex::tokenize(first, last, lex_functor,
boost::bind(lex_callback_functor(), _1, ...));
Auch ist es möglich, Zeile/Spalte Zahlen von lex Token irgendwie zu bestimmen?
Danke!
+1, ja, neue Beispiele in Spirit Dokumentation wäre toll :) – Viet
Ich tat das tatsächlich. Boost V1.47 hat einen solchen Token-Typ und ein neues Beispiel, das zeigt, wie man es benutzt. – hkaiser
Danke Harmut! Freue mich sehr auf Boost 1.47 Release mit neuem Spirit! – Viet