on_indentation.i (2198B)
1 /* (C) 2010 Frank-Rene Schaefer 2 * ABSOLUTELY NO WARRANTY */ 3 #ifndef __QUEX_INCLUDE_GUARD__ANALYZER__MEMBER__ON_INDENTATION_I 4 #define __QUEX_INCLUDE_GUARD__ANALYZER__MEMBER__ON_INDENTATION_I 5 6 QUEX_NAMESPACE_MAIN_OPEN 7 8 #include "token-sending" 9 #include "analyzerCounter" 10 11 QUEX_INLINE __QUEX_TYPE_ANALYZER_RETURN_VALUE 12 QUEX_NAME(on_indentation)(QUEX_TYPE_ANALYZER* me, 13 QUEX_TYPE_INDENTATION Indentation, 14 QUEX_TYPE_LEXATOM* Begin) 15 { 16 # define self (*me) 17 QUEX_NAME(IndentationStack)* stack = &me->counter._indentation_stack; 18 # if defined(QUEX_OPTION_TOKEN_POLICY_SINGLE) 19 register QUEX_TYPE_TOKEN_ID __self_result_token_id 20 = (QUEX_TYPE_TOKEN_ID)__QUEX_SETTING_TOKEN_ID_UNINITIALIZED; 21 # endif 22 __QUEX_IF_TOKEN_REPETITION_SUPPORT(QUEX_TYPE_INDENTATION* start = 0); 23 (void)Begin; 24 25 if( Indentation > *(stack->back) ) { 26 self_send(__QUEX_SETTING_TOKEN_ID_INDENT); 27 ++(stack->back); 28 if( stack->back == stack->memory_end ) QUEX_ERROR_EXIT("Indentation stack overflow."); 29 *(stack->back) = Indentation; 30 __QUEX_RETURN; 31 } 32 else if( Indentation == *(stack->back) ) { 33 self_send(__QUEX_SETTING_TOKEN_ID_NODENT); 34 } 35 else { 36 __QUEX_IF_TOKEN_REPETITION_SUPPORT(start = stack->back); 37 /* From Above: (NOT Indentation > *back) and (NOT Indentation == *back), 38 * Thus: Indentation < *back. */ 39 do { 40 __QUEX_IF_TOKEN_REPETITION_SUPPORT_DISABLED(self_send(__QUEX_SETTING_TOKEN_ID_DEDENT)); 41 --(stack->back); 42 } while( Indentation < *(stack->back) ); 43 44 if( Indentation == *(stack->back) ) { /* 'Landing' must happen on indentation border. */ 45 __QUEX_IF_TOKEN_REPETITION_SUPPORT(self_send_n((size_t)(start - stack->back), 46 __QUEX_SETTING_TOKEN_ID_DEDENT)); 47 } else { 48 QUEX_ERROR_EXIT("Indentation Error"); 49 } 50 } 51 __QUEX_RETURN; 52 # undef self 53 } 54 QUEX_NAMESPACE_MAIN_CLOSE 55 56 #endif /* __QUEX_INCLUDE_GUARD__ANALYZER__MEMBER__ON_INDENTATION_I */ 57