예제 #1
0
파일: scope.c 프로젝트: timzchang/Compilers
// when we see {, create a new hash_table and connect
void scope_enter(){
	int * params = malloc(sizeof(int));
	int * locals = malloc(sizeof(int));
	*params = 0;
	*locals = 0;
	struct hash_table *h_prev;  // keep track of prev
	h->next = hash_table_create(0,0);  // create new hash table
	h_prev = h;  
	h = h->next;
	h->prev = h_prev;
	if(scope_level() == 2){
		hash_table_insert(h,"0params", params);  // insert params and locals counter
		hash_table_insert(h,"0locals", locals);
	}
}
예제 #2
0
void decl_resolve(struct decl* d,int x)
{
	if(!d)return;
	if(scope_lookup_local(d->name)!=NULL && d->type->kind!=TYPE_FUNCTION)
	{
		if(x == 1)printf("Resolve error: %s already declared\n",d->name);
		get_incrementError(1);
	}
	else{
		if(scope_level() == 1){
			struct symbol *sym = symbol_create(SYMBOL_GLOBAL,d->type,d->name,0,0);
			d->symbol = sym;
			scope_bind(d->name,sym);
		}
		else {
			params_local_varibles++;
			local_variables_cont++;	
			struct symbol *sym = symbol_create(SYMBOL_LOCAL,d->type,d->name,0,0);
			d->symbol = sym;
			scope_bind(d->name,sym);
		}
		expr_resolve(d->value,x);
		if(d->type->kind == TYPE_FUNCTION){
		  	param_list_resolve(d->type->params,0);
			if(!parametro)parametro = hash_table_create(0,0);
			hash_table_insert(parametro,d->name,d->type);
		}
		if(d->code){
			scope_enter();
			stmt_resolve(d->code,x);
			d->symbol->total_locals = local_variables_cont;
			local_variables_cont = 0;
			params_local_varibles = 0;
			scope_leave();	
		}
		if(d->next){
			decl_resolve(d->next,x);
		}
	}	
}