Reconnaissance du langage
On peut utiliser l'automate
où les transitions sont définies par :
(1)
(2)
(3)
(4)
(5)
(6)
(7)
Par exemple, dans l'état
On commence par lire le premier caractère : Si le mot est vide on a fini et le mot est accepté car q0 est un état final. Si c'est un a, on empile
Ensuite dans l'état q1, à chaque a on empile A (2). Si on a un b, deux possibilités : - Si on n'a empilé qu'un seul
Dans l'état q2, si on a un b, soit on dépile un A et on reste dans cet état (5), soit on dépile un
Dans l'état q3, si le mot est fini on l'accepte car
En langage C :
#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 inattendue à 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;
}