Automate à pile
Un article de Wikipédia, l'encyclopédie libre.
Cet article est une ébauche à compléter concernant les mathématiques, vous pouvez partager vos connaissances en le modifiant. |
Un automate à pile est une machine abstraite utilisée en informatique théorique et, plus précisément, en théorie des automates. Un automate à pile est semblable à un automate fini non-déterministe mais il dispose également d'une pile qui peut être utilisée pour stocker des informations pertinentes. La puissance de calcul des automates à piles correspond aux langages non-contextuels soit ceux qui peuvent être décrits par une grammaire hors-contexte.
Sommaire |
[modifier] Utilisation
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).
[modifier] 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.
[modifier] 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.
[modifier] Implémentation d'un automate à pile
#include <stdlib.h> #include <stdio.h> #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; }