Cervantes Posté(e) le 29 octobre 2005 Partager Posté(e) le 29 octobre 2005 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: * gcc-2 -o analyse_ft analyse_ft.c outils_conversions.o y.tab.o * * y.tab.o(.text+0x1408):y.tab.c: undefined reference to `yylineno' * * y.tab.o(.text+0x142e):y.tab.c: undefined reference to `yylineno' * * y.tab.o(.text+0x1490):y.tab.c: undefined reference to `yylineno' * * y.tab.o(.text+0x14b6):y.tab.c: undefined reference to `yylineno' * * y.tab.o(.text+0x1514):y.tab.c: undefined reference to `yylineno' * * 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? ++ Lien vers le commentaire Partager sur d’autres sites More sharing options...
Baldurien Posté(e) le 1 novembre 2005 Partager Posté(e) le 1 novembre 2005 yylineno doit venir de Flex si je ne m'abuse, et donc il te manque un extern int yylineno dans ton code Bison. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Cervantes Posté(e) le 1 novembre 2005 Auteur Partager Posté(e) le 1 novembre 2005 yylineno doit venir de Flex si je ne m'abuse, et donc il te manque un extern int yylineno dans ton code Bison. Dans mon fichier y.tab.c j'ai effectivement extern int yylineno, mais pas dans le .yacc Lien vers le commentaire Partager sur d’autres sites More sharing options...
Baldurien Posté(e) le 1 novembre 2005 Partager Posté(e) le 1 novembre 2005 Tu utilises bison ou yacc? avec ou sans flex? Et je crois qu'il s'agit d'une option dans Flex. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Cervantes Posté(e) le 5 novembre 2005 Auteur Partager Posté(e) le 5 novembre 2005 J'utilise bison mais vu que j'utilise l'option -y j'ai un y.tab.c comme avec yacc. Effectivement, il s'agit bien d'un option, j'ai rajouté la ligne suivante dans mon .lex et pu de probleme avec yylineno: %option yylineno Donc ca fait toujours un probleme de régler. Mais j'en ai un autre, peut etre pourras tu m'aider. Dans mon .yacc, j'ai des fonctions en C qui ont été définis et à la compilation du fichier y.tab.c avec gcc, j'ai des erreurs du type: description_fichier_correspondance.yacc:94: error: previous implicit declaration of `tete_correspondance' description_fichier_correspondance.yacc:345: error: `tete_correspondance' was previously implicitly declared to return `int' j'ai ce message d'erreur avec les 4 fonctions C qui sont définis dans le fichier .yacc. Voici les lignes référentes au probleme: %union { long ival; unsigned long uval; double dval; char* sval; LISTE_CORRESPONDANCE* lcorrespondanceval; }; /* definition de nom de Type: T_ENTIER T_NONSIGNE T_DOUBLE T_STR */ %token <ival> T_ENTIER %token <uval> T_NONSIGNE %token <dval> T_DOUBLE %token <sval> T_STR /* types des differents elements syntaxiques d'un fichier de correspondance*/ %type <uval> nb_messages id_liaison id_message offset %type <dval> periode nombre_flottant %type <sval> nom_bus nom_message %type <lcorrespondanceval> description_correspondance liste_correspondance /*-----------------Description du fichier de correspondance-------------------*/ %start description_fichier_correspondance %% description_fichier_correspondance : liste_correspondance { tete_correspondance( $1 ); } un peu plus loin dans le code, ma fonction tete_correspondance est défini comme ceci: void tete_correspondance( liste ) LISTE_CORRESPONDANCE *liste; { if (was_error) return; #ifdef DEBUG_YACC fprintf(stdout,"tete_correspondance()\n"); TEST_PTR( liste, LISTE_CORRESPONDANCE ); #endif root_ptr->liste_correspondance = liste; root_ptr->nb_correspondance = 0; while (liste != (LISTE_CORRESPONDANCE *)NULL) { root_ptr->nb_correspondance++; liste = liste->prochaine_correspondance; } } Si ta une idée pour resoudre mon problème n'hesite pas :) thx ++ Lien vers le commentaire Partager sur d’autres sites More sharing options...
Baldurien Posté(e) le 6 novembre 2005 Partager Posté(e) le 6 novembre 2005 Soit tu fais un fichier h propre, avec les fonctions définies par toi, et tu l'inclus. Soit tu fous le prototype de ta fonction avec un extern devant. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Cervantes Posté(e) le 7 novembre 2005 Auteur Partager Posté(e) le 7 novembre 2005 Ok c'etait bien ca, merci Baldurien y.tab.o(.text+0x1fff):y.tab.c: undefined reference to `yywrap' y.tab.o(.text+0x27aa):y.tab.c: undefined reference to `yywrap' il me reste encore la fonction yywrap. J'ai essayé de la mettre en extern comme pour les autres fonctions mais ca ne marche pas comme l'indique l'erreur. L'erreur ne vient probablement pas du .yacc car gcc compile bien pour lui. Cette fonction est vraiment toute simple pourtant ******************************************************************************* * * FONCTION : yywrap * * PARAMETRES : Aucun * * ACTIONS : on a atteint la fin du fichier: retour pour la fin de * l'analyse * * VALEURS RETOURNEES : 1 * *******************************************************************************/ yywrap() { return 1; }; au fait, c'est normal qu'il n'y a pas de "int" devant yywrap()? (ce n'est pas moi qui est fait le code) Lien vers le commentaire Partager sur d’autres sites More sharing options...
Baldurien Posté(e) le 7 novembre 2005 Partager Posté(e) le 7 novembre 2005 C'est du code C ancien. Par défaut, le type c'est int. Mais bref, avec le C ansi ... tout ça, ça saute. tu as même des perles dans le code de bison : xx() : int x ; { } Mais vaut mieux éviter de s'en servir. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Cervantes Posté(e) le 8 novembre 2005 Auteur Partager Posté(e) le 8 novembre 2005 We le code date d'une dizaine d'annee, c'est vrai qu'au debut ca m'avait un peru choqué comme déclaration pour les fonctions. Sinon pour mon probleme de compilation avec yywrap ta une idée? Lien vers le commentaire Partager sur d’autres sites More sharing options...
Baldurien Posté(e) le 8 novembre 2005 Partager Posté(e) le 8 novembre 2005 M'en suis jamais servi :) je sais même pas ce qu'elle fait :) [edit] Quoique : un petit %option noyywrap dans ton Flex? Lien vers le commentaire Partager sur d’autres sites More sharing options...
Cervantes Posté(e) le 9 novembre 2005 Auteur Partager Posté(e) le 9 novembre 2005 M'en suis jamais servi :) je sais même pas ce qu'elle fait :) [edit] Quoique : un petit %option noyywrap dans ton Flex? Moi non plus je sais pas du tout ce que c'est yywrap, meme avec la doc officiel j'ai rien su de plus, mais en tout cas, avec l'ajout de l'optio et bien ca marche maintenant j'ai pu de warning/error avec gcc !!!!! t trop fort Baldurien Donc merci beaucoup , sur ce coup tu m'enleves une belle épine du pied Au fait pour que tu t'y connaisses bien en lex/yacc, c'est parce que tu t'en sers souvent? c'est vrai que c'est puissant mais je trouve ca chiant a utiliser quand meme. Voila @+ et encore thx Lien vers le commentaire Partager sur d’autres sites More sharing options...
Baldurien Posté(e) le 9 novembre 2005 Partager Posté(e) le 9 novembre 2005 J'ai eu "Compilation/Traduction" en L3.1 Mais je dois avouer que flex/bison j'adore :) j'adore les grammaires tout court^^ Lien vers le commentaire Partager sur d’autres sites More sharing options...
Cervantes Posté(e) le 9 novembre 2005 Auteur Partager Posté(e) le 9 novembre 2005 Ok ba c'est bon a savoir, si j'ai besion d'aide sur ce sujet, je viendrais sur le forum pcimpact pour faire appel a toi ++ Lien vers le commentaire Partager sur d’autres sites More sharing options...
Cervantes Posté(e) le 15 novembre 2005 Auteur Partager Posté(e) le 15 novembre 2005 Baldurien tu es toujours la? J'aurais besion de toi. Je dois utiliser Flex/Bison sur Visual C++ 2003 .NET et j'ai des problemes. J'ai procédé de la manière suivante; flex mon_fichier.lex bison -y mon_fichier.yacc J'ai donc mes fichiers lex.yy.c et y.tab.c. Puis j'ai créé un nouveau projet vide de type console dans VC++, et j'ai mis ces fichiers dedans avec les .h dépendant.. Ce qui me donne quelquechose comme ca: Source Files -> y.tab.c -> lex.yy.c Header Files -> mon_fichier.h Quand je compile y.tab.c avec VC++, j'ai cette série d'erreur: * y.tab.c(928): error C2692: 'yylex' : fonctions entièrement prototypées requises dans le compilateur C avec l'option '/clr' * lex.yy.c(1461): error C2197: 'isatty' : trop d'arguments pour un appel via le pointeur de fonction * lex.yy.c(676): error C2197: 'yy_create_buffer' : trop d'arguments pour un appel via le pointeur de fonction * lex.yy.c(1000): error C2197: 'yy_fatal_error' : trop d'arguments pour un appel via le pointeur de fonction * lex.yy.c(1393): error C2197: 'yy_flex_alloc' : trop d'arguments pour un appel via le pointeur de fonction * lex.yy.c(1428): error C2197: 'yy_flex_free' : trop d'arguments pour un appel via le pointeur de fonction * lex.yy.c(1450): error C2197: 'yy_flush_buffer' : trop d'arguments pour un appel via le pointeur de fonction * lex.yy.c(1335): error C2197: 'yy_init_buffer' : trop d'arguments pour un appel via le pointeur de fonction * lex.yy.c(1577): error C2197: 'yy_scan_buffer' : trop d'arguments pour un appel via le pointeur de fonction * lex.yy.c(1547): error C2197: 'yy_scan_bytes' : trop d'arguments pour un appel via le pointeur de fonction * lex.yy.c(1528): error C2197: 'yy_switch_to_buffer' : trop d'arguments pour un appel via le pointeur de fonction * lex.yy.c(925): error C2197: 'yy_try_NUL_trans' : trop d'arguments pour un appel via le pointeur de fonction * y.tab.c(1288): error C2197: 'yyerror' : trop d'arguments pour un appel via le pointeur de fonction * lex.yy.c(970): error C2197: 'yyrestart' : trop d'arguments pour un appel via le pointeur de fonction * y.tab.c(700): error C2692: 'yydestruct' : fonctions entièrement prototypées requises dans le compilateur C avec l'option '/clr' * y.tab.c(1174): error C2692: 'yyerror' : fonctions entièrement prototypées requises dans le compilateur C avec l'option '/clr' sachant que plusieurs de ces erreurs reviennent plusieurs fois. Est ce que tu as une idée pour corriger ces problèmes de compilation? ++ Lien vers le commentaire Partager sur d’autres sites More sharing options...
Baldurien Posté(e) le 15 novembre 2005 Partager Posté(e) le 15 novembre 2005 tu sais, j'utilise gcc ou mingw, donc pour ce genre de problème je peux pas t'aider plus. Par contre, tu as les listes bison : http://lists.gnu.org/mailman/listinfo/help-bison qui t'aideront mieux... Lien vers le commentaire Partager sur d’autres sites More sharing options...
Cervantes Posté(e) le 15 novembre 2005 Auteur Partager Posté(e) le 15 novembre 2005 Moi aussi je prefere de loin gcc et mingw, le probleme c'est que jsuis obligé de tout passé sur VC++ car j'ai un programme qui doit etre compiler avec une librairie .lib de VC++, et gcc de mingw ne prend pas les .lib, donc jsuis obligé de tout refaire sur vc. Malheuresement mon programme, en plus d'utiliser cette lib, utilise flex/bison donc ca devient bien le bordel. :S Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.