miratiba
Messages postés1Date d'inscriptionmardi 3 janvier 2012StatutMembreDernière intervention 3 janvier 2012
-
3 janv. 2012 à 02:27
Char Snipeur
Messages postés9696Date d'inscriptionvendredi 23 avril 2004StatutContributeurDernière intervention 3 octobre 2023
-
3 janv. 2012 à 11:38
Bonjour,
je veux ecrire un programme qui permet de transformer n'importe quelle grammaire en une grammaire simple,en passant bien sur par les etapes suivantes:
-> rendre la grammaire sous forme de grammaire réduite :
- Productive
- Accessible
-> rendre la grammaire sous forme de grammaire propre :
- Eliminer les £-règles (les règles vides )
- Eliminer les règles unitaires.
j'ai developpé un code en c il compile mais il ne s'éxécute pas pouvez vous m'aider svp?
//ajout d'une production
RGL *ajout ( RGL *p, char A,char B[])
{
RGL *p_new;
p_new= (RGL*) malloc (sizeof( *p_new));
if (p_new != NULL)
{
p_new->A=A;
strcpy(p_new->termin,B);
p_new->next = NULL;
if (p == NULL)
{
p = p_new;
}
else
{
RGL *q = p;
while (q->next != NULL)
{
q = q->next;
}
q->next = p_new;
}
}
return p;
}
//saisie d'une grammaire
void saisie()
{
//saisie d'une grammaire
GRM *m;
char NT[16];
char T [16];
char P[80];
char A;
int i, pos, s, e, i1, j;
RGL *p = NULL;
strcpy(NT, argv[1]);
printf("Donner les symboles non terminaux de votre grammaire : %s\n", NT);
// scanf("%s",NT);
strcpy(T, argv[2]);
printf("Donner les symboles terminaux de votre grammaire : %s\n", T);
// scanf("%s",T);
A = argv[3][0];
printf("Donner votre axiome : %c\n", A);
// scanf("%s",A);
strcpy(P, argv[4]);
printf("Veuillez entrer vos regles de productions ( Marquez un ; a la fin de chaque regle et separez votre partie droite de celle gauche par -)\n"
"%s\n", P);
// scanf("%s",P);
for(i = 1; i < strlen(P); i++)
{
if(P[i]=='-')
{
char k[16];
char * kk = k;
for(j = i + 1; P[j] != ';'; j++)
kk += sprintf(kk, "%c", P[j]);
sprintf(kk, "%c", 0);
p = ajout(p, P[i - 1], k);
}
else if(P[i]=='|')
{
char l[16];
char * ll;
pos=0;
char c[16];
char * cc;
ll = l;
cc = c;
for(s = i; P[s] != '-'; s--)
;
pos=s-1;// pour chercher la position du non terminal
for(e = pos + 2; P[e] != '|'; e++)
{
ll += sprintf(ll,"%c",P[e]);
}
sprintf(ll, "%c", 0);
p = ajout(p,P[pos],l);//je récupère la partie droite de la production avant le | et je la mets ds une production
for(i1 = i + 1; P[i1] != ';'; i1++)
{
cc += sprintf(cc,"%c",P[i1]);
}
sprintf(cc, "%c", 0);
p = ajout(p,P[pos],c);//je récupère la partie gauche de la production après le | et je la mets ds une production
}
}
//affichage de la liste des productions
affichage(p);
system("pause");
return 0;
}
// Algorithme1
//suppression d'une production
void supprim_noeud (RGL *r, char x)
{
RGL *m = NULL;
if (r && r->A== x)
{
}
// fonction existe
int existe(char b[],char t[])
{
int k=0;
int i;
for(i=0;i<strlen(b);i++)
{ if( strchr(t,b[i]) != NULL )
k++;
}
if (k=strlen(b)) return 1;
else return 0;
}
//fonction existance
int existance (char b[],char t[], char prod[])
{
int k=0;
int i;
for( i=0;i<strlen(b);i++)
{ if( (strchr(t,b[i])!= NULL ) || (strchr(prod,b[i])!= NULL ))
k++;
}
if (k=strlen(b)) return 1;
else return 0;
for(;mr;mr=mr->next)
{
if ( strchr(prod,mr->A)== NULL )
{
supprim_noeud(mr,mr->A); // supprime le noeud
}
}
}
// affichage de la nouvelle liste chainée
//affichage de la liste des productions
void affichage (RGL *p)
{
RGL *q = p;
// algo2
// fonction calcul des non terminaux
void calcul_nontermin_accessibles(GRM* m )
{
RGL *mr;
char acc[16];
char h[16];
char v[16];
int i,j,k=0,e=0;
mr=m->r;
acc[0]=m->S ;
for(;mr ;mr=mr->next)
{
if ( strchr(acc,mr->A ) )
{
for (i=0; i< strlen(mr->termin); i++)
{
Char Snipeur
Messages postés9696Date d'inscriptionvendredi 23 avril 2004StatutContributeurDernière intervention 3 octobre 20231 297 3 janv. 2012 à 11:38
salut.
Vu la complexité de ton programme et sa longueur, le mieux est d'utiliser un débogueur pour savoir où ça coince. Et faire un maximum de printf pour savoir ce qui est fait ou non.