Les automates à pile utilisent une zone de mémoire organisée en pile, qui permet
de sauver des informations.
Le choix d'une transition peut dépendre de la valeur au sommet de la pile (pop)
Une transition peut entraîner un ou plusieurs empilements (push).
Définitions formelles
Un automate à pile est un 7-uplet , où
est l'ensemble d'états,
est l'alphabet d'entrée,
est l'alphabet de pile,
est la relation de transition,
est le symbole de pile vide,
est l'état initial,
est l'ensemble des états terminaux.
Exemples
Reconnaissance du langage
On peut utiliser l'automate
où les transitions sont définies par :
pour les autres valeurs de
Par exemple, dans l'état , si on lit un et que l'on dépile un , on passe dans l'état sans rien empiler.
Implémentation d'un automate à pile
#include
#include
#define POP -1
#define ACCEPT -2
#define ERROR -3
#define ALPHABET 3 / Grandeur /
/
Push-down automation)
Symbol | ( | ) | \0
---------+---------+--------+-----------
State 0 | PUSH 1 | ERROR | ACCEPT
State 1 | PUSH 1 | POP | ERROR
/
int states[2][ALPHABET 2] =
{
{
'(', 1 / PUSH 1 /,
')', ERROR,
'\0', ACCEPT
},
{
'(', 1 / PUSH 1 /,
')', POP,
'\0', ERROR
}
};
int main( int argc, char argv )
{
int stack[100] = { 0 };
int i = 0;
int action = 0;
int tos = stack;
char s [80+1];
char p = s;
/ Chaine de donnée /
printf("Entrez l'expression: ");
gets( &s );
/ Pile poussée /
(tos++) = 0;
/ Sortie /
do
{
/ Boucle /
action = ERROR;
for( i = 0; i < ALPHABET; i++ )
{
if( states[ (tos-1)][i 2] == p )
{
action = states[ (tos-1)][i 2+1];
break;
}
}
/ Actions /
if( action == ERROR )
{
printf("Erreur innatendue à la position %d", p-s);
break;
}
else if( action == ACCEPT )
printf("Sortie acceptée!");
else if( action == POP )
tos--;
else
(tos++) = action;
/ Données supplémentaires... /
p++;
}
while( action != ACCEPT );
getchar();
return 0;
}