ct_common
1.0.1
Common library for combinatorial testing
|
00001 /* -*- C++ -*- vim: set syntax=cpp: 00002 * CONTENT: 00003 * 00004 * (1) Includes for required standard headers. 00005 * (2) Definitions of options and settings for the particular application. 00006 * (3) #include <quex/code_base/definitions> for default settings. 00007 * (4) Lexical Analyzer class lexer and its memento class. 00008 * (5) Constructor and init core of lexer. 00009 * (6) Memento pack and unpack functions. 00010 * 00011 * File content generated by Quex 0.62.6. 00012 * 00013 * (C) 2005-2012 Frank-Rene Schaefer 00014 * ABSOLUTELY NO WARRANTY */ 00015 #ifndef __QUEX_INCLUDE_GUARD__ANALYZER__GENERATED____CT____LEXER 00016 #define __QUEX_INCLUDE_GUARD__ANALYZER__GENERATED____CT____LEXER 00017 00018 #ifdef __QUEX_INCLUDE_INDICATOR__ANALYZER__MAIN 00019 /* In case that multiple lexical analyzers are used the same header 00020 * files are compiled with a different setting of the macros. The 00021 * undef of the include guards happens in the following file. */ 00022 # ifdef __QUEX_SIGNAL_DEFINED_LEXER_IN_NAMESPACE___CT__ 00023 # error "More than one lexical analyzer have been generated in the same name space. Read documentation on command line option '-o'." 00024 # endif 00025 # include <quex/code_base/include-guard-undef> 00026 # include <quex/code_base/analyzer/member/token-sending-undef.i> 00027 # undef __QUEX_INCLUDE_GUARD__ANALYZER__CONFIGURATION____CT____LEXER 00028 #else 00029 # define __QUEX_INCLUDE_INDICATOR__ANALYZER__MAIN 00030 #endif 00031 #define __QUEX_SIGNAL_DEFINED_LEXER_IN_NAMESPACE___CT__ 00032 00033 #include "ct_lexer-configuration.hpp" 00034 00035 #include <quex/code_base/definitions> 00036 00037 QUEX_NAMESPACE_MAIN_OPEN 00038 struct QUEX_NAME(Engine_tag); 00039 struct QUEX_NAME(Memento_tag); 00040 00041 class QUEX_TYPE0_ANALYZER; /* lexer */ 00042 typedef __QUEX_TYPE_ANALYZER_RETURN_VALUE (*QUEX_NAME(AnalyzerFunctionP))(QUEX_TYPE_ANALYZER*); 00043 QUEX_NAMESPACE_MAIN_CLOSE 00044 00045 /* Token Class Declaration must preceed the user's header, so that the user 00046 * can refer to it at ease. */ 00047 QUEX_NAMESPACE_TOKEN_OPEN 00048 class QUEX_TYPE0_TOKEN; 00049 QUEX_NAMESPACE_TOKEN_CLOSE 00050 00051 /* START: User defined header content _________________________________________ 00052 * Must come before token class definition, since the token class 00053 * might rely on contents of the header. */ 00054 00055 # line 13 "ct_lexer.qx" 00056 00057 #include <ct_common/file_parse/ct_parser.tab.hpp> 00058 #include <ct_common/common/utils.h> 00059 QUEX_NAMESPACE_MAIN_OPEN 00060 class DLL_EXPORT ct_lexer; 00061 class DLL_EXPORT ct_lexer_Token; 00062 QUEX_NAMESPACE_MAIN_CLOSE 00063 00064 # line 65 "ct_lexer.hpp" 00065 00066 00067 /* END: _______________________________________________________________________*/ 00068 00069 #if defined(__QUEX_OPTION_CONVERTER_HELPER) 00070 # include "quex/code_base/converter_helper/from-unicode-buffer" 00071 #endif 00072 #include <quex/code_base/analyzer/headers> 00073 00074 #include "ct_lexer-token_ids.h" 00075 #include "ct_lexer-token.hpp" 00076 00077 QUEX_NAMESPACE_MAIN_OPEN 00078 00079 enum { 00080 QUEX_NAME(ModeID_NORMAL) = 0 00081 }; 00082 00083 extern QUEX_NAME(Mode) QUEX_NAME(NORMAL); 00084 00085 00086 extern __QUEX_TYPE_ANALYZER_RETURN_VALUE QUEX_NAME(NORMAL_analyzer_function)(QUEX_TYPE_ANALYZER*); 00087 #ifdef QUEX_OPTION_RUNTIME_MODE_TRANSITION_CHECK 00088 extern bool QUEX_NAME(NORMAL_has_base)(const QUEX_NAME(Mode)*); 00089 extern bool QUEX_NAME(NORMAL_has_entry_from)(const QUEX_NAME(Mode)*); 00090 extern bool QUEX_NAME(NORMAL_has_exit_to)(const QUEX_NAME(Mode)*); 00091 #endif 00092 00093 00094 00095 typedef struct QUEX_NAME(Memento_tag) { 00096 # include <quex/code_base/analyzer/EngineMemento_body> 00097 00098 QUEX_NAME(Memento_tag)() {} /* Con- and Destruction necessary to trigger */ 00099 ~QUEX_NAME(Memento_tag)() {} /* con- and destruction of user members. */ 00100 00101 /* START: User's memento extentions ___________________________________________*/ 00102 00103 /* END: _______________________________________________________________________*/ 00104 } QUEX_NAME(Memento); 00105 00106 QUEX_NAMESPACE_MAIN_CLOSE 00107 00108 #include <quex/code_base/temporary_macros_on> 00109 00110 QUEX_NAMESPACE_MAIN_OPEN 00111 00112 class lexer { 00113 public: 00114 # include <quex/code_base/analyzer/Engine_body> 00115 00116 /* DISABLED */ lexer(const lexer&); 00117 public: 00118 typedef QUEX_TYPE_TOKEN token_type; 00119 typedef QUEX_TYPE_TOKEN_ID token_id_type; 00120 typedef QUEX_TYPE_CHARACTER char_type; 00121 00122 lexer(QUEX_TYPE_CHARACTER* BufferMemoryBegin, size_t BufferMemorySize, 00123 QUEX_TYPE_CHARACTER* BufferEndOfContentP = 0x0, 00124 const char* CharacterEncodingName = 0x0, 00125 bool ByteOrderReversionF = false); 00126 lexer(const std::string& Filename, 00127 const char* CharacterEncodingName = 0x0, 00128 bool ByteOrderReversionF = false); 00129 lexer(std::istream* p_input_stream, 00130 const char* CharacterEncodingName = 0x0, 00131 bool ByteOrderReversionF = false); 00132 # if defined(__QUEX_OPTION_WCHAR_T) 00133 lexer(std::wistream* p_input_stream, 00134 const char* CharacterEncodingName = 0x0, 00135 bool ByteOrderReversionF = false); 00136 # endif 00137 lexer(std::FILE* input_fh, 00138 const char* CharacterEncodingName = 0x0, 00139 bool ByteOrderReversionF = false); 00140 # if defined(__QUEX_OPTION_UNIT_TEST) 00141 template <class UnderlyingStreamT> 00142 lexer(quex::StrangeStream<UnderlyingStreamT>* p_input_stream, 00143 const char* CharacterEncodingName = 0x0, 00144 bool ByteOrderReversionF = false); 00145 # endif 00146 00147 virtual ~lexer(); 00148 00149 /* Direct Access to Memory */ 00150 void* buffer_fill_region_append(void* ContentBegin, 00151 void* ContentEnd); 00152 void* buffer_fill_region_append_conversion(void* ContentBegin, 00153 void* ContentEnd); 00154 void* buffer_fill_region_append_conversion_direct(void* ContentBegin, 00155 void* ContentEnd); 00156 void buffer_fill_region_prepare(); 00157 QUEX_TYPE_CHARACTER* buffer_fill_region_begin(); 00158 QUEX_TYPE_CHARACTER* buffer_fill_region_end(); 00159 size_t buffer_fill_region_size(); 00160 void buffer_fill_region_finish(const size_t LoadedN); 00161 void buffer_conversion_fill_region_prepare(); 00162 uint8_t* buffer_conversion_fill_region_begin(); 00163 uint8_t* buffer_conversion_fill_region_end(); 00164 size_t buffer_conversion_fill_region_size(); 00165 void buffer_conversion_fill_region_finish(const size_t ByteN); 00166 QUEX_TYPE_CHARACTER* buffer_lexeme_start_pointer_get(); 00167 void buffer_input_pointer_set(QUEX_TYPE_CHARACTER*); 00168 00169 /* -- activate/deactivate byte order reversion (big-/little-endian) */ 00170 bool byte_order_reversion(); 00171 void byte_order_reversion_set(bool Value); 00172 00173 /* NOTE: All calls to receive functions for 'queue' and 'single' 00174 * are deliberately chosen to be incompatible! Thus, when 00175 * the user switches the token passing policy, he must re- 00176 * think his receive mechanism. */ 00177 # if defined(QUEX_OPTION_TOKEN_POLICY_QUEUE) 00178 /* (1) Token Queue 00179 * 00180 * When using a token queue, the pointer **must** be adapted. 00181 * Otherwise, very strange results may occur. Force the user to 00182 * provide a pointer that can be adapted by having him specify 00183 * the second argument--not only a return value. 00184 * 00185 * Command line option: --token-policy queue */ 00186 void receive(QUEX_TYPE_TOKEN**); 00187 # elif defined(QUEX_OPTION_TOKEN_POLICY_SINGLE) 00188 /* (2) Single Token 00189 * 00190 * When there is only one single token as interface, than the 00191 * token id is returned. This enables a minimal setup were the 00192 * analyzer may only return a token id and does not work on tokens. 00193 * 00194 * Command line options: --token-policy single */ 00195 QUEX_TYPE_TOKEN_ID receive(); 00196 # else 00197 # error "This section should never be compiled." 00198 # endif 00199 00200 // NOTE: A pointer to an object of the token queue/object is used in order to make 00201 // memory management more flexible. The token queue/token object is heavily 00202 // used and it should be possible to put it somewhere in memory with other 00203 // heavily used data so that the cache can take advantage of data locality. 00204 QUEX_TYPE_TOKEN* token_p(); 00205 00206 # if defined(QUEX_OPTION_TOKEN_POLICY_SINGLE) 00207 # if defined(QUEX_OPTION_USER_MANAGED_TOKEN_MEMORY) 00208 void token_p_set(QUEX_TYPE_TOKEN*); 00209 QUEX_TYPE_TOKEN* token_p_switch(QUEX_TYPE_TOKEN*); 00210 # endif 00211 # else 00212 bool token_queue_is_empty(); 00213 void token_queue_remainder_get(QUEX_TYPE_TOKEN** begin, QUEX_TYPE_TOKEN** end); 00214 # if defined(QUEX_OPTION_USER_MANAGED_TOKEN_MEMORY) 00215 void token_queue_get(QUEX_TYPE_TOKEN** begin, size_t* size); 00216 void token_queue_set(QUEX_TYPE_TOKEN* Begin, size_t Size); 00217 void token_queue_switch(QUEX_TYPE_TOKEN** queue, 00218 size_t* size); 00219 # endif 00220 # endif 00221 00222 // 00223 // (*) Mode handling 00224 // 00225 // -- modes: read access 00226 QUEX_NAME(Mode)& mode(); 00227 int mode_id() const; 00228 const char* mode_name() const; 00229 // 00230 // -- modes: changing lexical analysis mode 00231 void set_mode_brutally(const int LexerMode); 00232 void set_mode_brutally(const QUEX_NAME(Mode)& Mode); 00233 // 00234 void operator<<(const int MODE_ID); 00235 void operator<<(/* NOT const*/ QUEX_NAME(Mode)& Mode); 00236 // 00237 void pop_mode(); 00238 void pop_drop_mode(); 00239 void push_mode(QUEX_NAME(Mode)& new_mode); 00240 // 00241 void enter_mode(/* NOT const*/ QUEX_NAME(Mode)& TargetMode); 00242 // 00243 // -- map: mode id to mode and vice versa 00244 QUEX_NAME(Mode)& map_mode_id_to_mode(const int ModeID); 00245 int map_mode_to_mode_id(const QUEX_NAME(Mode)& Mode) const; 00246 00247 // (*) Token sending happens only via 'self_send*(...)' macros 00248 void send(const QUEX_TYPE_TOKEN_ID TokenID) 00249 { (void)TokenID; QUEX_ERROR_DEPRECATED("Member functions .send()", "macros: self_send*()"); } 00250 00251 # ifdef QUEX_OPTION_LINE_NUMBER_COUNTING 00252 size_t line_number() const { return line_number_at_begin(); } 00253 size_t line_number_at_begin() const { return counter._line_number_at_begin; } 00254 size_t line_number_at_end() const { return counter._line_number_at_end; } 00255 /* line_number_set(...) defines the column number of the next pattern match. */ 00256 void line_number_set(size_t Y) { counter._line_number_at_end = Y; } 00257 # endif 00258 # ifdef QUEX_OPTION_COLUMN_NUMBER_COUNTING 00259 size_t column_number() const { return column_number_at_begin(); } 00260 size_t column_number_at_begin() const { return counter._column_number_at_begin; } 00261 size_t column_number_at_end() const { return counter._column_number_at_end; } 00262 /* column_number_set(...) defines the column number of the next pattern match. */ 00263 void column_number_set(size_t X) { counter._column_number_at_end = X; } 00264 # endif 00265 # ifdef QUEX_OPTION_INDENTATION_TRIGGER 00266 size_t indentation() { return counter._indentation; } 00267 # endif 00268 00269 // (*) Version information 00270 const char* version() const; // created by quex for version/date information 00271 00272 // (*) Tell/Seek/Move on basis of character index 00273 size_t tell(); 00274 void seek(const size_t); 00275 void seek_forward(const size_t); 00276 void seek_backward(const size_t); 00277 00278 void undo(); 00279 void undo(size_t DeltaN_Backward); 00280 00281 void move_forward(const size_t) { QUEX_ERROR_EXIT("'move_forward()' has been renamed to 'seek_forward()'."); } 00282 void move_backward(const size_t){ QUEX_ERROR_EXIT("'move_backward()' has been renamed to 'seek_backward()'."); } 00283 00284 public: 00285 00286 void set_callback_on_buffer_content_change(void (*callback)(QUEX_TYPE_CHARACTER*, 00287 QUEX_TYPE_CHARACTER*)); 00288 00289 template <class InputHandleT> void reset(InputHandleT* input_handle, 00290 const char* CharacterEncodingName = 0x0); 00291 void reset(const char* CharacterEncodingName = 0x0) 00292 { reset<void>((void*)0x0, CharacterEncodingName); } 00293 00294 QUEX_TYPE_CHARACTER* reset_buffer(QUEX_TYPE_CHARACTER* BufferMemoryBegin, 00295 size_t BufferMemorySize, 00296 QUEX_TYPE_CHARACTER* BufferEndOfContentP, 00297 const char* CharacterEncodingName = 0x0); 00298 00299 # ifdef QUEX_OPTION_INCLUDE_STACK 00300 public: 00301 template<class InputHandleT> void include_push(QUEX_TYPE_CHARACTER* InputName, 00302 const QUEX_NAME(Mode)* Mode = 0x0, 00303 const char* IANA_CodingName = 0x0); 00304 template<class InputHandleT> void include_push(InputHandleT* sh, 00305 const QUEX_NAME(Mode)* Mode = 0x0, 00306 const char* IANA_CodingName = 0x0); 00307 bool include_pop(); 00308 00309 protected: 00310 void include_stack_delete(); 00311 00312 private: 00313 # endif 00314 00315 public: 00316 void print_this(); 00317 00318 private: 00319 // (*) Common core of all constructors ___________________________________________ 00320 TEMPLATE_IN(InputHandleT) friend void 00321 QUEX_NAME(constructor_core)(QUEX_TYPE_ANALYZER* me, 00322 InputHandleT* input_handle, 00323 const char* CharacterEncodingName, 00324 bool ByteOrderReversionF, 00325 QUEX_TYPE_CHARACTER* BufferMemory, 00326 size_t BufferMemorySize); 00327 00328 template<class InputHandleT> friend QUEX_NAME(Memento)* 00329 QUEX_NAME(memento_pack)(QUEX_TYPE_ANALYZER*, QUEX_TYPE_CHARACTER*, 00330 InputHandleT**); 00331 friend void 00332 QUEX_NAME(memento_unpack)(QUEX_TYPE_ANALYZER*, QUEX_NAME(Memento)*); 00333 00334 template<class InputHandleT> friend void 00335 QUEX_NAME(reset)(QUEX_TYPE_ANALYZER*, InputHandleT*, const char*); 00336 00337 /* (*) All Modes are Friends ___________________________________________________*/ 00338 friend __QUEX_TYPE_ANALYZER_RETURN_VALUE QUEX_NAME(NORMAL_analyzer_function)(QUEX_TYPE_ANALYZER*); 00339 #ifdef QUEX_OPTION_RUNTIME_MODE_TRANSITION_CHECK 00340 friend bool QUEX_NAME(NORMAL_has_base)(const QUEX_NAME(Mode)*); 00341 friend bool QUEX_NAME(NORMAL_has_entry_from)(const QUEX_NAME(Mode)*); 00342 friend bool QUEX_NAME(NORMAL_has_exit_to)(const QUEX_NAME(Mode)*); 00343 #endif 00344 00345 00346 00347 public: 00348 #define self (*(QUEX_TYPE_DERIVED_ANALYZER*)this) 00349 /* START: User's class body extensions _____________________________________________*/ 00350 00351 /* END: ____________________________________________________________________________*/ 00352 #undef self 00353 00354 public: 00355 // At least warn those, who still use the old interface ... 00356 void get_token() 00357 { QUEX_ERROR_DEPRECATED("Member functions .get_token()", ".receive(...)"); } 00358 void get_token(QUEX_TYPE_TOKEN* result_p) { (void)result_p; get_token(); } 00359 void get_token(QUEX_TYPE_TOKEN** result_pp) { (void)result_pp; get_token(); } 00360 }; 00361 00362 QUEX_NAMESPACE_MAIN_CLOSE 00363 #include <quex/code_base/temporary_macros_off> 00364 00365 #include <quex/code_base/temporary_macros_on> 00366 00367 QUEX_NAMESPACE_MAIN_OPEN 00368 00369 #ifndef __QUEX_OPTION_PLAIN_C 00370 TEMPLATE_IN(InputHandleT) 00371 #endif 00372 void 00373 QUEX_NAME(constructor_core)(QUEX_TYPE_ANALYZER* me, 00374 InputHandleT* input_handle, 00375 const char* CharacterEncodingName, 00376 bool ByteOrderReversionF, 00377 QUEX_TYPE_CHARACTER* BufferMemory, 00378 size_t BufferMemorySize, 00379 QUEX_TYPE_CHARACTER* BufferEndOfFileP) 00380 { 00381 __quex_assert(QUEX_NAME(ModeID_NORMAL) < 1); 00382 00383 QUEX_NAME(NORMAL).id = QUEX_NAME(ModeID_NORMAL); 00384 QUEX_NAME(NORMAL).name = "NORMAL"; 00385 QUEX_NAME(NORMAL).analyzer_function = QUEX_NAME(NORMAL_analyzer_function); 00386 # if defined(QUEX_OPTION_INDENTATION_TRIGGER) \ 00387 && ! defined(QUEX_OPTION_INDENTATION_DEFAULT_HANDLER) 00388 QUEX_NAME(NORMAL).on_indentation = QUEX_NAME(Mode_on_indentation_null_function); 00389 # endif 00390 QUEX_NAME(NORMAL).on_entry = QUEX_NAME(Mode_on_entry_exit_null_function); 00391 QUEX_NAME(NORMAL).on_exit = QUEX_NAME(Mode_on_entry_exit_null_function); 00392 # if defined(QUEX_OPTION_RUNTIME_MODE_TRANSITION_CHECK) 00393 QUEX_NAME(NORMAL).has_base = QUEX_NAME(NORMAL_has_base); 00394 QUEX_NAME(NORMAL).has_entry_from = QUEX_NAME(NORMAL_has_entry_from); 00395 QUEX_NAME(NORMAL).has_exit_to = QUEX_NAME(NORMAL_has_exit_to); 00396 # endif 00397 me->mode_db[QUEX_NAME(ModeID_NORMAL)] = &(QUEX_NAME(NORMAL)); 00398 00399 00400 QUEX_NAME(construct_basic)(me, input_handle, 00401 BufferMemory, BufferMemorySize, BufferEndOfFileP, 00402 CharacterEncodingName, 00403 QUEX_SETTING_TRANSLATION_BUFFER_SIZE, 00404 ByteOrderReversionF); 00405 00406 me->__current_mode_p = 0x0; /* REQUIRED, for mode transition check */ 00407 QUEX_NAME(set_mode_brutally_by_id)(me, __QUEX_SETTING_INITIAL_LEXER_MODE_ID); 00408 00409 #define self (*(QUEX_TYPE_DERIVED_ANALYZER*)me) 00410 /* START: User's constructor extensions _______________________________________*/ 00411 00412 /* END: _______________________________________________________________________*/ 00413 #undef self 00414 } 00415 00416 00417 #ifdef QUEX_OPTION_INCLUDE_STACK 00418 00419 #ifndef __QUEX_OPTION_PLAIN_C 00420 TEMPLATE_IN(InputHandleT) 00421 #endif 00422 QUEX_NAME(Memento)* 00423 QUEX_NAME(memento_pack)(QUEX_TYPE_ANALYZER* me, 00424 QUEX_TYPE_CHARACTER* InputName, 00425 InputHandleT** input_handle) 00426 { 00427 # define self (*me) 00428 QUEX_NAME(Memento)* memento = QUEX_NAME(MemoryManager_Memento_allocate)(); 00429 00430 (void)InputName; 00431 (void)input_handle; 00432 00433 # ifndef __QUEX_OPTION_PLAIN_C 00434 /* Use placement 'new' for explicit call of constructor. 00435 * Necessary in C++: Trigger call to constructor for user defined members. */ 00436 new ((void*)memento) QUEX_NAME(Memento); 00437 # endif 00438 00439 memento->_parent_memento = self._parent_memento; 00440 memento->buffer = self.buffer; 00441 memento->__current_mode_p = self.__current_mode_p; 00442 memento->current_analyzer_function = self.current_analyzer_function; 00443 # if defined(QUEX_OPTION_AUTOMATIC_ANALYSIS_CONTINUATION_ON_MODE_CHANGE) \ 00444 || defined(QUEX_OPTION_ASSERTS) 00445 memento->DEBUG_analyzer_function_at_entry = self.DEBUG_analyzer_function_at_entry; 00446 # endif 00447 __QUEX_IF_COUNT( memento->counter = self.counter); 00448 # ifdef QUEX_OPTION_STRING_ACCUMULATOR 00449 memento->accumulator = self.accumulator; 00450 # endif 00451 memento->__file_handle_allocated_by_constructor = self.__file_handle_allocated_by_constructor; 00452 00453 /* Deriberately not subject to include handling: 00454 * -- Mode stack. 00455 * -- Token and token queues. 00456 * -- Post categorizer. */ 00457 00458 # ifdef QUEX_OPTION_TOKEN_POLICY_QUEUE 00459 /* QuexTokenQueueRemainder_restore(&memento->token_queue_remainder, &self._token_queue); */ 00460 # endif 00461 00462 /* START: User's memento 'pack' _______________________________________________*/ 00463 00464 /* END: _______________________________________________________________________*/ 00465 00466 return memento; 00467 # undef self 00468 } 00469 00470 #ifndef __QUEX_OPTION_PLAIN_C 00471 QUEX_INLINE 00472 #endif 00473 void 00474 QUEX_NAME(memento_unpack)(QUEX_TYPE_ANALYZER* me, 00475 QUEX_NAME(Memento)* memento) 00476 { 00477 # define self (*me) 00478 self._parent_memento = memento->_parent_memento; 00479 self.buffer = memento->buffer; 00480 self.__current_mode_p = memento->__current_mode_p; 00481 self.current_analyzer_function = memento->current_analyzer_function; 00482 # if defined(QUEX_OPTION_AUTOMATIC_ANALYSIS_CONTINUATION_ON_MODE_CHANGE) \ 00483 || defined(QUEX_OPTION_ASSERTS) 00484 self.DEBUG_analyzer_function_at_entry = memento->DEBUG_analyzer_function_at_entry; 00485 # endif 00486 __QUEX_IF_COUNT(self.counter = memento->counter); 00487 # ifdef QUEX_OPTION_STRING_ACCUMULATOR 00488 self.accumulator = memento->accumulator; 00489 # endif 00490 self.__file_handle_allocated_by_constructor = memento->__file_handle_allocated_by_constructor; 00491 00492 # ifdef QUEX_OPTION_TOKEN_POLICY_QUEUE 00493 /* QuexTokenQueueRemainder_restore(&memento->token_queue_remainder, &self._token_queue); */ 00494 # endif 00495 00496 /* START: User's memento 'unpack' _____________________________________________*/ 00497 00498 /* END: _______________________________________________________________________*/ 00499 00500 # ifndef __QUEX_OPTION_PLAIN_C 00501 /* Counterpart to placement new: Explicit destructor call. 00502 * Necessary in C++: Trigger call to destructor for user defined members. */ 00503 memento->~QUEX_NAME(Memento_tag)(); 00504 # endif 00505 00506 QUEX_NAME(MemoryManager_Memento_free)(memento); 00507 # undef self 00508 } 00509 #endif /* QUEX_OPTION_INCLUDE_STACK */ 00510 00511 QUEX_NAMESPACE_MAIN_CLOSE 00512 00513 #include <quex/code_base/temporary_macros_off> 00514 00515 #if defined(__QUEX_OPTION_CONVERTER_HELPER) 00516 # include "quex/code_base/converter_helper/from-unicode-buffer.i" 00517 #endif 00518 #include <quex/code_base/analyzer/headers.i> 00519 00520 00521 00522 00523 #endif /* __QUEX_INCLUDE_GUARD__ANALYZER__GENERATED____CT____LEXER */