On demande de réaliser, à l'aide des outils Flex et Bison, un interpréteur d'expressions ensemblistes répondant aux spécifications suivantes (on considérera uniquement des ensembles d'entiers compris entre 1 et 32):
a..z A..Z identificateur mono-lettre (ident) non "case-sensitive"
{ } délimiteurs classiques des ensembles
:= affectation
, séparateur d'éléments
1..32 seuls éléments possibles
\n fin de ligne
union UNION union ensembliste
inter INTER intersection ensembliste
comp COMP complémentaire dans {1..32}
diff DIFF différence ensembliste
liste ::= <empty> // sortie de l'interpréteur
| liste instruction '\n' // interprétation de
// l'instruction
instruction ::= ident ':=' expression // calcul de l'expression et
// affectation
| ident // affichage
expression ::= operande // renvoie l'opérande
| operande operateur2 operande // renvoie le résultat de
| operateur1 operande // l'opération ensembliste
operateur2 ::= 'UNION' | 'INTER' | 'DIFF' | 'union' | 'inter' | 'diff'
operateur1 ::= 'COMP' | 'comp'
operande ::= ident
| ensemble
ensemble ::= { } // ensemble vide
| { liste-elements } // ensemble non vide
liste-elements ::= élément
| élément , liste-elements
A := { } met l'ensemble vide dans A
a := { 1, 22 } met dans A l'ensemble { 1, 22 }
b := a UNION { 3 } met dans B l'union de A et du singleton { 3 }
B affiche l'ensemble B :
{ 1, 3, 22 }
C := { 1, 3, 5 } met dans C l'ensemble { 1, 3, 5 }
A := B inter C met dans A l'intersection de B et de C
a affiche l'ensemble A :
{ 1, 3 }