/* Family Treatment (1996) */ /* */ /* Author : Marie Aimar */ /* File : parser_family.y */ %{ #include #include #include #include "generic.h" #include "list.h" #include "family.h" #include "file.h" static int no_error_line=1; jmp_buf ENVIRONMENT_BUFFER ; char *name; %} %union { char *t_nom; float t_float; } %start set_of_family %token IDENT %token RATIONAL %token FAMILY %token END_LINE %type family_number %type number_of_members %type identification %type parent1 %type parent2 %type sexe %type status %type age %type family_id %type q1 %% set_of_family : /*empty */ | set_of_family family | error {yyerrok;} ; family : /* empty */ | FAMILY END_LINE family_number END_LINE number_of_members { no_error_line++;no_error_line++; new_family($3,$5); } END_LINE { no_error_line++;}rest_of_family ; family_number : IDENT { name = (char *)malloc(1+strlen($1)); strcpy(name,$1); $$=name; } ; number_of_members : IDENT { name = (char *)malloc(1+strlen($1)); strcpy(name,$1);$$=name;} ; rest_of_family : /* empty */ | rest_of_family line ; line : /* rien */ END_LINE { no_error_line++; } | family_id identification parent1 parent2 sexe age status q1 END_LINE { no_error_line++; add_member($2,$3,$4,$5,$6,$7,$8);} | family_id identification parent1 parent2 sexe age q1 END_LINE { no_error_line++; add_member($2,$3,$4,$5,$6,NULL,$7);} | family_id identification parent1 parent2 sexe age status END_LINE { no_error_line++; add_member($2,$3,$4,$5,$6,$7,0.0); } | family_id identification parent1 parent2 sexe age END_LINE { no_error_line++; add_member($2,$3,$4,$5,$6,NULL,0.0); } ; identification : IDENT{name = (char *)malloc(1+strlen($1)); strcpy(name,$1); $$=name; } ; parent1 : IDENT{name = (char *)malloc(1+strlen($1)); strcpy(name,$1);$$=name; } ; parent2 : IDENT{name = (char *)malloc(1+strlen($1)); strcpy(name,$1);$$=name; } ; status : IDENT{name = (char *)malloc(1+strlen($1)); strcpy(name,$1);$$=name; } ; family_id : IDENT{name = (char *)malloc(1+strlen($1)); strcpy(name,$1);$$=name;}; age : IDENT{$$=atoi($1);} ; sexe : IDENT { $$=atoi($1);} ; q1 : RATIONAL{$$=$1;} ; %% #include "lex.family.c" int yyerror(char *s) { printf("%s dans la description des familles a la ligne %d \n Verifier le format du fichier \n ",s,no_error_line);exit (3); } void read_file (FILE *fic_input) { yyin=fic_input; if (setjmp(ENVIRONMENT_BUFFER)==0) { yyparse(); printf("\n fin de lecture du fichier de description de la famille \n "); } else { fclose(fic_input); } }