Aller au contenu

Sujet :[Yacc/Bison] Probleme avec yylineno


Cervantes

Messages recommandés

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

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

Ok c'etait bien ca, merci Baldurien :reflechis:

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

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 :transpi::dd::mdr2: , sur ce coup tu m'enleves une belle épine du pied :mdr:

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

Lien vers le commentaire
Partager sur d’autres sites

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

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

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...