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; }

Rispondi quotando