PDA

Visualizza la versione completa : [C] Parser tree


johnnny
20-05-2013, 22:28
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 ?



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

Scara95
22-05-2013, 16:43
Non ho letto il codice ma molto probabilmente in qualche punto assegni ad un char * un'altro char * che invece dovresti copiare con strcpy...

Loading