%{ extern int yylex(); #include int yyerror (char const *message) { fprintf(stderr,"<%s>\n", message); return 0; } #include #include "set.h" Set_t Var[100]; /* tableau des variables */ %} %error-verbose %union { int index; /* valeur = indice de variable S_i */ Elem_t elem; /* valeur = elemt d'ensemble */ Set_t set; /* Ensemble (bit-vector) */ } %token VAR %token ELEM %token '(' ')' '{' '}' ',' '\n' '=' %token UNION INTER COMP DIFF %type Expr E_list U_list I_list %% Ligne : | Ligne Expr '\n' {printf(" == "); Println_set($2);} | Ligne VAR '=' Expr '\n' {Var[$2]=$4; printf("Var[%d] = ",$2); Println_set($4);} | Ligne error '\n' {yyerrok; printf(" ERREUR SYNTAXE \n");} ; Expr : '{' '}' {$$=Empty_set();} | '{' E_list '}' {$$=$2;} // | UNION '(' Expr ',' Expr ')' {$$=Union_set($3,$5);} // | INTER '(' Expr ',' Expr ')' {$$=Inter_set($3,$5);} | UNION '(' U_list ')' {$$=$3;} | INTER '(' I_list ')' {$$=$3;} | DIFF '(' Expr ',' Expr ')' {$$=Diff_set($3,$5);} | COMP '(' Expr ')' {$$=Comp_set($3);} | VAR {$$=Var[$1];} E_list : ELEM {$$=Singleton_set($1);} | E_list ',' ELEM {$$=Add_elem_set($3,$1);} I_list : Expr {$$=$1;} | I_list ',' Expr {$$=Inter_set($1,$3);} U_list : Expr {$$=$1;} | U_list ',' Expr {$$=Union_set($1,$3);} %% int main(void) { return yyparse(); }