Visualizzazione dei risultati da 1 a 2 su 2

Discussione: [C] Parser tree

  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2010
    Messaggi
    152

    [C] Parser tree

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

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Non ho letto il codice ma molto probabilmente in qualche punto assegni ad un char * un'altro char * che invece dovresti copiare con strcpy...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.