flex et yy_scan_string()

flex et yy_scan_string() - C - Programmation

Marsh Posté le 22-03-2005 à 11:28:42    

Bonjour,
 
J'utilise flex afin de tokenizer des pages html. Le but etant de récupérer les tags et le texte (tout ce qui n'est pas tag) ainsi que les urls et noms de domaines (pouvant etre dans les tags ou dans le texte).
 
Je voudrai rechercher les urls et noms de domaines dans les tags. Afin de supprimer les problemes de précedence des détections ce que je voudrai faire est :
- détecter d'une part les tags, en tirer les urls et noms de domaines
- détecter d'autre part le texte, en tirer les urls et noms de domaines
 
Une fois les tags détectés je lance donc :

Code :
  1. BEGIN URLST  /* URLST est en mode exclusif*/
  2. yy_scan_string(yytext);
  3. yylex();


D'apres ce que j'ai cru comprendre de la doc de flex apres le yy_scan_string(), l'appel a yylex() devrait relancer le parsing là où il s'etait arrété.
Or ce n'est pas le cas, le parsing s'arrete...
 
Voici mon code :

Code :
  1. %}
  2. ALPHA    [0-9]
  3. ALPHANUM [a-zA-Z0-9]
  4. DOMAIN {ALPHANUM}+("-"|"." )({ALPHANUM}|"-"|"." )+
  5. %option stack
  6. %x URLST
  7. %x DOMAINST
  8. %x SCRIPT COMMENT
  9. %%
  10. "&nbsp;"|"&lt;"|"&gt;"|"</"[^>]+">"   {fputc(' ',yyout);}
  11. "<script"(.*)?">" {}
  12. "<script"            {yy_push_state(SCRIPT);}
  13. <SCRIPT>"/script>"   {fputc(' ',yyout); yy_pop_state();}
  14. <SCRIPT>"\n"         {}
  15. <SCRIPT>.            {}
  16. <SCRIPT><<EOF>>      {fputc(' ',yyout); yy_pop_state();}
  17. "<!--"(.*)?"-->" {}
  18. "<!--"               {yy_push_state(COMMENT);}
  19. <COMMENT>"-->"       {fputc(' ',yyout); yy_pop_state();}
  20. <COMMENT>"\n"        {}
  21. <COMMENT>.           {}
  22. <COMMENT><<EOF>>     {fputc(' ',yyout); yy_pop_state();}
  23. <INITIAL>"<"(\"[^\"]*\"|\'[^\']*\'|[^\'\"">"])*">" {
  24.   printf("TAG : %s\n", yytext);
  25.   BEGIN URLST;
  26.   yy_scan_string(yytext);
  27.   yylex();
  28. }
  29. <URLST>https?:\/\/{DOMAIN}(":"{ALPHA}+)?({ALPHANUM}|["~""/""$""-""_"".""+""!""*""'""("" )"","";"":""@""&""=""?"])* {
  30.   printf("URL : %s\n", yytext);
  31.   BEGIN DOMAINST;
  32.   yyless(1);
  33. }
  34. <DOMAINST>\/\/{DOMAIN} {
  35.   printf("DOMAIN  : %s\n", yytext);
  36.   BEGIN INITIAL;
  37. }


 
Sur l'exemple suivant :
Pouet
<img src=https://www.google.fr/toto/titi/img.png/>
<img src=https://www.google.fr/toto/titi/img.png/>
<img src=www.google.fr/toto/tiit/img.png/>
 
Le parsing me donne les resultats :
TAG : <img src=https://www.google.fr/toto/tiit/jacky.png/>
URL : https://www.google.fr/toto/tiit/jacky.png/
DOMAIN  : //www.google.fr
 
Comment puis-je refaire partir le parsing là où il s'etait arrété au moment de l'appel à yy_scan_string() tout en me remettant dans l'état INITIAL ?
 
Je vous remercie d'avance de vos reponses.
 
Nicolas

Reply

Marsh Posté le 22-03-2005 à 11:28:42   

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed