%{ 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' '=' /* priorité et ordre d'evaluation */ %left UNION DIFF %left INTER %left COMP %type Expr E_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;} | '(' Expr ')' {$$=$2;} | Expr UNION Expr {$$=Union_set($1,$3);} | Expr INTER Expr {$$=Inter_set($1,$3);} | Expr DIFF Expr {$$=Diff_set($1,$3);} | COMP Expr {$$=Comp_set($2);} | VAR {$$=Var[$1];} E_list : ELEM {$$=Singleton_set($1);} | E_list ',' ELEM {$$=Add_elem_set($3,$1);} %% int main(void) { return yyparse(); }