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

📄 yacc36.y

📁 GEDCOM语言->PROLOG语言 用LEX和YACC写的简单编译器 我们学校的一个作业
💻 Y
📖 第 1 页 / 共 2 页
字号:
%{
#include <stdio.h>

typedef struct 
 {
  int num_ligne;
  int niveau;
  char *iden;
  char *refe;
  char *info;
 }line; 

struct donnee
   {
     char *id;
     char *nom;
     char *prenom;
     char *sex;
     char *date_naissance;
     char *lieu_naissance;
     char *fam_couple;
     char *fam_parents;
     char *note;
   } *personne;
   
typedef struct node
 {
   char *id;
   char *relation;
   struct node *suiv;
 }rela;

struct head
 {
   char *vertex;
   char *id_fam;
   rela *firstnode;   
 } *head_node;
 
 typedef struct t_id
 {
   char *id;
   struct t_id *suiv;
 } chaine;
 
struct t_name
 {
   char *name;
   chaine *point;
 } *table_name;

typedef struct 
 {
  char *id;
  int val; 
 }geneal;
 
line line_gedcom[1000];
int comp=0,comp_nom;
rela *vernode,*dernier;
geneal *gene;
int num_personne=0,num_famille=0;
chaine *table_id;

int num_node=0,nb_node;
int nb_personne;
int compt=0;


%}

%union
 {
  int entier;
  char *var;
 }

%token <entier> NB
%token <var> ESPACE IDEN REFE  BR INFO TRLR
%type <var>  E T C F




 
%%
S: C 
  |  S C 
  ;
  
C:NB ESPACE E  { 
                 
                line_gedcom[comp].niveau=$1;line_gedcom[comp].num_ligne=comp;
                comp++;
               }

E:IDEN T BR {
              
              line_gedcom[comp].iden=$1;
            }
 |REFE ESPACE IDEN BR {                
                       
                       line_gedcom[comp].refe=$1;
                       line_gedcom[comp].iden=$3;
                      
                      }
 |TRLR {return 0;}
 ;
 
T: ESPACE REFE F { 
                  
                 
                  line_gedcom[comp].refe=$2;
                 
                  
                }
  |ESPACE INFO  { 
                  
                  line_gedcom[comp].info=$2;
                 
  
                  } 
  | {
     printf("");
     
    }
 ;
F: ESPACE INFO  { line_gedcom[comp].info=$2;
                  } 
  | {
     printf("");
    }
 ;             

%%

 
int yyerror( char *s )
 {
  fprintf( stderr, "%s\n", s );
  exit(1);
}

int yywrap ()
{return 1;}

char *get_nom(char *infor)
 {
   char *str1;
   char *sub_nom,*tempo,*nom1;
   int len_nom;
   
   str1="/";
   sub_nom=(char *)malloc(sizeof(char));
   sub_nom=strstr(infor,str1);
   
   len_nom=strlen(sub_nom);
   
   tempo=(char *)malloc(sizeof(char));
   nom1=(char *)malloc(sizeof(char));
   nom1=strncpy(tempo,sub_nom,len_nom-2)+1;
   
   
   return nom1;
   
 }
 char *get_prenom(char *infor)
 {
   int j,len;   
   char *sub_prenom;
  
   sub_prenom=(char *)malloc(225*sizeof(char));
   len=strlen(infor);

   for (j=0;j<=len;j++)
   {
     sub_prenom[j]=*infor;
     
    
     if( (*infor=='/')||(*infor==' ')) 
       { 
         
         sub_prenom[j]='\0';
         return sub_prenom;
       }
     infor++;
   }
 }
 
char *chaine_sex(char *infor)
 {
   char *str3;
   
   
   if(strstr(infor,"M")!=NULL)
     str3="M";
   
   if(strstr(infor,"F")!=NULL)
     str3="F";
   
   return str3;
 } 


int creation_personne(int n_ligne)
 {
   int i;
   char *str2;
   
   while (line_gedcom[n_ligne].niveau!=0)
    {
      if((line_gedcom[n_ligne].iden!=NULL)&& (strcmp(line_gedcom[n_ligne].iden,"NAME")==0))
       { 
         
         personne[num_personne].nom=get_nom(line_gedcom[n_ligne].info);
         
         personne[num_personne].prenom=get_prenom(line_gedcom[n_ligne].info);
          
       }
      
      if ((line_gedcom[n_ligne].iden!=NULL)&&(strcmp(line_gedcom[n_ligne].iden,"SEX")==0))
       {
         str2=chaine_sex(line_gedcom[n_ligne].info);
         personne[num_personne].sex=str2;
         
         
       }
      
      if ((line_gedcom[n_ligne].iden!=NULL)&&(strcmp(line_gedcom[n_ligne].iden,"BIRT")==0))
       {
         i=line_gedcom[n_ligne].niveau;
         n_ligne++;
        
         
         while(line_gedcom[n_ligne].niveau > i)
          {
            if ((line_gedcom[n_ligne].iden!=NULL)&&(strcmp(line_gedcom[n_ligne].iden,"DATE")==0))
             {
               personne[num_personne].date_naissance=line_gedcom[n_ligne].info;
               
             }
            
            if ((line_gedcom[n_ligne].iden!=NULL)&&(strcmp(line_gedcom[n_ligne].iden,"PLAC")==0))
             {
               personne[num_personne].lieu_naissance=line_gedcom[n_ligne].info;
               
             }
            
            n_ligne++;
          }
       }
       
      if ((line_gedcom[n_ligne].iden!=NULL)&&(strcmp(line_gedcom[n_ligne].iden,"FAMS")==0))
        {
          personne[num_personne].fam_couple=line_gedcom[n_ligne].refe;
          

        }
       
      if ((line_gedcom[n_ligne].iden!=NULL)&&(strcmp(line_gedcom[n_ligne].iden,"FAMC")==0))
        {
          personne[num_personne].fam_parents=line_gedcom[n_ligne].refe;
          
        }
       
      n_ligne++;
    }
    return n_ligne;
 }

int relation_children (int n_ligne1)
 {
   
   
   do
    {
       if((line_gedcom[n_ligne1].iden!=NULL)&&(strcmp(line_gedcom[n_ligne1].iden,"CHIL")==0))        
        {
          
          vernode=(rela *)malloc (225*sizeof(rela));
          vernode->id=line_gedcom[n_ligne1].refe;
          vernode->relation=line_gedcom[n_ligne1].iden;
          vernode->suiv=NULL;
          
          
          
          dernier->suiv=vernode;
          
          dernier=vernode;
          
          
         } 
        n_ligne1++;
     }
    while(line_gedcom[n_ligne1].niveau!=0);
    
    return n_ligne1;
 }



int creation_graphe(int n_ligne)
 {
   int count;
   count=n_ligne;
   
   
   while (line_gedcom[n_ligne].niveau!=0)
    {
     if(strcmp(line_gedcom[n_ligne].iden,"HUSB")==0)
       {
         head_node[num_node].vertex=line_gedcom[n_ligne].refe;
         
         head_node[num_node].firstnode=(rela *)malloc (225*sizeof(rela));
         head_node[num_node].firstnode=NULL;
               
         
               
         n_ligne=count;
               
         while (line_gedcom[n_ligne].niveau!=0)
          {
            if (strcmp(line_gedcom[n_ligne].iden,"WIFE")==0)
              {
                 vernode=(rela *)malloc (225*sizeof(rela));
                 vernode->id=line_gedcom[n_ligne].refe;
                   vernode->relation=line_gedcom[n_ligne].iden;
                   
                   vernode->suiv=NULL;
                   
                   head_node[num_node].firstnode=vernode;
                   
                   
                  dernier=(rela *)malloc (225*sizeof(rela));
                   dernier=vernode;
                  
                   
                 
                   
                   n_ligne=count;
                   
                   while (line_gedcom[n_ligne].niveau!=0)
                    {                  
                      if (strcmp(line_gedcom[n_ligne].iden,"CHIL")==0)
                      
                        n_ligne=relation_children(n_ligne);
                      
                      else
                       n_ligne++;
                    }
                  
                }
               else   /*wife*/
                 n_ligne++;
             }
                 
          if (head_node[num_node].firstnode==NULL)
                {
                  n_ligne=count;
                  while (line_gedcom[n_ligne].niveau!=0)
                  {
                   if (strcmp(line_gedcom[n_ligne].iden,"CHIL")==0)
                    {
                     vernode=(rela *)malloc (225*sizeof(rela));
                     vernode->id=line_gedcom[n_ligne].refe;
                     vernode->relation=line_gedcom[n_ligne].iden;
                     
                     vernode->suiv=NULL;
                     head_node[num_node].firstnode=vernode;
                     
                     dernier=(rela *)malloc (225*sizeof(rela));
                     dernier=vernode;
                     
                     n_ligne++;
                     n_ligne=relation_children(n_ligne);
                   }
                 } 
              } 
            }   
         else    /*husb*/
           n_ligne++;
     
     
    }     
    return n_ligne;    
 }

char *link_string(char *str1,char *str2)
 {
   char *str;
   
   str=(char *)malloc(225*sizeof(char));
   
   strcpy(str,str1);
   strcat(str," ");
   strcat(str,str2);
   return str;
   
 }

int cherche_donnee(char *person)
 {
   int i=0;
   while(strcmp(person,personne[i].id)!=0)
    {
      i++;
    }
 return i;

⌨️ 快捷键说明

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