[Yacc/Bison] Probleme avec yylineno

Probleme avec yylineno [Yacc/Bison] - C - Programmation

Marsh Posté le 29-10-2005 à 13:45:49    

J'ai un programme C appelé y.tab.c créé à partir de Bison. Je l'ai compilé avec gcc 2.95, j'ai eu plusieurs warning mais j'ai réussi à obtenir mon .o
 
Mon probleme vient apres lorsque je souhaite linker y.tab.o avec d'autres programmes. PAr exemple pour ceci:
 

Code :
  1. gcc-2 -o analyse_ft analyse_ft.c outils_conversions.o y.tab.o
  2. y.tab.o(.text+0x1408):y.tab.c: undefined reference to `yylineno'
  3. y.tab.o(.text+0x142e):y.tab.c: undefined reference to `yylineno'
  4. y.tab.o(.text+0x1490):y.tab.c: undefined reference to `yylineno'
  5. y.tab.o(.text+0x14b6):y.tab.c: undefined reference to `yylineno'
  6. y.tab.o(.text+0x1514):y.tab.c: undefined reference to `yylineno'
  7. y.tab.o(.text+0x153a):y.tab.c: more undefined references to `yylineno' follow


 
 
Je comprends pas d'ou vient mon probleme, sachant que j'ai bien yylineno de définit dans mon programme y.tab.c.  
J'ai mis l'ensemble du code de mon fichier y.tab.c ici http://ubuntu.pastebin.com/409861
et l'ensemble de mon fichier yacc ici: http://ubuntu.pastebin.com/409865
 
Quelqu'un sait d'ou pourrait venir le probleme?
 
++


Message édité par cervantes le 29-10-2005 à 13:48:42
Reply

Marsh Posté le 29-10-2005 à 13:45:49   

Reply

Marsh Posté le 29-10-2005 à 21:01:37    

%option yylineno
 
?

Reply

Marsh Posté le 29-10-2005 à 21:03:04    

j'ai matté tes liens : en flex/bison ne donne pas le code généré (y.tab.c) ça sert à rien, de toute façon tu ne peux pas le modifier, à chaque recompilation de ton yacc il serait écrasé.

Reply

Marsh Posté le 29-10-2005 à 21:47:42    

Ah ok, j'y connais presque rien en yacc, le code c'est pas moi qui l'est fait, j'essai juste de le recompiler sur windows pour ensuite l'utiliser avec d'autre programmes.
D'ailleurs, ou je peux le mettre %option yylineno dans le .yacc?  j'ai effectivement" extern int      yylineno;" mais je ne sais pas pourquoi il est en extern, j'ai regardé mon fichier .lex et je n'ai aucune référence à  yylineno. Au passage, en deux mots, ca sert à quoi yylineno?
 
Apparemment tu à l'air de t'y connaitre dans le domaine, jesus_christ. Peut etre pourras tu m'expliquer pourquoi j'ai ces warnings quand je compile mon fichier .yacc. LEs voici:
 

Code :
  1. scription_fichier_correspondance.yacc:275: warning: type mismatch with previous implicit declaration
  2. description_fichier_correspondance.yacc:102: warning: previous implicit declaration of `fichier_correspondance_error'
  3. description_fichier_correspondance.yacc:275: warning: `fichier_correspondance_error' was previously implicitly declared to return
  4. `int'
  5. description_fichier_correspondance.yacc:299: warning: type mismatch with previous implicit declaration
  6. y.tab.c:1287: warning: previous implicit declaration of `yyerror'
  7. description_fichier_correspondance.yacc:299: warning: `yyerror' was previously implicitly declared to return `int'
  8. description_fichier_correspondance.yacc:345: warning: type mismatch with previous implicit declaration
  9. description_fichier_correspondance.yacc:94: warning: previous implicit declaration of `tete_correspondance'
  10. description_fichier_correspondance.yacc:345: warning: `tete_correspondance' was previously implicitly declared to return `int'
  11. description_fichier_correspondance.yacc:380: warning: type mismatch with previous implicit declaration
  12. description_fichier_correspondance.yacc:100: warning: previous implicit declaration of `add_correspondance'
  13. description_fichier_correspondance.yacc:380: warning: `add_correspondance' was previously implicitly declared to return `int'
  14. description_fichier_correspondance.yacc:430: warning: type mismatch with previous implicit declaration
  15. description_fichier_correspondance.yacc:109: warning: previous implicit declaration of `cre_correspondance'
  16. description_fichier_correspondance.yacc:430: warning: `cre_correspondance' was previously implicitly declared to return `int'


 
Je te renvoie au lien de mon premier message pour le code du .yacc. Je te pose cet question car initialement j'utilisais mingw avec gcc 3.42 et les warnings cidessus étaient remplacés par des errors, par chance avec la versions 2.95 j'ai réussi à obtenir mon .o, mais j'ai toujours des problemes. Pour eviter ces erreurs/warnings, j'ai tant bien que mal essayer de "caster" les $1, $2.... de cre_correspondance( $1, $2, $3 , $4, $5, $6, $7 ), mais ca ne changea rien. La je ne vois pas pourquoi.
 
Thx, A+

Reply

Marsh Posté le 29-10-2005 à 22:11:26    

désolé mais à cette heure ci j'ai pas la force de tout lire :D
le "%option yylineno" se met dans le lexeur. D'ailleurs tu ne donnes pas ton lexeur ici (le truc en lex/flex) à moins que tu ne l'ai fait à la main (fonction yylex).

Reply

Marsh Posté le 29-10-2005 à 23:27:03    

Dans le lexeur je n'ai pas de yylineno. Voici le code:
 

Code :
  1. D [0-9]
  2.   /* mantisse */
  3. E [DEde][\+\-]?{D}+
  4.   /* exposant */
  5. H [0-9a-fA-F]
  6.   /* digit hexa */
  7. O [0-7]
  8.   /* digit octal */
  9. B [01]
  10.   /* digit binaire */
  11. %START CM
  12. %%
  13. "/*" {
  14. if (logfile != (FILE *)NULL)  
  15.  fprintf(logfile, "%s", yytext);
  16. BEGIN CM;
  17. }
  18. <CM>"*/" {
  19. if (logfile != (FILE *)NULL)
  20.  fprintf(logfile, "%s", yytext);
  21. BEGIN 0;
  22. }
  23. <CM>\*     |
  24. <CM>[a-zA-Z0-9_\-\.]*   |
  25. <CM>[\%\(\)\[\]\{\}\,\+\:\/ ]*  {
  26. if (logfile != (FILE *)NULL) fprintf(logfile, "%s", yytext);
  27. }
  28. [ \t\n] {
  29. if (logfile != (FILE *)NULL) fprintf(logfile, "%s", yytext);
  30. }
  31. [\(\)\[\]\{\}\,]  {
  32. if (logfile != (FILE *)NULL) fprintf(logfile, "%s", yytext);
  33. return *yytext;
  34. }
  35. \+?{D}+    {
  36. if (logfile != (FILE *)NULL) fprintf(logfile, "%s", yytext);
  37. yylval.ival = atol( yytext );
  38. return T_NONSIGNE;
  39. }
  40. \-{D}+    {
  41. if (logfile != (FILE *)NULL) fprintf(logfile, "%s", yytext);
  42. yylval.ival = atol( yytext );
  43. return T_ENTIER;
  44. }
  45. [\+\-]?{D}+"."{D}*({E})? |
  46. [\+\-]?{D}*"."{D}+({E})? |
  47. [\+\-]?{D}+{E}   {
  48. if (logfile != (FILE *)NULL) fprintf(logfile, "%s", yytext);
  49. yylval.dval = (double) atof( yytext );
  50. return T_DOUBLE;
  51. }
  52. \%[hH]{H}+   {
  53. if (logfile != (FILE *)NULL) fprintf(logfile, "%s", yytext);
  54. yylval.uval = (unsigned long) strtol(
  55.  yytext+2, (char **)NULL, 16);
  56. return T_NONSIGNE;
  57. }
  58. \%[bB]{B}+   {
  59. if (logfile != (FILE *)NULL) fprintf(logfile, "%s", yytext);
  60. yylval.uval = (unsigned long) strtol(
  61.  yytext+2, (char **)NULL, 2);
  62. return T_NONSIGNE;
  63. }
  64. \%[oO]{O}+   {
  65. if (logfile != (FILE *)NULL) fprintf(logfile, "%s", yytext);
  66. yylval.uval = (unsigned long) strtol(
  67.  yytext+2, (char **)NULL, 8);
  68. return T_NONSIGNE;
  69. }
  70. [a-zA-Z][a-zA-Z0-9_\-\.]*  {
  71. if (logfile != (FILE *)NULL) fprintf(logfile, "%s", yytext);
  72. yylval.sval = malloc( yyleng+1 );
  73. if ( yylval.sval == (char*)NULL )
  74. {
  75.            fprintf( stderr, "Memoire pleine\n" );
  76.            exit(-1);
  77. }
  78. strcpy( yylval.sval, yytext );
  79. return T_STR;
  80. }
  81. %%


 
Je suppose que le %option yylineno dont tu me parles, je le mets dans la partie déclaration.
Vi mon message etait un peu long,  :) , mais essai de jeter un oeil un peu plus tard, ca serait cool  :)  
 
++


Message édité par cervantes le 29-10-2005 à 23:27:41
Reply

Marsh Posté le 30-10-2005 à 11:04:16    

Code :
  1. D    [0-9]
  2.             /* mantisse    */
  3. E    [DEde][+-]?{D}+
  4.             /* exposant    */
  5. H    [0-9a-fA-F]
  6.             /* digit hexa    */
  7. O    [0-7]
  8.             /* digit octal    */
  9. B    [01]
  10.             /* digit binaire */
  11. %START CM
  12. %option yylineno
  13.        
  14. %%


je vais regarder le reste après ;)


Message édité par jesus_christ le 30-10-2005 à 11:04:49
Reply

Marsh Posté le 30-10-2005 à 11:47:40    

j'ai reconstruit ton projet, les lex et le yacc sont bons mais il me manque les entêtes :
#include "structure_correspondance.h"
#include "structure_format_thomson.h"
#include "leste.h"

Reply

Marsh Posté le 30-10-2005 à 13:31:11    

Slt,
 
Je t'ai mis le code source en message privé.
 
++

Reply

Marsh Posté le 30-10-2005 à 13:49:38    

tu as bien fait car ça m'a l'air de ne pas être open-source (propriété de thomson)

Reply

Marsh Posté le 30-10-2005 à 13:49:38   

Reply

Marsh Posté le 30-10-2005 à 14:05:22    

chez moi ça compile après une correction : il manque une paranthèse ligne 94 environ du yacc :

Code :
  1. tete_correspondance( ( $1 );

Reply

Marsh Posté le 30-10-2005 à 15:14:25    

Ah j'ai du la virer sans faire attention car j'ai essayé de mettre des casts devant car j'avais des warnings.
 
Oui, c'est un truc propriétaire, mais si ca ne traine pas sur un forum ca ira  :)  
Ba tien je vais te donner le code de mon programme qui ne voulait pas compiler avec le y.tab.o (en privé)

Reply

Sujets relatifs:

Leave a Replay

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