[lex] problème bizarre ???

problème bizarre ??? [lex] - Divers - Programmation

Marsh Posté le 02-12-2004 à 18:19:42    

Je rencontre un problème bizarre avec un programme lex. J'essaie de faire une copie de la commande wc, c'est surement du code crade mais ça marche (a moitié :o ):
Les erreurs sont en bold.
 
Par exemple lorsque mon code est:
 
 

Code :
  1. %{
  2. #include <stdio.h>
  3. int nblignes;
  4. int motl;
  5. int nbcars;
  6. int nbmots;
  7. %}
  8. MOTESP [.]\32
  9. %%
  10. \n ++nblignes;
  11. .  ++nbcars;
  12. [a-zA-Z0-9][:space:]|[a-zA-Z0-9]\n ++nbmots;
  13. %%
  14. int main(void)
  15. {
  16. nblignes=0;
  17. nbcars=0;
  18. nbmots=0;
  19. yyin=stdin;
  20. yylex();
  21. printf("nblignes = %d, nbcars=%d, nbmots=%d\n",nblignes,nbcars+nblignes,nbmots);
  22. }


 
J'obtiens le résultat:
 

Code :
  1. $ cat fichier | ./wc2
  2. nblignes = 1, nbcars=21, nbmots=7


Code :
  1. Alors que si j'ai ce code:
  2. %{
  3. #include <stdio.h>
  4. int nblignes;
  5. int motl;
  6. int nbcars;
  7. int nbmots;
  8. %}
  9. MOTESP [.]\32
  10. %%
  11. \n ++nblignes;
  12. .  ++nbcars;
  13. %%
  14. int main(void)
  15. {
  16. nblignes=0;
  17. nbcars=0;
  18. nbmots=0;
  19. yyin=stdin;
  20. yylex();
  21. printf("nblignes = %d, nbcars=%d, nbmots=%d\n",nblignes,nbcars+nblignes,nbmots);
  22. }


 
le résultat devient:

Code :
  1. $ cat fichier | ./wc2
  2. nblignes = 4, nbcars=35, nbmots=0


 
Mon fichier d'entrée est:
 
$ cat fichier
toto titi
tata
tutu
toto tata titi
 
et wc me donne le résultat:
 
$ wc fichier
 4  7 35 fichier
 
Autant dire que le résultat de mon code est assez empirique car quelque soit le code le résultat est à moitié bon à moité faux...
Si vous avez une idée je suis tout ouïe, merci de votre aide :hello:

Reply

Marsh Posté le 02-12-2004 à 18:19:42   

Reply

Marsh Posté le 02-12-2004 à 18:33:51    

A vue de nez, je dirais qu'il y a ambiguïté dans ta déclaration de syntaxe. Tes lexèmes pour les caractères et les retours chariots ne posent pas de problème. Le fait de mettre "." comme lexème va complètement occulter ta détection de mot par la suite. Le parcours de ton fichier par flex en fonction des lexèmes est séquentiel, et non pas parallèle...
Tu peux toujours intervertir tes 2 lignes (celle qui contient le ++nbcars et le ++nbmots), mais ton nombre de caractères ne sera pas valide ...
Essaye de revoir ta règle de définition du lexème mot, et incrémente ton nombre de caractères de la taille de chaque mot ...

Reply

Marsh Posté le 02-12-2004 à 19:58:39    

dsls a écrit :

A vue de nez, je dirais qu'il y a ambiguïté dans ta déclaration de syntaxe. Tes lexèmes pour les caractères et les retours chariots ne posent pas de problème. Le fait de mettre "." comme lexème va complètement occulter ta détection de mot par la suite. Le parcours de ton fichier par flex en fonction des lexèmes est séquentiel, et non pas parallèle...
Tu peux toujours intervertir tes 2 lignes (celle qui contient le ++nbcars et le ++nbmots), mais ton nombre de caractères ne sera pas valide ...
Essaye de revoir ta règle de définition du lexème mot, et incrémente ton nombre de caractères de la taille de chaque mot ...


 
Mais pour compter les caractères \n et espace cela va poser un problème ?

Reply

Marsh Posté le 02-12-2004 à 20:45:27    

Il suffit d'incrémenter nbcars aux bons endroits ...
Essaye avec ces définitions :  

Code :
  1. %%
  2. \n ++nblignes;
  3. [a-zA-Z0-9]+ ++nbmots; nbcars+=strlen(yytext);
  4. .  ++nbcars;
  5. %%


Message édité par dsls le 02-12-2004 à 20:45:55
Reply

Marsh Posté le 03-12-2004 à 13:01:02    

Ça marche parfaitement, je vais étudier ça plus en détail. En tout cas merci de ton aide :)

Reply

Sujets relatifs:

Leave a Replay

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