📄 yacc36.y
字号:
%{
#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 + -