2 pièce(s) jointe(s)
Besoin d'aide pour un parseur HTML
Bonjour,
Voila je débute en langage C, et je viens de faire une petit programme qui analyse le contenu d'un fichier .html et voir si les balises sont corrects ou non.
Le code n'est pas au top, mais c'est dèjà un bon début je trouve :mouarf:
Rapide explication:
Tout d'abord, mon analyse se fait à l'aide d'automate, c'est à dire qu'a chaque caractère lu, je passe d'un état à l'autre:
"<": Etat un qui signifie début balise
"/": Etat deux qui signifie qu'on est dans balise fermante.
"a-z,A-Z": Etat trois qui nom de la balise fermante.
"[espace ou tabulation]": Etat cinq => Attribut de la balise...
etc...
Le programme ouvre un fichier donné, rapporte le 1er caractère, après il le teste, et au fur et a mesure qu'il lit le fichier, il transite d'un etat à un autre, sauf erreur syntaxique, il le signale et s'arrete.
Pour l'instant j'ai fait en sorte qu'il s'arrête dés qu'il trouve le ">", fin de balise, mais je trouve que mon code est mal organisé, j'aimerais l'optimiser mais je ne trouve pas comment.
Voici le code:
Code:
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
| #include <stdio.h>
#include <stdlib.h>
typedef enum {
zero, un, deux, trois, quatre, cinq, six, sept, huit, neuf
} etats;
int main(int argc, char const *argv[])
{
FILE *fichier;
etats courrant = zero;
if(fichier = fopen("test.html", "r"))
{
char c = fgetc(fichier);
while (c!=EOF)
{
switch(courrant)
{
case zero:
if (c == '<') { courrant = un; c = fgetc(fichier); break; }
else c = fgetc(fichier);
case un:
if ((c >= 'a') && (c <= 'z')) { printf("Etat quatre\n"); courrant = quatre; c = fgetc(fichier); break; }
if (c == '/') { printf("etat deux\n"); courrant = deux; c = fgetc(fichier); break; }
else { printf("Syntax Error\n"); return 1; }
case deux:
if ((c >= 'a') && (c <= 'z')) { printf("Etat trois\n"); courrant = trois; c = fgetc(fichier); break; }
else { printf("Syntax Error\n"); return 1; }
case trois:
if (c == '>') { printf("fin de la balise"); return 1;}
if (c == ' ') {printf("Syntax error\n"); return 1;}
else { printf("Etat trois\n"); courrant = trois; c = fgetc(fichier); break; }
case quatre:
if (c == ' ') { printf("Etat cinq\n"); courrant = cinq; c = fgetc(fichier); break; }
if (c == '>') { printf("fin de la balise"); return 1;}
else { printf("Etat quatre\n"); courrant = quatre; c = fgetc(fichier); break; }
case cinq:
if (c == ' ') { printf("Etat cinq\n"); courrant = cinq; c = fgetc(fichier); break;}
if ( c == '>'|| c == '<'|| c == '=') { printf("Syntax Error\n"); return 1;}
else { printf("Etat six\n"); courrant = six; c = fgetc(fichier); break; }
case six:
if (c == '=') { printf("Etat sept\n"); courrant = sept; c = fgetc(fichier); break;}
else { printf("Etat six\n"); courrant = six; c = fgetc(fichier); break; }
case sept:
if (c == '"'|| c =='\'') { printf("Etat huit\n"); courrant = huit; c = fgetc(fichier); break;}
else { printf("Etat quatre\n"); courrant = quatre; c = fgetc(fichier); break; }
case huit:
if (c == '"'|| c =='\'') { printf("Etat neuf\n"); courrant = neuf; c = fgetc(fichier); break;}
else { printf("Etat huit\n"); courrant = huit; c = fgetc(fichier); break; }
case neuf:
if (c == ' ') { printf("Etat cinq\n"); courrant = cinq; c = fgetc(fichier); break;}
if (c == '>') { printf("fin de la balise"); return 1;}
else { printf("Syntax Error\n"); return 1; }
}
}
}
else printf("Couldn't open the file.\n");
printf("Operation terminated");
fclose(fichier);
return 0;
} |
Voila j'espère qu'il n'est pas trop pénible à lire ou à comprendre :lol:
Je remercie d'avance ceux qui ont pris le temps de le lire et d'y répondre !
Cordialement.