2011-01-17 6 views
6

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!

Antwort

6

Spirit Lex arbeitet mit jedem Iterator, solange es den Anforderungen von Standard-Vorwärts-Iteratoren entspricht. Das bedeutet, dass Sie den Lexer (Aufruf lex::tokenize()) mit jedem entsprechenden Iterator einspeisen können. Zum Beispiel, wenn Sie eine std::istream verwenden möchten, können Sie es in eine boost::spirit::istream_iterator wickeln:

bool tokenize(std::istream& is, ...) 
{ 
    lex_functor_type< lex::lexertl::lexer<> > lex_functor; 

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

    return lex::tokenize(first, last, lex_functor, 
     boost::bind (lex_callback_functor(), _1, ...)); 
} 

und es würde funktionieren.

Für den zweiten Teil Ihrer Frage (bezogen auf die Zeilen-/Spaltennummer der Eingabe): Ja, es ist möglich, die Eingabeposition mit dem Lexer zu verfolgen. Es ist jedoch nicht trivial. Sie müssen einen eigenen Tokentyp erstellen, der die Zeilen-/Spalteninformationen speichert und diesen anstelle des vordefinierten Tokentyps verwendet. Viele Leute haben darum gebeten, also könnte ich einfach ein Beispiel schaffen.

+0

+1, ja, neue Beispiele in Spirit Dokumentation wäre toll :) – Viet

+1

Ich tat das tatsächlich. Boost V1.47 hat einen solchen Token-Typ und ein neues Beispiel, das zeigt, wie man es benutzt. – hkaiser

+0

Danke Harmut! Freue mich sehr auf Boost 1.47 Release mit neuem Spirit! – Viet

Verwandte Themen