2017-05-08 1 views
1

Früher habe ich meine Quex angetrieben Lexer mit einem std::basic_stringstream<char> füttern an den Konstruktor gesendet wird, als solche:Probleme Lexer auf neuere Version von Quex Portierung

typedef std::basic_stringstream<char> UStringStream; 
UStringStream tokenStream(sCode); 
quex::ecmascript_lexer ecmascript_lexer(&tokenStream); 

Das funktionierte Quex 0.64.8 verwenden, aber es scheint, die API hat geändert seit seitdem scheint es nicht mit Version 0.67.4 zu arbeiten.

Jeder Hinweis, wie ich meinen Code auf die neue Version portieren sollte, würde sehr geschätzt werden.

Mit freundlichen Grüßen,

Patrik J

EDIT: die Frage nach dem String Speicher entfernt, es wird als eine separate Frage erneut gebucht werden.

Antwort

0

Dies sind eigentlich zwei Fragen. Angenommen, Sie bearbeiten Ihren Text so, dass sich diese Frage auf die neue Konstruktor-API bezieht. Für den Akku, bitte eine separate Frage stellen.

Die neue API für Konstruktor, include_push und Reset wurde vollständig redone, so dass es mit jeder Art von Eingabe fertig werden kann. Der Schlüssel dazu ist die Abstraktion eines 'ByteLoader'. ByteLoader sind implementiert für C-Standard Dateien und Streams, POSIX Dateideskriptoren (-> für Sockets verwenden), und direktes Laden aus dem Speicher (gute Prüfung für große Mengen von Szenarien in Unit Tests). Nun, wie wird das benutzt?

erstellen ByteLoader für Ihre Eingabe Szenario, nämlich 'std :: Strom':

QUEX_NAME(ByteLoader)* byte_loader = QUEX_NAME(ByteLoader_stream_new)(&my_stream); 

gibt es dann an den Konstruktor (oder Platzierung neu):

MyLexer lexer(byte_loader, /* converter */0); 

Wenn Sie möchten, Arbeiten Sie an konvertierten Inhalten, müssen Sie möglicherweise einen Konverter erstellen und als zweites Argument übergeben. Somit wird der vollständige Code so etwas wie:

QUEX_NAME(ByteLoader)* byte_loader = QUEX_NAME(ByteLoader_stream_new)(&my_stream); 
QUEX_NAME(Converter)* converter = QUEX_NAME(Converter_IConv_new)("UTF-8", NULL); 
MyLexer    lexer(byte_loader, converter); 

Diese Art der Konstruktion eines Lexer für maximal an Flexibilität ermöglicht. Es gibt keine Beschränkung auf C-Standard-Dateischnittstellen, der Eingang kann von jeder Quelle kommen, wie Sockets oder die serielle Leitung. Und die Konvertierung der eingehenden Daten erfolgt hinter den Kulissen, während die Synchronisation mit dem Inhalt des Puffers vollständig durch die Lexer Eninge getan wird.

Beachten Sie, dass der Konstruktor Ownership des ByteLoader und Konverter an den lexikalischen Analysator überträgt. Sie müssen diese nicht manuell löschen.

Kopf- und Implementierungen für ByteLoader-s und Converter-s sind befindet sich in

$QUEX_PATH/quex/code_base/buffer/bytes/... 

und

$QUEX_PATH/quex/code_base/buffer/lexatoms/converter/... 

Wenn Sie neue Arten von ByteLoader-s oder Converter-s, legt sie als ein Patch. Sobald sie getestet werden, werden sie wahrscheinlich in die Codebasis eingegeben.

+0

Danke, Frank! Die neue API ist wirklich ordentlich, wenn Sie wissen, wie es funktioniert :) – PatrikJ

Verwandte Themen