Bonjour,
Je suis sur un code qui doit vérifier une ligne de commande puis la parser pour me la ranger dans un tableau de caractères. En fait cette ligne de commande peut être composée de sous-lignes de commandes séparées par des caractères spéciaux (&;|<>) ex : toto -p; tata -ru && tutu -cv
Actuellement j'ai codé un automate qui vérifie la syntaxe de la ligne de commande :
et là je suis sur le parsing de la ligne une fois que l'automate est ok
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 int automate(char *cde) { int tabEtat[7][6]={{1,2,0,0,0,0},{2,2,3,4,6,0},{3,2,0,0,0,1},{4,0,0,5,0,0},{5,2,0,0,0,0},{6,2,0,0,7,0},{7,2,0,0,0,0}}; int etat=1; /* Début de lecture de l'automate */ int n; int i=0; int colonne=0; n=strlen(cde); while(i<n && etat){ switch(cde[i]) { case ';' : colonne=2;break; case '|' : colonne=3;break; case '&' : colonne=4;break; case '<' : return 0; case '>' : return 0; default : colonne=1;break; } etat=tabEtat[etat-1][colonne]; i++; } if(etat==0) return 0; return (tabEtat[etat-1][colonne]); }
Et je me rends compte que cette fonction ne va pas, puisque je ne sais pas si je viens d'extraire un mot ou une sous-chaine (un mot est séparé d'un autre par un espace, une sous-chaine est séparée d'une autre par &;|< ou >).
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 char **tab; char *buffer; char *sep = " &|;<>"; char *brkt; int nb=10,i=0,lg; tab = malloc (nb * sizeof(char *)); for (buffer=strtok_r(cde,sep,&brkt);buffer;buffer=strtok_r(NULL,sep,&brkt)) { lg = strlen (buffer); tab[i] = malloc ( (lg + 1) * sizeof(char) ); strcpy(tab[i],buffer); i++; }
Je dois donc, avant de découper en mots, découper en sous-chaines en parcourant la chaine à la recherche de ces caractères spéciaux.
Je me demandais alors si je ne devais pas plutôt intégrer ce code dans l'automate, quitte à l'alourdir. Pourtant je pense qu'il vaut mieux avoir plusieurs petites fonctions claires plutôt que des gros pavés ?
Mais si je veux extraire mes sous-chaines en fonctions des caractères spéciaux tout en conservant ces caractères, je suis obligé de relire la chaine caractère par caractère (je ne peux pas faire de strtok_r) et je l'ai déjà fait avec l'automate...
Si je le fais dans l'automate et qu'il s'avère que la ligne n'est pas syntaxiquement correcte, j'ai parsé la ligne pour rien et j'ai un code d'automate qui est plus lourd...
D'après vous, Qu'elle est la meilleure solution ?
Partager