[Résolu][Lex] reconnaitre un mauvais identifiant

reconnaitre un mauvais identifiant [Résolu][Lex] - C - Programmation

Marsh Posté le 10-04-2008 à 18:54:48    

Bonjour,
 
Dans le fichier .l suivant, je cherche à :
 
* Ignorer les commentaires.
* Reconnaitre les identifiants
* Reconnaitre les chaines de caracteres
* Reconnaitre les constantes
* Ignorer les espaces.
 
et tout le reste est une erreur
 
voilà mon code lex :
 

Code :
  1. %{
  2. /*
  3. * Permet de reconnaitre :
  4. *  - Une constante
  5. *
  6. */
  7. %}
  8. D [0-9]
  9. L [a-zA-Z_]
  10. A [a-zA-Z_0-9]
  11. P   \^[+-]?{D}+
  12. OTHER .
  13. %%
  14. "/*" { comment(); }
  15. {L}{A}* { printf("IDENTIFIER\t%s\n", yytext); }
  16. (({D}+)|({D}+\.{D}+))({P}?) { printf("CONSTANT\t%s\n", yytext); }
  17. \"(\\.|[^\\"])*\" { printf("STRING_LITERAL\t%s\n", yytext); }
  18. [\n\t ] { ; }
  19. {OTHER} { printf("ERROR\t%s\n", yytext); }
  20. %%
  21. main()
  22. {
  23. yylex();
  24. }
  25. /* -------------------------------------------------------------------------
  26. * comment ()
  27. * -------------------------------------------------------------------------
  28. * Role : Ignorer les commentaires
  29. * ------------------------------------------------------------------------- */
  30. comment()
  31. {
  32. char c, c1;
  33. loop:
  34. while ((c = input()) != '*' && c != 0)
  35.  putchar(c);
  36. if ((c1 = input()) != '/' && c != 0)
  37. {
  38.  unput(c1);
  39.  goto loop;
  40. }
  41. if (c != 0)
  42.  putchar(c1);
  43. }


 
à l'exécution j'ai un souci:
 
la saisie d'un identifiant erroné du style 1ab donne :
 
[/cpp]
 
C:\identifier>a
1ab
CONSTANT        1
IDENTIFIER      ab
 
[/CPP]
 
alors que moi je voudrais qu'il me fasse
 

Code :
  1. ERROR 1ab


 
 
Si quelqu'un a une idée du pourquoi du comment, je suis preneur.
 
Merci


Message édité par exhortae le 10-04-2008 à 19:41:25
Reply

Marsh Posté le 10-04-2008 à 18:54:48   

Reply

Marsh Posté le 10-04-2008 à 19:12:56    

Bonjour,
 
Je ne sais pas d'où vient exactement ton erreur, mais un de mes fichiers lex qui détecte à peu près la même chose ressemble à ca:

Code :
  1. ...
  2. idf             [A-z]+([0-9]*[A-z]*)*
  3. cst_ent         [0-9]+
  4. cst_chaine      \".*\"
  5. commentaire     \/\*.*\*\/
  6. blanc           [\t]+
  7. ...
  8. {idf}                    {strncpy (yylval.String,yytext,MAX_CHAINE); return idf;}
  9. {cst_ent}                {strncpy (yylval.String,yytext,MAX_CHAINE);return entier;}
  10. {cst_chaine}             return chaine;
  11. {blanc}                  ;
  12. [ ]*                     ;
  13. \,                       return virg;
  14. \n                       numLignes++;
  15. \;                       return point_virg;


et mon analyse syntaxique fonctionnait correctement, ce qui n'était pas forcément le cas de la suite mais c'est une autre histoire.  
Il me semble qu'il n'est pas nécessaire de gérer le cas d'erreur. J'ai dû virer la ligne:

Code :
  1. .   {printf("erreur";);}


pour que cela fonctionne sinon j'avais des résultats bizarres surtout avec les retours chariot, personne n'a jamais compris le rapport.
Quand il trouve une erreur syntaxique, le programme généré par lex affiche lui-même "syntax error" (il me semble).


Message édité par ptitchep le 10-04-2008 à 19:14:06

---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 10-04-2008 à 19:25:49    

Bonjour,
 
en fait je cherche à faire un analyseur syntaxique pour algorithme, et effectivement dans la majorité des exemples que je vois j'ai l'impression que le cas d'un identifiant erroné ne doit être reconnu que par yacc, pourtant j'aurais aimé séparer l'analyse lexicale de l'analyse syntaxique pour pouvoir afficher les unités lexicales correctes et celles erronées à l'écran, avant de faire la partie syntaxique.
 
quelqu'un pourrait il confirmer (ou infirmer), que reconnaitre un identifiant incorrect n'est pas le travail de lex. (quand on parle d'un analyseur lexicale et syntaxiqu étapes d'une compilation)
 
Merci

Reply

Marsh Posté le 10-04-2008 à 19:33:58    

Dans mon exemple si tu tapes 1ab, cela affiche syntax error. Après effectivement si tu rentres un identifiant correct genre: ours, lex l'accepte et c'est yacc en effet qui teste si ours existe dans la table des symboles. Je ne pense pas qu'il y ait moyen avec lex de vérifier autre chose que la validité lexicale de l'expression.
Essaie quand même de commenter ta ligne OTHER quitte à la remettre si ce n'est pas ça. Je me suis vraiment arraché les cheveux (ils sont longs ça cache les trous) avant de trouver que c'était ça qui plantait chez moi parceque je ne voyais pas le rapport ni l'erreur d'ailleurs et je ne la vois toujours pas.


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 10-04-2008 à 19:40:36    

Yep t'as raison
 
en faite je viens juste de  modifier un analyseur lexical du langage C trouvé sur le net, il fait le même comportement que le mien, c'est à dire qu'il ne reconnait pas si l'identifiant est incorrect. Donc je confirme c'est le travail du parser.
 
Merci pour ton aide
 
:)

Reply

Sujets relatifs:

Leave a Replay

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