Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1778 connectés 

  FORUM HardWare.fr
  Programmation
  C

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1715846
exhortae
Membre du Cartel des Médecins
Posté le 10-04-2008 à 18:54:48  profilanswer
 

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
mood
Publicité
Posté le 10-04-2008 à 18:54:48  profilanswer
 

n°1715849
ptitchep
Posté le 10-04-2008 à 19:12:56  profilanswer
 

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
n°1715856
exhortae
Membre du Cartel des Médecins
Posté le 10-04-2008 à 19:25:49  profilanswer
 

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

n°1715858
ptitchep
Posté le 10-04-2008 à 19:33:58  profilanswer
 

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
n°1715860
exhortae
Membre du Cartel des Médecins
Posté le 10-04-2008 à 19:40:36  profilanswer
 

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
 
:)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

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

 

Sujets relatifs
Onglets plus images plus evenements souris avec GTK. Résolu[Résolu] MySQL et condition sur le résultat retourné par une requête
[VB] [EXCEL] Copier cellules -> RESOLU[PHP][résolu] Include et global -- comportement étrange --
[Résolu][Struts] itération pour créer des liens + identifiants[Résolu][VBA] Ouvrir un fichier dans le même processus
Problème template template [RESOLU][résolu] signe opératoire contenu dans une variable ?
[résolu]Incrémentation variable à chaque rechargement de la page 
Plus de sujets relatifs à : [Résolu][Lex] reconnaitre un mauvais identifiant


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR