Beispiel #1
0
Statement *ParseStatement() 
{
	Statement *snp; 
    switch( lastst ) { 
    case semicolon: 
        NextToken(); 
        snp = NULL; 
        break; 
    case begin: 
		NextToken(); 
        snp = ParseCompoundStatement();
        return snp; 
    case kw_if: snp = ParseIfStatement(); break; 
    case kw_while: snp = ParseWhileStatement(); break; 
    case kw_until: snp = ParseUntilStatement(); break; 
    case kw_for:   snp = ParseForStatement();   break; 
    case kw_forever: snp = ParseForeverStatement(); break; 
    case kw_firstcall: snp = ParseFirstcallStatement(); break; 
    case kw_return: snp = ParseReturnStatement(); break; 
    case kw_break: snp = ParseBreakStatement(); break; 
    case kw_goto: snp = ParseGotoStatement(); break; 
    case kw_continue: snp = ParseContinueStatement(); break; 
    case kw_do:
	case kw_loop: snp = ParseDoStatement(); break; 
    case kw_switch: snp = ParseSwitchStatement(); break;
	case kw_try: snp = ParseTryStatement(); break;
	case kw_throw: snp = ParseThrowStatement(); break;
	case kw_vortex:
			snp = vortex_stmt();
			break;
	case kw_intoff: snp = ParseIntoffStatement(); break;
	case kw_inton: snp = ParseIntonStatement(); break;
	case kw_stop: snp = ParseStopStatement(); break;
	case kw_asm:
		snp = ParseAsmStatement(); break;
	case kw_critical: snp = ParseCriticalStatement(); break;
	case kw_spinlock: snp = ParseSpinlockStatement(); break;
	case kw_spinunlock: snp = ParseSpinunlockStatement(); break;
    case id:
			SkipSpaces();
            if( lastch == ':' ) 
                return ParseLabelStatement(); 
            // else fall through to parse expression
    default: 
            snp = ParseExpressionStatement(); 
            break; 
    } 
    if( snp != NULL ) 
        snp->next = NULL;
    return snp; 
} 
Sentencia* Sintactico::ParseStructuredStatement()
{
	//Utilizamos Primeros
	if ( proximo_token.GetTipo() == kw_begin )
	{
		return ParseCompoundStatement();
	}
	else if ( proximo_token.GetTipo() == kw_while || proximo_token.GetTipo() == kw_for || proximo_token.GetTipo() == kw_repeat )
	{
		return ParseIterationStatement();
	}
	else if ( proximo_token.GetTipo() == kw_if || proximo_token.GetTipo() == kw_case )
	{
		return ParseSelectionStatement();
	}
	else
		throw SyntaxException("Error de sentencia",analizador_lexico->GetLineaActual());

}
Beispiel #3
0
void ParseFunctionBody(SYM *sp)
{    
	char lbl[200];

	needpunc(begin);
    ParseAutoDeclarations();
	cseg();
	if (sp->storage_class == sc_static)
	{
		strcpy(lbl,GetNamespace());
		strcat(lbl,"_");
		strcat(lbl,sp->name);
		gen_strlab(lbl);
	}
	//	put_label((unsigned int) sp->value.i);
	else
		gen_strlab(sp->name);
	currentFn = sp;
	currentFn->IsLeaf = TRUE;
	currentFn->DoesThrow = FALSE;
    GenerateFunction(sp, ParseCompoundStatement());
//	if (optimize)
		flush_peep();
}
Beispiel #4
0
static Statement *ParseFunctionBody(SYM *sp)
{    
	std::string lbl;
	char *p;
	Statement *stmt;
	Statement *plg;
	Statement *eplg;

  dfs.printf("<Parse function body>:%s|\n", (char *)sp->name->c_str());

	lbl[0] = 0;
	needpunc(begin,47);
     
  tmpReset();
    //ParseAutoDeclarations();
	cseg();
	if (sp->storage_class == sc_static)
	{
		//strcpy(lbl,GetNamespace());
		//strcat(lbl,"_");
//		strcpy(lbl,sp->name);
    lbl = *sp->mangledName;
		//gen_strlab(lbl);
	}
	//	put_label((unsigned int) sp->value.i);
	else {
		if (sp->storage_class == sc_global)
			lbl = "public code ";
//		strcat(lbl,sp->name);
		lbl += *sp->mangledName;
		//gen_strlab(lbl);
	}
  dfs.printf("B");
  p = my_strdup((char *)lbl.c_str());
  dfs.printf("b");
	GenerateMonadic(op_fnname,0,make_string(p));
	currentFn = sp;
	currentFn->IsLeaf = TRUE;
	currentFn->DoesThrow = FALSE;
	currentFn->UsesPredicate = FALSE;
	regmask = 0;
	bregmask = 0;
	currentStmt = (Statement *)NULL;
  dfs.printf("C");
	stmt = ParseCompoundStatement();
  dfs.printf("D");
//	stmt->stype = st_funcbody;
	if (isThor)
		GenerateFunction(sp, stmt);
	else if (isTable888)
		GenerateTable888Function(sp, stmt);
	else if (isRaptor64)
		GenerateRaptor64Function(sp, stmt);
	else if (is816)
		Generate816Function(sp, stmt);
	else if (isFISA64)
		GenerateFISA64Function(sp, stmt);
  dfs.putch('E');

	flush_peep();
	if (sp->storage_class == sc_global) {
		ofs.printf("endpublic\r\n\r\n");
	}
	ofs.printf("%sSTKSIZE_ EQU %d\r\n", (char *)sp->mangledName->c_str(), tmpVarSpace() + lc_auto);
	isFuncBody = false;
	dfs.printf("</ParseFunctionBody>\n");
	return stmt;
}
DeclaracionFuncion* Sintactico::ParseFunctionDeclaration()
{
	if ( proximo_token.GetTipo() == kw_procedimiento )
	{
		proximo_token = analizador_lexico->ObtenerSiguienteToken();

		if ( proximo_token.GetTipo() == id )
		{
			string nom_procedimiento = proximo_token.GetLexema();
			proximo_token = analizador_lexico->ObtenerSiguienteToken();

			InformacionSemantica::GetInstance()->SetContexto(nom_procedimiento);
			InformacionInterpretacion::GetInstance()->SetContexto(nom_procedimiento);

			list<Parametro*> lista_params = ParseProcedureParam();
			ListaVariables* lista_vars = ParseVariableDeclarations();

			Sentencia* cuerpo_funcion = ParseCompoundStatement();

			//PENDIENTE: Verificar si es correcto

			
			list<Parametro*>::iterator it = lista_params.begin();

			for ( ; it != lista_params.end() ; it++ )
			{
				lista_vars->insert((*it)->GetNombre(),(*it)->GetTipo() );
			}

			InformacionInterpretacion::GetInstance()->InicializarVariables(nom_procedimiento,lista_vars);
			return new DeclaracionFuncion(nom_procedimiento,lista_params,cuerpo_funcion,NULL);
		}
		else
			throw SyntaxException("No se encontro un id valido",analizador_lexico->GetLineaActual());
	}
	else if ( proximo_token.GetTipo() == kw_funcion )
	{
		proximo_token = analizador_lexico->ObtenerSiguienteToken();
		if ( proximo_token.GetTipo() == id )
		{
			string nom_funcion = proximo_token.GetLexema();
			proximo_token = analizador_lexico->ObtenerSiguienteToken();

			list<Parametro*>lista_params = ParseFunctionParam();
			Tipo* t = ParseType();

			if ( proximo_token.GetTipo() == punt_puntocoma )
			{
				proximo_token = analizador_lexico->ObtenerSiguienteToken();
				InformacionSemantica::GetInstance()->SetContexto( nom_funcion );
				InformacionInterpretacion::GetInstance()->SetContexto(nom_funcion);
				ListaVariables* lista_vars = ParseVariableDeclarations();


				Sentencia* cuerpo_funcion = ParseCompoundStatement();

				list<Parametro*>::iterator it = lista_params.begin();
				
				for ( ; it != lista_params.end() ; it++ )
				{
					lista_vars->insert((*it)->GetNombre(),(*it)->GetTipo() );
				}

				InformacionSemantica::GetInstance()->InsertarVarEnContexto(nom_funcion,nom_funcion,t);

				//lista_vars->insert(nom_funcion,t);
				InformacionInterpretacion::GetInstance()->InicializarVariables(nom_funcion,lista_vars);
				return new DeclaracionFuncion(nom_funcion,lista_params,cuerpo_funcion,t);
			}
			else
				throw SyntaxException("Falta un punto y coma",analizador_lexico->GetLineaActual());
		}
		else
			throw SyntaxException("Falta el id",analizador_lexico->GetLineaActual());
	}
	else
		throw SyntaxException("Se esperaba una declaracion de funcion o procedimiento",analizador_lexico->GetLineaActual());

	//InformacionInterpretacion::GetInstance()->SetContexto("@GLOBAL");
}