⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 yacc36.y

📁 GEDCOM语言->PROLOG语言 用LEX和YACC写的简单编译器 我们学校的一个作业
💻 Y
📖 第 1 页 / 共 2 页
字号:
 } 
 
int insert(char *name4,char *id3)
 {
   int h=0;
   chaine *courant1;
      
     
      while(table_name[h].name!=NULL)
       {
         if (strcmp(name4,table_name[h].name)==0)
          {
            
            courant1=table_name[h].point;
            
            
            while(courant1->suiv!=NULL)
               courant1=courant1->suiv;
               
             
             table_id=(chaine *)malloc(225*sizeof(chaine));
             table_id->id=id3;
             table_id->suiv=NULL;
             
             courant1->suiv=table_id;
            
             return comp_nom;
            }
           else
            h++;
        }
        
     
        
      if (table_name[h].name==NULL)
        {
            table_name[h].name=name4;
            
            comp_nom++;
            table_id=(chaine *)malloc(225*sizeof(chaine));
            
            table_id->id=id3;
            
            table_id->suiv=NULL;
            table_name[h].point=table_id;
            
           
            
        }
      
      return comp_nom;
 }
 
 
 
 
 
creation_table()
 {
   int i=0;
   char *name3;
   chaine *courant1;
   
   table_name=(struct t_name *)malloc(225*sizeof(struct t_name));
   
   for(i=0;i<nb_personne;i++)
    {
      name3=link_string(personne[i].prenom,personne[i].nom);
      comp_nom=insert(name3,personne[i].id);
      
      
    }
    
 }
 
 
 
 
 
 

void  generer_genealogie(int size)
 {
   int i,num2,num3;
   int pass;
   geneal temp;
   char str3[10],*name4;;
 
   
   for (pass=1;pass<size;pass++)
    {
      for (i=0;i<size-pass;i++)
      {
        if (gene[i].val>gene[i+1].val)
        {
         temp=gene[i];
         gene[i]=gene[i+1];
         gene[i+1]=temp;
        }
      }
    }
    
    
    
    for(i=0;i<size;i++)
     {
       
       sprintf(str3,  "%d",  i+1);
       
       if (strcmp(str3,"1")==0)
       {
         strcat(str3,"er");
       }
       else
       {
         strcat(str3,"e");
       }
       
       num2=cherche_donnee(gene[i].id);
       name4=link_string(personne[num2].prenom,personne[num2].nom);
       name4=link_string(name4,str3);
       personne[num2].note=name4;
       
     }
     
 }
 
 
 
 
 
 
 

cherche_gene(int num2)
 {
   char *tempo,*name3;
   int i,k;
   
         if(personne[num2].date_naissance!=NULL)
               { 
                 name3=link_string(personne[num2].prenom,personne[num2].nom);
                 name3=link_string(name3,personne[num2].date_naissance);
                 personne[num2].note=name3;
                 
                }
         else
              {
                
                gene[compt].id=personne[num2].id;
                gene[compt].val=0;
                 while (personne[num2].fam_parents!=NULL)
                  {
                    
                    
                    k=0;
                    
                    
                    while((strcmp(personne[num2].fam_parents,head_node[k].id_fam)!=0)&&(k<nb_node))
                      {
                       k++;
                       
                       
                      } 
                    
                    gene[compt].val++;
                     
                    tempo=head_node[k].vertex;
                    num2=cherche_donnee(tempo);
                   }
                   
                   compt++;
               }
              
}
  
main()
{ 
  int i=0,j,total_ligne;
  int comp2=0,num1;
  FILE *file_prolog,*fp;
  char *pers1,*pers2,*tempo;
  char *name1,*name2,*name3;
  rela *courant;
  chaine *courant2;
  
  
  
  yyparse();
 

  
  total_ligne=comp;
  
    
  personne=(struct donnee *)malloc(225*sizeof(struct donnee));
  head_node=(struct head *)malloc(225*sizeof(struct head));
  
  for(i=0;i<total_ligne;i++)
    {
     
     if (strcmp(line_gedcom[i].iden,"INDI")==0)        /*creer les informations de personnes*/
      { 
        personne[num_personne].id=line_gedcom[i].refe;
        i++;
        i=creation_personne(i);   /* retourne la ligne de line_gedcom*/
        i--;
        
       
        num_personne++;
        
      } 
      
      if (strcmp(line_gedcom[i].iden,"FAM")==0)/*creer graphe*/
       {
        
         head_node[num_node].id_fam=line_gedcom[i].refe;
         
         i++;
         
         i=creation_graphe(i);
        
         i--;
        
         num_node++; 
      }
    
  }  
  nb_node=num_node;
 
      
 /*---creer une table ----*/     
 
   nb_personne=num_personne;
   
   
   creation_table(); 
   
   
 /*---chercher les personnes de meme nom ---*/
  gene=(geneal *)malloc(225*sizeof(geneal));
  
  for(i=0;i<comp_nom;i++)
   { 
     compt=0;
     
     if (table_name[i].point->suiv!=NULL)
       {
          courant2=table_name[i].point;
          while(courant2->suiv!=NULL)
           { 
             num1=cherche_donnee(courant2->id);
             comp2=cherche_gene(num1);
             courant2=courant2->suiv; 
          }
          
          
            num1=cherche_donnee(courant2->id);
            cherche_gene(num1);
           generer_genealogie(compt);   
      } //
        
 }
   
   
   
   
     /*-----------------------------------------partie de prolog-----------------------------------*/
  
  fp=fopen("file_prolog.pl","a+");
   if(fp==NULL)
    {
      printf("erreur d'ouverture de la fichier 'prolog'");
      exit(2);
    }
    
  
  
  
  nb_personne=num_personne;
  num_personne=0;
  nb_node=num_node;
  
    
    
     /*----------------------creer  'homme()'-----------------------*/
  for(num_personne=0;num_personne<nb_personne;num_personne++)
    { 
      
      if((personne[num_personne].sex!=NULL)&&(strcmp(personne[num_personne].sex,"M")==0))
       {
       if((personne[num_personne].note)==NULL)
           fprintf(fp,"%s %s %s %s %s\n","homme(",personne[num_personne].prenom," ",personne[num_personne].nom,")."); 
         else
           fprintf(fp,"%s %s %s\n","homme(",personne[num_personne].note,")."); 
         
       }
    }
 
  /*-----------------------creer 'mari()' et 'pere()'------------------*/
 
  for (num_node=0;num_node<nb_node;num_node++)
   {
     
     pers1=head_node[num_node].vertex;
     
     j=cherche_donnee(pers1);
     
     if((personne[j].note)==NULL)
      name1=link_string(personne[j].prenom,personne[j].nom);
     else
      name1=personne[j].note;
     
     
                 
     pers2=head_node[num_node].firstnode->id; 
     
     j=cherche_donnee(pers2);  
     if((personne[j].note)==NULL)
       name2=link_string(personne[j].prenom,personne[j].nom); 
     else
       name2=personne[j].note;
     
     
     
      
     if (strcmp(head_node[num_node].firstnode->relation,"WIFE")==0)
      {
        
        fprintf(fp,"%s %s %s %s %s\n","mari(",name1,",",name2,")."); 
        
        courant=(rela *)malloc (225*sizeof(rela));
        courant=head_node[num_node].firstnode;
       
        while (courant->suiv!=NULL)
         {  courant=courant->suiv;
            
           if (strcmp(courant->relation,"CHIL")==0)
            {
              pers2=courant->id;
              
              j=cherche_donnee(pers2);
              if((personne[j].note)==NULL)
                name2=link_string(personne[j].prenom,personne[j].nom);
              else
                name2=personne[j].note;
              
              
              fprintf(fp,"%s %s %s %s %s\n","pere(",name1,",",name2,").");    
            }
           
         }
       }
     if (strcmp(head_node[num_node].firstnode->relation,"CHIL")==0)
        {
          courant=(rela *)malloc (225*sizeof(rela));
         courant=head_node[num_node].firstnode;
        fprintf(fp,"%s %s %s %s %s\n","pere(",name1,",",name2,")."); 
        
        while (courant->suiv!=NULL)
         {  courant=courant->suiv;
            
           if (strcmp(courant->relation,"CHIL")==0)
            {
              pers2=courant->id;
              
              j=cherche_donnee(pers2);
              if((personne[j].note)==NULL)
                name2=link_string(personne[j].prenom,personne[j].nom);
              else
                name2=personne[j].note;
              
              
              fprintf(fp,"%s %s %s %s %s\n","pere(",name1,",",name2,").");    
            }
        }
        
       
      }
      
   }
  
    fprintf(fp,"
    femme(F) :- mari(_,F).
    femme(F) :- pere(_,F), not(homme(F)),not(mari(_,F)).
    mere(M,E) :- pere(P,E),mari(P,M).
    mere(X) :- mere(X,_).
    pere(X) :- pere(X,_).
    
    enfant(E,P) :- pere(P,E).
    enfant(E,M) :- mere(M,E).
    enfant(X) :- enfant(X,_).
    
    descendant(D,A) :- enfant(D,A).
    descendant(D,A) :- enfant(D,X),descendant(D,X).
    
    aff :- homme(X),write('Homme : '),write(X),nl,fail.
    aff :- femme(X),write('Femme : '),write(X),nl,fail.
    aff :- pere(X),write('Pere : '),write(X),nl,fail.
    aff :- mere(X),write('Mere : '),write(X),nl,fail.
    aff :- enfant(X),write('Enfant : '),write(X),nl,fail.
    aff :- descendant(D,A),write(D),write(' descend de '),write(X),nl,fail.");
 
  fclose(fp);
  

      
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -