Bonjour,
J'ai déjà posté hier pour des problemes sur une liste chainée.
Aujourd"hui mes problemes viennent de Flex.
Je dois tokenizer des pages html.
Voici mon code :
Code :
- %{
- #include <stdio.h>
- #include <stdlib.h>
- #include "pile.h"
- pile *tags;
- int i =0;
- char *chaine;
- %}
- %s TAGS
- %%
- <INITIAL>"<!--"((.|\n)*)?"-->"|"<script"((.|\n)*)?"script>"|" "|"\n"|"\t"|[" "]+|"</"[^>]+">" {putchar(' ');}
- <INITIAL,TAGS>"<"(\"[^\"]*\"|\'[^\']*\'|[^\'\"\>])*">" {
- chaine = malloc(sizeof(char)*(strlen(yytext)+1));
- strcpy(chaine, yytext);
- insererElement(&tags, chaine);
- }
- <INITIAL><<EOF>> {
- afficherElements(tags);
- return 1;}
- %%
- main( argc, argv )
- int argc;
- char **argv;
- {
- ++argv, --argc;
- if ( argc > 0 )
- yyin = fopen( argv[0], "r" );
- else
- yyin = stdin;
-
- yyout = fopen("words.txt", "w" );
- tags=NULL;
- yylex();
- }
|
Je peux ainsi récupérer d'un coté tous les tags dans une liste chainée (en ayant supprimer tous ceux dont je ne veux pas).
Je récupère également tout le reste qui n'a pas été reconnu (c'est à dire les mots ou le texte) dans la sortie du lexer que j'ai redirigée vers le fichier words.txt.
Mon problème est que je dois encore découper les tags afin de les découper en petits morceaux (suivant les espaces,",/,. etc) ainsi que récupérer les urls (qui peuvent etre aussi bien dans les tags que dans le texte) et transformer les majuscules en minuscules.
Je dois également découper le texte en mots.
Je voudrai savoir si le meilleur moyen (le plus rapide) est de relancer un yylex() avec un yy_scan_string() pour les tags et en redirigeant yyin sur words.txt autant de fois que necessaire pour obtenir tous mes tokens, sachant qu'ensuite je devrais faire ce travail sur un repertoire contenant 2000, voir plus, fichiers html.
Mes autres solutions sont d'utiliser la libpcre qui permet de faire des regexp de style python (mais je prefere eviter cette solution), ou strtok pour decouper mes chaines (mais je ne pourrais pas tout avoir).
Y a t il une autre solution sous flex m'évitant de stoker temporairement mes resultats pour les retokenizer derriere, c-a-d tout faire d'un seul coup ?
Je vous remercie d'avance de vos reponses.