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

  FORUM HardWare.fr
  Programmation
  C

  [Lex Yacc] Structure incomplete

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Lex Yacc] Structure incomplete

n°1826521
AigleRoyal
Posté le 13-12-2008 à 18:40:04  profilanswer
 

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
mood
Publicité
Posté le 13-12-2008 à 18:40:04  profilanswer
 

n°1826543
sligor
Posté le 13-12-2008 à 19:53:38  profilanswer
 

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
n°1826553
AigleRoyal
Posté le 13-12-2008 à 20:14:51  profilanswer
 

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
n°1826557
sligor
Posté le 13-12-2008 à 20:22:47  profilanswer
 

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
n°1826573
Gf4x3443
Killing perfection
Posté le 13-12-2008 à 21:06:32  profilanswer
 

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é
n°1826585
AigleRoyal
Posté le 13-12-2008 à 21:33:52  profilanswer
 

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. }


 
 

n°1826587
sligor
Posté le 13-12-2008 à 21:42:08  profilanswer
 

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
n°1826591
AigleRoyal
Posté le 13-12-2008 à 21:57:10  profilanswer
 

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. }


n°1826595
sligor
Posté le 13-12-2008 à 22:08:42  profilanswer
 

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

n°1826603
AigleRoyal
Posté le 13-12-2008 à 22:20:53  profilanswer
 

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. }

mood
Publicité
Posté le 13-12-2008 à 22:20:53  profilanswer
 

n°1826659
Gf4x3443
Killing perfection
Posté le 13-12-2008 à 23:56:21  profilanswer
 

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é
n°1826694
AigleRoyal
Posté le 14-12-2008 à 01:06:53  profilanswer
 

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

n°1826701
Gf4x3443
Killing perfection
Posté le 14-12-2008 à 02:08:54  profilanswer
 

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é
n°1826713
AigleRoyal
Posté le 14-12-2008 à 09:48:46  profilanswer
 

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

n°1826821
Gf4x3443
Killing perfection
Posté le 14-12-2008 à 15:00:58  profilanswer
 

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é
n°1826904
AigleRoyal
Posté le 14-12-2008 à 17:35:24  profilanswer
 

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
n°1826907
Gf4x3443
Killing perfection
Posté le 14-12-2008 à 17:53:12  profilanswer
 

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é

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

  [Lex Yacc] Structure incomplete

 

Sujets relatifs
Page PHP - Garder la structure du site + CSS[C] recuperer la variable d'une structure connaissant son nom
[C] sizeof et variable de structure[D7] structure d'un record permettant de lire un fichier .SQLITE
suppression d'une structure dans une liste visual c++Question Yacc
Variables en YACCgérer une boucle en YACC
structure if avec une variable globlale - JAVAStocker des pointeurs de fichiers dans une structure : c'est mal?
Plus de sujets relatifs à : [Lex Yacc] Structure incomplete


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