Exemplo n.º 1
0
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
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
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;
}
Exemplo n.º 4
0
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;
      }
   }
}
Exemplo n.º 5
0
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;
   }
}
Exemplo n.º 6
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;
   }
}
Exemplo n.º 7
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 ':' : */
   }
}
Exemplo n.º 8
0
main()
{
   f_StepTo( 'a', 0 );
   f_StepTo( 'a', 'b', 0 );
   f_StepTo( 'a', 'b', 'c', 0 );
}