pour ceux qui cherche un programme qui transforme un afn en afd
Source / Exemple :
///////////////////////////////////////////////////////////////////////////
// Transformation AFN en AFD
//
#include <stdio.h>
#include <stdlib.h>
///////////////////////////////////////////////////////////////////////////
//
//
#define EPSILON -1
#define NOETAT -1
///////////////////////////////////////////////////////////////////////////
// A F N
//
typedef struct ptr_list* ptr_list_t;
struct ptr_list
{
int info;
ptr_list_t suiv;
};
typedef struct ptr_trans* ptr_trans_t;
struct ptr_trans
{
int e, s;
ptr_list_t vers_e;
ptr_trans_t suiv;
};
typedef struct
{
ptr_list_t letat;
ptr_list_t lsymb;
ptr_trans_t ltrans;
}afn_t;
///////////////////////////////////////////////////////////////////////////
// A F D
//
typedef struct ptr_detat* ptr_detat_t;
struct ptr_detat
{
int e;
ptr_list_t letat;
ptr_detat_t suiv;
};
typedef struct ptr_dtrans* ptr_dtrans_t;
struct ptr_dtrans
{
int de, s, fe;
ptr_dtrans_t suiv;
};
typedef struct
{
ptr_detat_t ldetat;
ptr_list_t lsymb;
ptr_dtrans_t ltrans;
}afd_t;
///////////////////////////////////////////////////////////////////////////
// P R O T O T Y P E
//
afn_t* saisie_afn();
void affiche_afd(afd_t*);
afd_t* afn2afd(afn_t*);
void free_afn(afn_t*);
void free_afd(afd_t*);
///////////////////////////////////////////////////////////////////////////
// F O N C T I O N M A I N
//
void main()
{
// Variables locales
afn_t *afn;
afd_t *afd;
// Création de l'AFN
afn = saisie_afn();
// Transformation de l'AFN
afd = afn2afd(afn);
// Affichage des resultats
affiche_afd(afd);
// Libération de la mémoire
free_afn(afn);
free_afd(afd);
}
///////////////////////////////////////////////////////////////////////////
//
//
void free_list(ptr_list_t p)
{
while (p)
{
ptr_list_t q = p;
p = p->suiv;
free(q);
}
}
///////////////////////////////////////////////////////////////////////////
//
//
void free_afn(afn_t *afn)
{
ptr_trans_t q, p = afn->ltrans;
free_list(afn->letat);
free_list(afn->lsymb);
while (p)
{
q = p;
p = q->suiv;
free_list(q->vers_e);
free(q);
}
}
///////////////////////////////////////////////////////////////////////////
//
//
void free_afd(afd_t *afd)
{
ptr_detat_t q1, p1 = afd->ldetat;
ptr_dtrans_t q2, p2 = afd->ltrans;
while (p1)
{
q1 = p1;
p1 = q1->suiv;
free_list(q1->letat);
free(q1);
}
free_list(afd->lsymb);
while (p2)
{
q2 = p2;
p2 = p2->suiv;
free(q2);
}
}
///////////////////////////////////////////////////////////////////////////
//
//
void list_inserer(ptr_list_t *ptr, int e)
{
ptr_list_t p = (ptr_list_t)malloc(sizeof(struct ptr_list));
p->info = e;
p->suiv = 0;
if (*ptr)
{
ptr_list_t q;
for (q = *ptr; q->suiv; q = q->suiv);
q->suiv = p;
}
else
}
///////////////////////////////////////////////////////////////////////////
//
//
afn_t* saisie_afn()
{
int nbr_etat, nbr_symb, nbr, i, j, k, e;
afn_t *afn;
ptr_trans_t tr;
afn = (afn_t*)malloc(sizeof(afn_t));
afn->letat = 0;
afn->lsymb = 0;
afn->ltrans = 0;
// La list des etats
printf("Donner le nombre des etats: ");
scanf("%d", &nbr_etat);
for (i = 0; i < nbr_etat; i++)
list_inserer(&afn->letat, i);
/* La list des symboles */
printf("Donner le nombre des symboles (sans compter l'epsilon): ");
scanf("%d", &nbr_symb);
for (i = 0; i < nbr_symb; i++)
list_inserer(&afn->lsymb, i);
// La list des transition
for (i = 0; i < nbr_etat; i++)
for (j = -1; j < nbr_symb; j++)
{
if (j == -1)
printf("De l'etat '%d' combien d'etat vous pouvez atteindre avec le symbole epsilon: ", i);
else
printf("De l'etat '%d' combien d'etat vous pouvez atteindre avec le symbole %c: ", i, 'a' + j);
scanf("%d", &nbr);
if (nbr)
{
tr = (ptr_trans_t)malloc(sizeof(struct ptr_trans));
tr->e = i;
tr->s = j;
tr->vers_e = 0;
for (k = 0; k < nbr; k++)
{
printf("Vous pouvez atteindre l'etat ? ");
scanf("%d", &e);
list_inserer(&tr->vers_e, e);
}
tr->suiv = afn->ltrans;
afn->ltrans = tr;
}
}
return (afn);
}
///////////////////////////////////////////////////////////////////////////
//
//
void affiche_afd(afd_t *afd)
{
ptr_detat_t d;
ptr_list_t s;
d = afd->ldetat;
printf(" |");
for (s = afd->lsymb; s; s = s->suiv)
printf(" %c |", 'a' + s->info);
printf("\n");
for (d = afd->ldetat; d; d = d->suiv)
{
ptr_dtrans_t ldtr;
printf("%c |", 'A' + d->e);
for (ldtr = afd->ltrans; ldtr; ldtr = ldtr->suiv)
if (ldtr->de == d->e)
printf(" %c |", 'A' + ldtr->fe);
printf("\n");
}
}
///////////////////////////////////////////////////////////////////////////
//
//
void afd_ajouter_etat(ptr_detat_t *ldetat, int e, ptr_list_t letat)
{
ptr_detat_t lde;
ptr_list_t p;
lde = (ptr_detat_t)malloc(sizeof(struct ptr_detat));
lde->e = e;
lde->letat = 0;
lde->suiv = 0;
for (p = letat; p; p = p->suiv)
list_inserer(&lde->letat, p->info);
if (*ldetat)
{
ptr_detat_t q;
for (q = *ldetat; q->suiv; q = q->suiv);
q->suiv = lde;
}
else
}
///////////////////////////////////////////////////////////////////////////
//
//
int is_in_list(ptr_list_t letat, int e)
{
ptr_list_t p;
for (p = letat; p; p = p->suiv)
if (p->info == e)
return (1);
return (0);
}
///////////////////////////////////////////////////////////////////////////
//
//
int epsilon_arc(afn_t* afn, int se, int fe)
{
ptr_trans_t p;
ptr_list_t q;
for (p = afn->ltrans; p; p = p->suiv)
if ((p->e == se) && (p->s == EPSILON))
for (q = p->vers_e; q; q = q->suiv)
if (q->info == fe)
return (1);
return (0);
}
///////////////////////////////////////////////////////////////////////////
//
//
void empiler_etat(ptr_list_t *p, int e)
{
ptr_list_t q = (ptr_list_t)malloc(sizeof(struct ptr_list));
q->info = e;
q->suiv = *p;
}
///////////////////////////////////////////////////////////////////////////
//
//
int depiler_etat(ptr_list_t *letat)
{
int e;
ptr_list_t p;
if (*letat)
{
e = (*letat)->info;
p = *letat;
free(p);
return (e);
}
else
return (NOETAT);
}
///////////////////////////////////////////////////////////////////////////
//
//
ptr_list_t epsilon_fermeture(afn_t* afn, ptr_list_t T)
{
ptr_list_t p, e_f = 0, pile_etat = 0;
int t;
for (p = T; p; p = p->suiv)
{
/* On initialise le epsilon fermeture de T à T */
list_inserer(&e_f, p->info);
/* On empile tout les etats des T */
empiler_etat(&pile_etat, p->info);
}
/* Tant que pile est non vide */
while ((t = depiler_etat(&pile_etat)) != NOETAT)
{
for (p = afn->letat; p; p = p->suiv)
{
/* Pour chaque etat u avec un arc de t à u etiquite epsilon */
/* u = p->e*/
if (epsilon_arc(afn, t, p->info))
{
/* Si u n'appartient pas à epsilon fermeture de T */
if (!is_in_list(e_f, p->info))
{
/* Ajouter u à l'epsilon fermeture de T */
list_inserer(&e_f, p->info);
/* On empile u dans la pile */
empiler_etat(&pile_etat, p->info);
}
}
}
}
return (e_f);
}
///////////////////////////////////////////////////////////////////////////
//
//
void afd_ajouter_trans(ptr_dtrans_t *ltrans, int de, int fe, int s)
{
ptr_dtrans_t dtrans = (ptr_dtrans_t)malloc(sizeof(struct ptr_dtrans));
dtrans->de = de;
dtrans->fe = fe;
dtrans->s = s;
dtrans->suiv = 0;
if (*ltrans)
{
ptr_dtrans_t q;
for (q = *ltrans; q->suiv; q = q->suiv);
q->suiv = dtrans;
}
else
}
///////////////////////////////////////////////////////////////////////////
//
//
int afd_trouve_etat(afd_t *afd, ptr_list_t letat)
{
ptr_detat_t dp;
ptr_list_t dp_le, dp_e;
for (dp = afd->ldetat; dp; dp = dp->suiv)
{
int nbr_element = 0;
/* Sont t-il egaux en nombre d'element */
for (dp_e = dp->letat; dp_e; dp_e = dp_e->suiv, nbr_element++);
for (dp_le = letat; dp_le; dp_le = dp_le->suiv, nbr_element--);
if (nbr_element == 0)
{
for (dp_e = dp->letat; dp_e; dp_e = dp_e->suiv)
{
int trouve = 0;
for (dp_le = letat; dp_le; dp_le = dp_le->suiv)
if (dp_le->info == dp_e->info)
{
trouve = 1;
break;
}
if (trouve == 0)
return (NOETAT);
}
return (dp->e);
}
}
return (NOETAT);
}
///////////////////////////////////////////////////////////////////////////
//
//
ptr_list_t transiter(afn_t* afn, ptr_list_t letat, int s)
{
ptr_list_t p, q, tran = 0;
ptr_trans_t tr;
for (p = letat; p; p = p->suiv)
for (tr = afn->ltrans; tr; tr = tr->suiv)
if ((tr->e == p->info) && (tr->s == s))
for (q = tr->vers_e; q; q = q->suiv)
list_inserer(&tran, q->info);
return (tran);
}
///////////////////////////////////////////////////////////////////////////
//
//
afd_t* afn2afd(afn_t *afn)
{
afd_t *afd;
ptr_list_t L = 0, U, s;
ptr_detat_t p;
int ee, e = 0;
afd = (afd_t*)malloc(sizeof(afd_t));
afd->ldetat = 0;
afd->lsymb = 0;
afd->ltrans = 0;
/* L'AFN et l'AFD ont les même symboles */
for (s = afn->lsymb; s; s = s->suiv)
list_inserer(&afd->lsymb, s->info);
list_inserer(&L, 0);
U = epsilon_fermeture(afn, L);
afd_ajouter_etat(&afd->ldetat, e++, U);
for (p = afd->ldetat; p; p = p->suiv)
{
for (s = afn->lsymb; s; s = s->suiv)
{
/* Netoyage de mémoire */
free_list(L);
free_list(U);
L = transiter(afn, p->letat, s->info);
U = epsilon_fermeture(afn, L);
ee = afd_trouve_etat(afd, U);
if (ee == NOETAT)
{
/* On lui donne un nom */
ee = e++;
afd_ajouter_etat(&afd->ldetat, ee, U);
}
afd_ajouter_trans(&afd->ltrans, p->e, ee, s->info);
}
}
free_list(L);
free_list(U);
return (afd);
}
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.