Ragazzi ho un problema con questo parser che riconosce la grammatica di un albero.
Senza che io stia quì a descrivervi la grammatica utilizzata, anche perchè l'errore riscontrato non credo sia influenzato da una relativa grammatica.
Tornando a noi, in pratica in uscita dalla funzione "albero" che è quella da dove parte poi l'intera sequenza di riconoscimento, l'albero che mi torna nel principale è formato dal giusto numero di nodi, però questi ultimi hanno tutti come contenuto il valore dell'ultimo nodo trovato. E cioè l'ultimo valore diventa poi il contenuto di tutti gli altri nodo a catena. Come mai ?

codice:
tree *make_node(char *t){
	int val;
	tree *r=NULL;
	
	if(strcmp(t,"y")!=0){
		val=atoi(t);
		r=(tree *)malloc(sizeof(tree));
		if(r){
			*((int *)r->inf)=val;
			r->sx=NULL;
			r->dx=NULL;
		}
	free(t);
	}
	return r;
}



tree *node(FILE *f,int *err){
	char *t;
	tree *r=NULL;
	t=get_token(f,ID);	
	
	if(t)
		r=make_node(t);
	else{
        printf("\n ERROR : MISSED ID \n");
		*err=1;
    }
	return r;	
}



tree *albero(FILE *f,int *err){
    tree *r;
    if(*err==1)
         return r;
    else{
	   r=node(f,err);
	   if(r)
		   r=figli(r,f,err);
    }
    
	return r;
}



tree *figli(tree *r,FILE *f,int *err){
	char *t;
	
	t=get_token(f,LPAR);
	if(strcmp(t,"y")==0){
		r->sx=albero(f,err);
		t=get_token(f,COMMA);
		if(strcmp(t,"y")==0){
			r->dx=albero(f,err);
			t=get_token(f,RPAR);
			if(strcmp(t,"y")!=0){
				printf("\n ERROR : MISSED ')' \n");
				*err=1;
            }
		}
		else{
		    printf("\n ERROR : MISSED ',' \n");
		    *err=1;
        }
	}
	else{
		printf("\n ERROR : MISSED '(' \n");
		*err=1;
    }
	return r;
}



char *get_token(FILE *f,type st){
	int c;
	type tp;
	char *symbol=NULL; 
	
	c=fgetc(f);
	switch(c){
		
		case ',' :	tp=COMMA;
					break;
		case '(' : 	tp=LPAR;
					break;
		case ')' : 	tp=RPAR;
					break;
		case '_' :  tp=ID;
                    break;
	}
	if(tp==st)
		symbol = "y";
	else if(isdigit(c))
     	 symbol=read_number(c,f);
        
	
    return symbol;
}



char *read_number(int c,FILE *f){
	char buf[20],*symb;
	int i=1;
	
	buf[0]=c;
	c=fgetc(f);
	while(isdigit(c)){
		buf[i++]=c;
		c=fgetc(f);
	}
	buf[i]='\0';
	ungetc(c,f);
	symb=(char *)malloc((strlen(buf)+1)*sizeof(char));
	strcpy(symb,buf);
	return symb;
}