Manuel §1.2.18    

Machine à états

Sisal propose une classe générique States permettant de définir aisément des machines à états finis.

Une machine à états finis se caractérise par une valeur entière limitée à un ensemble fini de valeurs définies dans une énumération.

L'implémentation retenue par sisal passe par l ’instanciation de la classe générique states au moment de la compilation dans une nouvelle classe portant le nom du nouveau type de machine à états finis. Cela permet d'offrir des méthodes de visualisation textuelle (« en clair ») de l'état d'une machine que ce soit dans les affichages, dans les traces ou les visualisations de débogage, mais cela nécessite l'inclusion du fichier states.sch.

NomDeMachineAEtatsFinis states, etat0{, etat2};

Un exemple, dans le cas présent, vaut tous les discours. Prenons l'exemple d'une imprimante :

imprimante states, arret, chauffage, impression ;

Cette déclaration de type, nous apporte la définition de la classe imprimante [1]

type imprimante class sys_states

begin

arret const 0 ;

chauffage const 1 ;

impression const 2 ;

state;

change event;

labels static list;

create( initial_state = 0) ;

set( val);

print();

next();

previous();

end ;

function imprimante.create( initial_state) begin

labels.add( « arret ») ;

labels.add( « chauffage ») ;

labels.add( « impression ») ;

state = initial_state;

end

Donc chaque machine à états de type imprimante sera caractérisée par un état (state) ayant une des trois valeurs possibles 0 ou 1 ou 2 qui sera visualisé en clair avec les textes « arret », « chauffage » et « impression ».

On peut alors déclarer une ou plusieurs imprimantes.

monImprimante imprimante ;
grosse_imprmante imprimante ;

...

grosse_imprimante.set( imprimante.chauffage) ;
grosse_imprimante.next() ; // L'imprimante passe en  impression
echo( grosse_imprimante.print()) ; // nous trace  « chauffage » et non pas 2

[1] L'implémentation est délicate car elle passe par de la génération au vol de code sisal source.