extern void f_StepTo( int iToken, ... ) { int aiToken[10]; int i = 0; va_list pvar; aiToken[i++] = iToken; va_start( pvar, iToken ); while( True ) { if(( aiToken[i++] = va_arg( pvar, int )) == 0 ) { break; } } /* printf( "StepTo:" ); */ /* for( i = 0; aiToken[i]; i++ ) */ /* { */ /* printf( " %c", aiToken[i] ); */ /* } */ /* printf( "\n" ); */ va_end( pvar ); #ifndef TEST while( True ) { iToken = token( 0 ); for( i = 0; aiToken[i]; i++ ) { if( aiToken[i] == iToken ) { return; } } switch( iToken ) { case 0 : return; case '(': step( 1 ); f_StepTo( ')', 0 ); step( 1 ); break; case '[': step( 1 ); f_StepTo( ']', 0 ); step( 1 ); break; case '{': step( 1 ); f_StepTo( '}', 0 ); step( 1 ); break; case '<': step( 1 ); f_StepTo( '>', 0 ); step( 1 ); break; default : step( 1 ); break; } } #endif }
static List_t f_EnumeratorList( void ) { List_t List; Enumerator_t Enumerator; niveau++; step( 1 ); List = f_ListCreate(); while( True ) { if(( Enumerator = f_Enumerator())) { f_ListAddLast( &List, (Elem_t) Enumerator ); } process: if( token( 0 ) == ',' ) { step( 1 ); } else if( token( 0 ) == RBRACE || token( 0 ) == 0 ) { break; } else { f_StepTo( ',', '}', 0 ); goto process; } } niveau--; return List; }
extern Enum_t f_Enum( void ) { Enum_t Enum; Save(); niveau++; if( token( 0 ) != SN_ENUM ) { niveau--; Restore(); return 0; } Enum = f_EnumCreate(); step( 1 ); if( token( 0 ) != LBRACE ) /* SN_IDENTIFIER or SN_NEW or ... */ { Enum->Name = f_NameCreate( ident( 0 )); step( 1 ); } if( token( 0 ) == LBRACE ) { // step( 1 ); //- MTP (bugfix -- skipped 1st enum) Enum->ListEnumerator = f_EnumeratorList(); f_StepTo( RBRACE, 0 ); step( 1 ); } niveau--; return Enum; }
static List_t f_InitList( char cTerminator ) { Init_t Init; List_t List = 0; /* Save(); */ niveau++; while( True ) { if(( Init = f_Init( cTerminator ))) { f_ListAddLast( &List, (Elem_t) Init ); } else { f_StepTo( ',', (char) cTerminator, ';', 0 ); } if( token( 0 ) == ',' ) { step( 1 ); } if( token( 0 ) == cTerminator || token( 0 ) == ';' || token( 0 ) == 0 ) { niveau--; return List; } } }
extern Init_t f_NewInitializer( void ) { Init_t Init; Save(); if( token( 0 ) == '(' ) { step( 1 ); Init = f_InitCreate(); Init->ListInit = f_InitList( ')' ); f_StepTo( ')', 0 ); step( 1 ); return Init; } else { Restore(); return 0; } }
extern Init_t f_Init( char cTerminator ) { Init_t Init; List_t ListInit; Expr_t Expr; Save(); niveau++; if( token( 0 ) == '{' ) { step( 1 ); ListInit = f_InitList( '}' ); if( token( 0 ) == '}' ) { step( 1 ); } Init = f_InitCreate(); Init->ListInit = ListInit; niveau--; return Init; } else if(( Expr = f_AssignmentExpression())) { Init = f_InitCreate(); Init->Expr = Expr; niveau--; return Init; } else { f_StepTo( ',', ';', cTerminator, 0 ); Restore(); niveau--; return 0; } }
static Boolean_t statement( void ) { /* printf( "statement: %s\n", ident( 0 )); */ switch( token( 0 )) { case ';' : step( 1 ); return True; case '{' : return compound_statement(); case SN_CASE : return case_statement(); case SN_DEFAULT : return default_statement(); case SN_IF : return if_statement(); case SN_ELSE : return else_statement(); case SN_SWITCH : return switch_statement(); case SN_WHILE : return while_statement(); case SN_DO : return do_statement(); case SN_FOR : return for_statement(); case SN_BREAK : return break_statement(); case SN_CONTINUE : return continue_statement(); case SN_RETURN : return return_statement(); case SN_THROW : return throw_statement(); case SN_GOTO : return goto_statement(); case SN_TRY : return try_statement(); case SN_IDENTIFIER: if( labeled_statement ()) return True; if( declaration_statement1()) return True; if( expression_statement ()) return True; if( declaration_statement2()) return True; step( 1 ); return False; case SN_CHAR : case SN_SHORT : case SN_INT : case SN_LONG : case SN_SIGNED : case SN_UNSIGNED : case SN_FLOAT : case SN_DOUBLE : case SN_BOOL : case SN_VOID : if( declaration_statement1()) return True; if( expression_statement ()) return True; if( declaration_statement2()) return True; step( 1 ); return False; case SN_ASM : case SN_TEMPLATE : case SN_NAMESPACE: case SN_USING : case SN_AUTO : case SN_REGISTER : case SN_EXTERN : case SN_STATIC : case SN_INLINE : case SN_VIRTUAL : case SN_CONST : case SN_VOLATILE : case SN_CLASS : case SN_STRUCT : case SN_UNION : case SN_ENUM : case SN_FRIEND : case SN_TYPEDEF : if( declaration_statement1()) return True; if( declaration_statement2()) return True; f_StepTo( ';', '}', 0 ); return False; case SN_SIZEOF : case SN_NEW : case SN_DELETE : case SN_THIS : case SN_OPERATOR : case SN_STRINGliteral : case SN_FLOATINGconstant : case SN_INTEGERconstant : case SN_LONGconstant : case SN_CHARACTERconstant : case SN_ICR : case SN_DECR : case SN_CLCL : case '(': case '~': case '*': case '&': case '+': case '-': case '!': if( expression_statement ()) return True; step( 1 ); return False; case 0: printf( "unexpected end of file\n" ); return False; default: #ifdef PRINT_STATEMENT_DEFAULT printf( "statement: default: %4d %s file: %s:(%d.%d)\n" , token( 0 ) , ident( 0 ) , filename_g , f_lineno( 0 ) , f_charno( 0 ) ); #endif #ifdef BREAK_BY_STATEMENT_DEFAULT exit( -1 ); #endif if( declaration_statement1()) return True; if( expression_statement ()) return True; if( declaration_statement2()) return True; step( 1 ); return False; /* case SN_ARROW : */ /* case SN_LS : */ /* case SN_RS : */ /* case SN_LE : */ /* case SN_GE : */ /* case SN_EQ : */ /* case SN_NE : */ /* case SN_ANDAND : */ /* case SN_OROR : */ /* case SN_ELLIPSIS : */ /* case SN_DOTstar : */ /* case SN_ARROWstar : */ /* case SN_MULTassign : */ /* case SN_DIVassign : */ /* case SN_MODassign : */ /* case SN_PLUSassign : */ /* case SN_MINUSassign : */ /* case SN_LSassign : */ /* case SN_RSassign : */ /* case SN_ANDassign : */ /* case SN_ERassign : */ /* case SN_ORassign : */ /* case '=' : */ /* case '|' : */ /* case '^' : */ /* case '&' : */ /* case '<' : */ /* case '>' : */ /* case '/' : */ /* case '%' : */ /* case ')' : */ /* case '[' : */ /* case ']' : */ /* case '.' : */ /* case ',' : */ /* case '{' : */ /* case '}' : */ /* case '?' : */ /* case ':' : */ } }
main() { f_StepTo( 'a', 0 ); f_StepTo( 'a', 'b', 0 ); f_StepTo( 'a', 'b', 'c', 0 ); }