2017-05-08 2 views
1

Beim Portieren meiner Lexer-Datei von Quex 0.64.8 auf 0.67.4 lief ich in einige Probleme mit dem String-Akku. Die Themen ich wie folgt aussehen:Probleme bei der Portierung von Lexer String-Akkumulator auf neue Version von Quex

Severity Code Description Project File Line Suppression State 
Error C3861 'ecmascript_lexer_Accumulator__clear': identifier not found (compiling source file C:\Users\Patrikj\Work\git\ecmascript_build_vc14_x64\generated\ecmascript_lexer.cpp) ktes C:\Users\Patrikj\Work\git\ecmascript\ecmascript.qx 107 

Ich nehme an, es ist die doppelt unterstrichen Accumulator__clear, dass die Ursache des Problems ist. Vielleicht muss ich einen neuen Switch zu Quex liefern oder vielleicht hat sich die API in der neueren Version geändert. So oder so bin ich ratlos, wie man das Problem beheben kann .

Und Beispiel aus meiner Lexer (.QX), die das Problem erzeugt:

mode StringHelper : EOF 
<inheritable: only> 
{ 
    on_exit { 
    /// All 3 rows using the accumulator generates an error similiar to the one mentioned above 
    if(self.accumulator.text.begin != self.accumulator.text.end) 
    self_send(TOK_STRLITPART); 

    self_accumulator_flush(TOK_QUOTE); 

    self_accumulator_clear(); 
    } 
} 

Jede Hilfe dieses Problems Festsetzung würde sehr geschätzt werden.

Mit freundlichen Grüßen, Patrik J

Antwort

1

Version 0.67.3 und später ausgeschlossen die Zeichenfolge Akkumulator von der Hauptgenerator. Der Grund dafür war, dass für einige Situationen keine allgemeine Lösung in den Konstrukt-, include-push-, - und Reset-Szenarien existiert. Benutzer müssen sie angeben, während sie mitgehen.

Für die Verwendung des Akkumulators ist keine Befehlszeilenoption erforderlich. jedoch in den .QX Dateien die folgenden Abschnitte müssen definiert werden (dies ist ein Beispiel):

header { 
#include <quex/code_base/extra/accumulator/Accumulator> 
} 

footer { 
#include <quex/code_base/extra/accumulator/Accumulator.i> 
} 
body { 
    QUEX_NAME(Accumulator)   accumulator; 
} 
constructor { 
    if(! QUEX_NAME(Accumulator_construct)(&me->accumulator, me)) { 
     return false; 
    } 
} 
destructor { 
    QUEX_NAME(Accumulator_destruct)(&me->accumulator); 
} 
print { 
    QUEX_NAME(Accumulator_print_this)(&me->accumulator); 
} 

Der Fall mit dem PostCategorizer gleich ist. Sie finden das Setup unten in 'common.qx' Dateien in den Demo-Unterverzeichnissen.

Auch nach 'flush()' müssen Sie nicht 'löschen()'.

Verwandte Themen