[Lex Yacc] Structure incomplete

Structure incomplete [Lex Yacc] - C - Programmation

Marsh Posté le 13-12-2008 à 18:40:04    

Bonjour à tous,
J'essaie en projet de coder un mini compilateur Pascal en Lex et Yacc.
 
Dans mon fichier yacc, j'ai ça :

Code :
  1. %union{
  2. int ival; char* cval; double fval;
  3. struct {
  4.   int type;
  5.   char* nom;
  6.   double valeur;
  7. } info_var ;
  8. struct {
  9.   char* writeln;
  10.   struct info_var affect;
  11. } instr ;
  12. struct {
  13.    int expr_bool;
  14.    struct instr instruction;
  15. } cond ;
  16. }


 
Mais, le compilateur me renvoie l'erreur suivante :
 

Code :
  1. exemple3.y:56: erreur: field ‘affect’ has incomplete type
  2. exemple3.y:61: erreur: field ‘instruction’ has incomplete type


 
Et pourtant, dans le point h, je vois ceci :

Code :
  1. #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
  2. typedef union YYSTYPE
  3. #line 45 "exemple3.y"
  4. {
  5. int ival; char* cval; double fval;
  6. struct {
  7.   int type;
  8.   char* nom;
  9.   double valeur;
  10. } info_var ;
  11. struct {
  12.   char* writeln;
  13.   struct info_var affect;
  14. } instr ;
  15. struct {
  16.    int expr_bool;
  17.    struct instr instruction;
  18. } cond ;
  19. }
  20. /* Line 1489 of yacc.c.  */


 
Je ne vois pas d'où provient l'erreur. Des idées ?
 
Merci d'avance,
 
AR


Message édité par AigleRoyal le 13-12-2008 à 18:41:58
Reply

Marsh Posté le 13-12-2008 à 18:40:04   

Reply

Marsh Posté le 13-12-2008 à 19:53:38    

info_var tel que tu l'as défini n'est pas une structure mais un élément de ton union !
 
un truc du genre
 

Code :
  1. struct s_info_var {
  2.   int type;
  3.   char* nom;
  4.   double valeur;
  5. };
  6. struct s_instr{
  7.   char* writeln;
  8.   struct s_info_var affect;
  9. } ;
  10. struct s_cond{
  11.    int expr_bool;
  12.    struct s_instr instruction;
  13. };
  14. %union{
  15. int ival; char* cval; double fval;
  16. struct s_info_var info_var;
  17. struct s_instr instr;
  18. struct s_cond cond;
  19. }


 
ça doit déjà mieux passer ;)

Message cité 1 fois
Message édité par sligor le 13-12-2008 à 19:55:44
Reply

Marsh Posté le 13-12-2008 à 20:14:51    

sligor a écrit :

info_var tel que tu l'as défini n'est pas une structure mais un élément de ton union !
 
un truc du genre
 

Code :
  1. struct s_info_var {
  2.   int type;
  3.   char* nom;
  4.   double valeur;
  5. };
  6. struct s_instr{
  7.   char* writeln;
  8.   struct s_info_var affect;
  9. } ;
  10. struct s_cond{
  11.    int expr_bool;
  12.    struct s_instr instruction;
  13. };
  14. %union{
  15. int ival; char* cval; double fval;
  16. struct s_info_var info_var;
  17. struct s_instr instr;
  18. struct s_cond cond;
  19. }


 
ça doit déjà mieux passer ;)


 
J'obtiens les erreurs :

Code :
  1. exemple3.y:27: erreur: field ‘affect’ has incomplete type
  2. exemple3.y:32: erreur: field ‘instruction’ has incomplete type
  3. exemple3.y:47: erreur: field ‘info_var’ has incomplete type
  4. exemple3.y:48: erreur: field ‘instr’ has incomplete type
  5. exemple3.y:49: erreur: field ‘cond’ has incomplete type


 
J'ai même essayé avec des typedef en dehors de mon union. Ca marche pas mieux.

Message cité 1 fois
Message édité par AigleRoyal le 13-12-2008 à 20:17:47
Reply

Marsh Posté le 13-12-2008 à 20:22:47    

tu peux afficher ton code exemple3.y depuis le début jusqu'au lignes impliquées ?

Message cité 1 fois
Message édité par sligor le 13-12-2008 à 20:23:06
Reply

Marsh Posté le 13-12-2008 à 21:06:32    

AigleRoyal a écrit :


J'ai même essayé avec des typedef en dehors de mon union. Ca marche pas mieux.


 
Essaye en mettant tes déclarations du début entre %{ et %}.
 

Code :
  1. %{
  2. struct s_info_var {
  3.   int type;
  4.   char* nom;
  5.   double valeur;
  6. };
  7. struct s_instr{
  8.   char* writeln;
  9.   struct s_info_var affect;
  10. } ;
  11. struct s_cond{
  12.    int expr_bool;
  13.    struct s_instr instruction;
  14. };
  15. %}
  16. %union{
  17. int ival; char* cval; double fval;
  18. struct s_info_var info_var;
  19. struct s_instr instr;
  20. struct s_cond cond;
  21. }


---------------
Petit guide Kerberos pour l'administrateur pressé
Reply

Marsh Posté le 13-12-2008 à 21:33:52    

sligor a écrit :

tu peux afficher ton code exemple3.y depuis le début jusqu'au lignes impliquées ?


 
Voilà mon code :

Code :
  1. /* Fichier exemple3.y */
  2. %{
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <math.h>
  6. #include "string.h"
  7. void yyerror(char *str) ;
  8. int yywrap() ;
  9. #define INT 1
  10. #define REAL 2
  11. #define MAXDECLAR 20
  12. struct {
  13.   int type;
  14.   char* nom;
  15.   double valeur;
  16. } s_info_var ;
  17. struct info_var* tab_var[MAXDECLAR];
  18. struct {
  19.    char* writeln;
  20.    struct s_info_var affect;
  21. } s_instr ;
  22. struct {
  23.    int expr_booleene;
  24.    struct s_instr instruction;
  25. } s_cond;
  26. int nbreLignes = 0;
  27. int i=0;
  28. int j=0;
  29. int k=0;
  30. %}
  31. %union{
  32. int ival; char* cval; double fval;
  33. struct s_info_var info_var;
  34. struct s_instr instr;
  35. struct s_cond cond;
  36. }


 
 

Reply

Marsh Posté le 13-12-2008 à 21:42:08    

ce n'est pas ce que j'ai écrit  [:thalis]
 
 
revois tes cours de C sur les structures ;) :
 

Code :
  1. struct nom_structure
  2. {
  3. };


ou

Code :
  1. typedef struct
  2. {
  3. }nom_typedef;


 
mais pas
 

Code :
  1. struct
  2. {
  3. }aaaaa;


 
qui declare juste une variable avec une structure anonyme.
 

Message cité 1 fois
Message édité par sligor le 13-12-2008 à 21:45:43
Reply

Marsh Posté le 13-12-2008 à 21:57:10    

sligor a écrit :

ce n'est pas ce que j'ai écrit  [:thalis]
 
 
revois tes cours de C sur les structures ;) :
 

Code :
  1. struct nom_structure
  2. {
  3. };


ou

Code :
  1. typedef struct
  2. {
  3. }nom_typedef;


 
mais pas
 

Code :
  1. struct
  2. {
  3. }aaaaa;


 
qui declare juste une variable avec une structure anonyme.
 


 
Je ne pensais pas que ça changeais quelque chose.
 
Quoiqu'il en soit, j'ai toujours les mêmes erreurs :) avec le code suivant :

Code :
  1. /* Fichier exemple3.y */
  2. %{
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <math.h>
  6. #include "string.h"
  7. void yyerror(char *str) ;
  8. int yywrap() ;
  9. #define INT 1
  10. #define REAL 2
  11. #define MAXDECLAR 20
  12. struct s_info_var{
  13.   int type;
  14.   char* nom;
  15.   double valeur;
  16. };
  17. struct info_var* tab_var[MAXDECLAR];
  18. struct s_instr{
  19.    char* writeln;
  20.    struct s_info_var affect;
  21. };
  22. struct s_cond{
  23.    int expr_booleene;
  24.    struct s_instr instruction;
  25. };
  26. int nbreLignes = 0;
  27. int i=0;
  28. int j=0;
  29. int k=0;
  30. %}
  31. %union{
  32. int ival; char* cval; double fval;
  33. struct s_info_var info_var;
  34. struct s_instr instr;
  35. struct s_cond cond;
  36. }


Reply

Marsh Posté le 13-12-2008 à 22:08:42    

à la ligne 21 c'est s_info_var pas info_var
peut être que ça fait bugger tout le reste

Reply

Marsh Posté le 13-12-2008 à 22:20:53    

sligor a écrit :

à la ligne 21 c'est s_info_var pas info_var
peut être que ça fait bugger tout le reste


 
J'aurais aimé que ce soit ça. J'ai corrigé et rien n'y fait :
 

Code :
  1. /* Fichier exemple3.y */
  2. %{
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <math.h>
  6. #include "string.h"
  7. void yyerror(char *str) ;
  8. int yywrap() ;
  9. #define INT 1
  10. #define REAL 2
  11. #define MAXDECLAR 20
  12. struct s_info_var{
  13.   int type;
  14.   char* nom;
  15.   double valeur;
  16. };
  17. struct s_info_var* tab_var[MAXDECLAR];
  18. struct s_instr{
  19.    char* writeln;
  20.    struct s_info_var affect;
  21. };
  22. struct s_cond{
  23.    int expr_booleene;
  24.    struct s_instr instruction;
  25. };
  26. int nbreLignes = 0;
  27. int i=0;
  28. int j=0;
  29. int k=0;
  30. %}
  31. %union{
  32. int ival; char* cval; double fval;
  33. struct s_info_var info_var;
  34. struct s_instr instr;
  35. struct s_cond cond;
  36. }

Reply

Marsh Posté le 13-12-2008 à 22:20:53   

Reply

Marsh Posté le 13-12-2008 à 23:56:21    

Tu pourrais donner les commandes yacc/bison/lex/flex que tu utilises pour la génération? Pour le lexer, il faut inclure le y.tab.h si tu utilises yylval.


---------------
Petit guide Kerberos pour l'administrateur pressé
Reply

Marsh Posté le 14-12-2008 à 01:06:53    

Gf4x3443 a écrit :

Tu pourrais donner les commandes yacc/bison/lex/flex que tu utilises pour la génération? Pour le lexer, il faut inclure le y.tab.h si tu utilises yylval.


 
Voilà les commandes :

Code :
  1. lex exemple3.l;yacc -d exemple3.y;mv y.tab.h exemple3.h;cc lex.yy.c y.tab.c -o exemple3 -D DBG=0
  2. Ou
  3. lex exemple3.l
  4. yacc -d exemple3.y
  5. mv y.tab.h exemple3.h
  6. cc lex.yy.c y.tab.c -o exemple3 -D DBG=0

Reply

Marsh Posté le 14-12-2008 à 02:08:54    

J'insiste.

 

Le header qui définit ces structures est-il correctement inclus dans le fichier pour lex et celui pour yacc? y.tab.h n'est pas censé les contenir, les directives d'inclusion de yacc concernent uniquement y.tab.c. Le fichier y.tab.h n'est la que pour le cas éventuel ou tu veux exporter la lval.

 

C'est assez peu orthodoxe cette manière de faire, les bonnes pratiques veulent que l'on mettent les structures externes dans un header à part.

Message cité 1 fois
Message édité par Gf4x3443 le 14-12-2008 à 02:10:09

---------------
Petit guide Kerberos pour l'administrateur pressé
Reply

Marsh Posté le 14-12-2008 à 09:48:46    

Gf4x3443 a écrit :

J'insiste.
 
Le header qui définit ces structures est-il correctement inclus dans le fichier pour lex et celui pour yacc? y.tab.h n'est pas censé les contenir, les directives d'inclusion de yacc concernent uniquement y.tab.c. Le fichier y.tab.h n'est la que pour le cas éventuel ou tu veux exporter la lval.
 
C'est assez peu orthodoxe cette manière de faire, les bonnes pratiques veulent que l'on mettent les structures externes dans un header à part.


 
En fait, le fichier de base nous a été fourni par le prof (c'est prk il s'appelle encore "exemple3" ). Je ne maitrise pas toutes les subtilités des inclusions avec y.tab.h ou y.tab.c. J'avais un fichier de base que je devais compléter au fur et à mesure. Donc, de ce coté là, je ne saurais rien expliquer.
 
Y a-t-il une incidence sur les déclarations de mes structures ?
 
AR

Reply

Marsh Posté le 14-12-2008 à 15:00:58    

Les déclarations de structures, mets les à part dans un autre header (comme je l'ai déjà dit), et inclus ce header dans le fichier lex ET le fichier yacc.

 

Edit: si tu veux voir les incidences, prends toi par la main, et va regarder les fichiers sources C générés: ils sont censés être standalones.

 

Edit2: ceci bien évidemment, suivant ce que utilises dans ton lex, mais vu que tu ne donnes pas l'intégralité de ces fichiers, tout ce qu'on peut faire sligor et moi, c'est faire de la résolution "Madame Soleil".

Message cité 1 fois
Message édité par Gf4x3443 le 14-12-2008 à 15:05:52

---------------
Petit guide Kerberos pour l'administrateur pressé
Reply

Marsh Posté le 14-12-2008 à 17:35:24    

Ok, je regarde ça et je vous tiens au courant.
 

Gf4x3443 a écrit :

Les déclarations de structures, mets les à part dans un autre header (comme je l'ai déjà dit), et inclus ce header dans le fichier lex ET le fichier yacc.
 
Edit: si tu veux voir les incidences, prends toi par la main, et va regarder les fichiers sources C générés: ils sont censés être standalones.


J'avais posté mon fichier point h, plus haut.
 

Gf4x3443 a écrit :


Edit2: ceci bien évidemment, suivant ce que utilises dans ton lex, mais vu que tu ne donnes pas l'intégralité de ces fichiers, tout ce qu'on peut faire sligor et moi, c'est faire de la résolution "Madame Soleil".


"Madame Soleil" késako :) ?
 
AR

Message cité 1 fois
Message édité par AigleRoyal le 14-12-2008 à 17:36:05
Reply

Marsh Posté le 14-12-2008 à 17:53:12    

AigleRoyal a écrit :


J'avais posté mon fichier point h, plus haut.

 

T'as posté celui généré par yacc via -d. Or je parle bien d'un header indépendant de lex et yacc, celui qui devrait contenir (normalement, quand on suit quelques best practices de compilo) tes définitions publiques (protégées avec les macros qui vont bien, évidemment).

 
AigleRoyal a écrit :


"Madame Soleil" késako :) ?

 

Que tu ne donnes qu'une partie de tes fichiers, et qu'on est obligé de sortir à chaque fois la boule de cristal pour essayer de comprendre.

 

C'est beaucoup plus facile quand on a l'intégralité du code et qu'on le fait de notre coté, on isole bien plus vite les problèmes en 10 min plutot que de taper 15 commentaires pour énumérer tous les cas problèmatiques possibles.


Message édité par Gf4x3443 le 14-12-2008 à 17:53:54

---------------
Petit guide Kerberos pour l'administrateur pressé
Reply

Sujets relatifs:

Leave a Replay

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