salut
je veux faire une saisie d'une chaine de caracère qui contient des motsséparées par des ';'. chaque mot est séparé par un '- '(je peux distinguer dans chaque mot une partie gauche et une autre droite grace à '-'.puis je veux inserer cette chaine dans une liste chaineé :chaque fois que je trouve un ';' j'insere ce mot(la partie gauche dans le champ A de la structure RGL et la partie gauche dans le champ termin,et si dans un mot je trouve '|' j'insere ce qui est avant '|' dans un noeud et ce qui est apès '|' dans un autre noeud mais avec le meme champ A (EXEMPLE : si j'ai comme chaine E-BC;Z-as |R ;
je veux mettre E,B et C dans le meme noeud (E dans le champ A et BC dans le champ termin puis j'insere un nouveau noeud dont le champ A contient Z et le champ termin contient as puis j'insère un nouveau noeud dont le champ A contient Z et le champ termin contient R)
j'ai developpé un code en c il compile mais il ne s'éxécute pas pouvez vous m'aider svp?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<conio.h>
struct regle
      {
       char A;
       char termin[16];
       struct regle* next;
 
      };
typedef struct regle RGL;
 
struct grammaire
      {
       char nntrmn[16];
       char trmn[16];
       RGL *r;
       char S ;
      };
typedef struct grammaire GRM ;
 
 
 //ajout d'une production
 RGL *ajout ( RGL *p, char A,char B[])
{
   /* allocation du noeud */
   RGL *p_new = malloc (sizeof *p_new);
 
   /* si tout s'est bien passe : */
   if (p_new != NULL)
   {
      /* mise a jour des champs : */
 
      /* donnees */
      p_new->A=A;
      strcpy(p_new->termin,B);
      /* chainage par defaut */
      p_new->next = NULL;
 
      /* chainage */
      if (p == NULL)
      {
         /* c'est le premier : */
         p = p_new;
      }
      else
      {
         /* on cherche le dernier noeud */
         RGL *q = p;
 
         while (q->next != NULL)
         {
            /* pointer sur le suivant */
            q = q->next;
         }
 
         /* modification du chainage */
         q->next = p_new;
      }
   }
   return p;
}
 
//affichage de la liste des productions
void affichage (RGL *p)
{
   RGL *q = p;
 
   while (q != NULL)
   {
      /* afficher les données courantes */
      printf ("%s ", q->A);
      printf ("%s ", q->termin);
 
 
      /* pointer sur le suivant */
      q = q->next;
   }
   /* afficher la fin */
   printf ("NIL\n");
}
 
int main(int argc,char argv[])
 
{
    //saisie d'une grammaire
 
    GRM *m;
    char NT[16];
    char T [16];
    char P[18];
    char A[1];
    int i,pos,s,e,i1,j;
    RGL *p=NULL;
    printf("Donner les symboles non terminaux de votre grammaire \n" );
    scanf("%s",NT);
 
    printf("Donner les symboles terminaux de votre grammaire \n ");
    scanf("%s",T);
 
    printf("Donner votre axiome \n ");
    scanf("%s",A);
    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 ");
    scanf("%s",P);
    for(i=1;i<strlen(P);i++)
    {
      if(P[i]='-')
      {   char k[]="";
          for(j=i;P[j+1]=';';j++)
          {
              sprintf(k, "%c", P[j]);
          }
          ajout(p,P[i-1],k);
      }
      else if(P[i]='|')
      {
          char l[]="";
          pos=0;
          char c[]="";
          for(s=i;P[s]='-';s--)
          ;
          pos=s-1;// pour chercher la position du non terminal
          for(e=pos+2;P[e+1]='|';e++)
          {
              sprintf(l,"%c",P[e]);
          }
          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++)
          {
            sprintf(c,"%c",P[i1]);
          }
          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");
}