Vous êtes sur la page 1sur 2

UniversitéHassibaBenbouali-Chlef Année universitaire : 2020/2021

FacultéScience exacte et informatique 2ième année Licence-Informatique


Département d’informatique module : Théorie des langages

CORRIGÉ ABRÉGÉ DU TP no 2 de ThL


Génération des mots d’un langage régulier à
partir d’une grammaire régulière à droite simple

Comme c’est indiqué dans le sujet du TP n°2, on associe une fonction à chaque non terminal.
#include <stdio.h>
#include <stdlib.h>
#define N 20
#define NMots 200;
char M[N]="";
int i, nm, NmMots = NMots;

void S(char M[]) { // Fonction S associée au non terminal S


char M1[N]="";
int n;

n = strlen(M);
// application de la règle S  aA :
M1[n] = 'a';
M1[n+1] = '\0';
A(M1); // appel de A
} // Fin de la fonction S

void A(char M[]){ // Fonction A associée au non terminal A


int n,r;
char M1[N]="";

n = strlen(M);
r = rand()%3; // nombre aléatoire entre 0 et 2 inclus
strcpy(M1,M) ;
switch (r) {
case 0 : // application de la règle A  bA :
M1[n] = 'b';
M1[n+1] = '\0';
A(M1); // appel de A
break;
case 1 : // application de la règle A  cA :
M1[n] = 'c';
M1[n+1] = '\0';
A(M1); // appel de A
break;

Corrigé du TP n° 2 de Théorie des langages -1-


case 2 : // application de la règle A  d :
if (i<nm) {
M1[n] = 'd';
M1[n+1] = '\0';
printf(" %s \n",M1); // affichage du mot formé
}
break;
}
} // Fin de la fonction A

main ()
{
do {
printf(" nombre de mots a generer : ");
scanf("%d",&nm);
} while ((nm<1)||(nm>NmMots));
printf("mots du langage : \n");
i = 0;
while (i<nm) {
strcpy(M,"");
S(M); // appel de S
i++;
}
printf("\n");
}

Remarque :
Tel qu’écrit, ce programme peut générer des mots dupliqués (affichage d’un même mot plusieurs fois).
Il serait intéressent de lui rajouter une fonctionnalité pour éviter cette duplication.

------------*****------------ Fin du corrigé du TP n° 2 de ThL ------------*****------------

Corrigé du TP n° 2 de Théorie des langages -2-

Vous aimerez peut-être aussi