Calculette Lex + Yacc | probleme avec des strutures | oK

Calculette Lex + Yacc | probleme avec des strutures | oK - C - Programmation

Marsh Posté le 02-11-2003 à 18:20:45    

voila j'essaye de faire une calculette complexe en utilisant Lex et Yacc
voici les codes sources  
 
Code Lex

Code :
  1. %{
  2. #include "y.tab.h"
  3. struct Complex{
  4.   int reel;
  5. int img;
  6. };
  7. extern struct Complex Cm;
  8. %}
  9. %%
  10. [0-9]+ {yylval.Cm.reel = atoi(yytext);
  11. yylval.Cm.img=0;
  12. return NUMBER;
  13. /*printf("Reel = %d Img = %d\n",Cm.reel,Cm.img);*/
  14. }
  15. [0-9]+j+ {yylval.Cm.img = atoi (yytext);
  16. yylval.Cm.reel=0;
  17. return NUMBER;
  18. /*printf("|| Reel = %d Img = %d\n",Cm.reel,Cm.img);*/
  19. }
  20. j+ {
  21. yylval.Cm.img=1;
  22. yylval.Cm.reel=0;
  23. return NUMBER;
  24. /*printf("Reel = %d Img = %d\n",Cm.reel,Cm.img);*/
  25. }
  26. \t;    {printf("whitespace" );}
  27. " "    {;}
  28. \n return 0; /* symbole de retour pour la fin de fichier */
  29. . return yytext[0];
  30. %%


 
Le code Yacc
 

Code :
  1. %{
  2.   struct Complex{
  3.     int reel;
  4.     int img;
  5.     };
  6.    %}
  7. %union{
  8.   struct Complex Cm;
  9. }
  10. %token NAME
  11. %token <Cm> NUMBER
  12. %left '-' '+'
  13. %left '*' '/'
  14. %nonassoc MINUS
  15. %%
  16. statement: NAME '=' expression
  17. | expression { printf("= %d\n",$1); }
  18. ;
  19. expression: expression '+' expression { $$.reel = $1.reel + $3.reel; }
  20. | NUMBER { $$.reel = $1.reel; }
  21. ;
  22. %%
  23. int yyerror(){
  24. }
  25. int main ()
  26. {
  27.   yyparse();
  28. }


 
lors de la comilation du code yacc il me donne :
bash-2.03$ yacc -d ex2.y  
"ex2.y", line 20: fatal: must specify type for expression
bash-2.03$  
ligne : | expression { printf("= %d\n",$1); }
 
je pense que cela vient de la structure.
il faut caster ???  
Merci d'avance


Message édité par Mordock le 03-11-2003 à 13:43:34
Reply

Marsh Posté le 02-11-2003 à 18:20:45   

Reply

Marsh Posté le 02-11-2003 à 18:25:49    

nope, yacc ne fait AUCUNE verif de ton code C, il se contente de le recopier betement.  
Par contre tu utilises $1, ce qui signifie que tu dois expliciter ce que retourne tes non-terminaux
 
tu le fais via :
 
%type<Cm> expression
 
Je sais pas si les structs dans les %union sont tres appréciés, aussi. (a toi de voir)


Message édité par chrisbk le 02-11-2003 à 18:26:13
Reply

Marsh Posté le 02-11-2003 à 18:29:57    

Sinon perso je suis pas fan de mettre des types sur les terminaux, je prefere faire un non terminal pour ca  
 
eg :  
 
expression : expression '+' expression1
...
;
 
expression1 : number
;
 
number : NUMBER
;
 
 
 

Reply

Marsh Posté le 02-11-2003 à 18:32:17    

je suis d'accord mais cela fait une grammaire difficile
le union ca a pas l'air de bien marcher
de toute facon meme le lex est faux, il me dit que je peut pas retourner le type Cm
je sais vraiment pas ce qu'il faut faire
 

Reply

Marsh Posté le 02-11-2003 à 18:33:12    

balance les erreurs stp

Reply

Marsh Posté le 02-11-2003 à 18:37:22    

ok
bash-2.03$ lex ex2.l  
bash-2.03$ gcc lex.yy.c -o ex4 -lfl
In file included from lex.yy.c:84:
y.tab.h:7: field `Cm' has incomplete type

Reply

Marsh Posté le 02-11-2003 à 18:39:59    

le C, c'est loin, mais je crois que c'est comme ca que ca plait a un compilo C;
 
 
typedef struct Complex{  
        int reel;  
      int img;  
    }Complex;  
 
 

Reply

Marsh Posté le 02-11-2003 à 18:41:35    

le c est bon ca vient de lex avec les return
j'avais fait cela au debut et ca marchait
 

Code :
  1. %{
  2. #include "y.tab.h"
  3. struct Complex{
  4.   int reel;
  5. int img;
  6. };
  7. struct Complex Cm;
  8. %}
  9. %%
  10. [0-9]+ {Cm.reel = atoi(yytext);
  11. Cm.img=0;
  12. printf("Reel = %d Img = %d\n",Cm.reel,Cm.img);
  13. }
  14. [0-9]+j+ {Cm.img = atoi (yytext);
  15. Cm.reel=0;
  16. printf("|| Reel = %d Img = %d\n",Cm.reel,Cm.img);
  17. }
  18. j+ {
  19. Cm.img=1;
  20. Cm.reel=0;
  21. printf("Reel = %d Img = %d\n",Cm.reel,Cm.img);
  22. }
  23. \t;    {printf("whitespace" );}
  24. " "    {;}
  25. \n return 0; /* symbole de retour pour la fin de fichier */
  26. . return yytext[0];
  27. %%
  28. main() {
  29.   yylex();
  30. }


Message édité par Mordock le 02-11-2003 à 18:41:52
Reply

Marsh Posté le 02-11-2003 à 18:46:35    

maintenant ca marche plus :
bash-2.03$ gcc lex.yy.c -o ex4 -lfl
In file included from lex.yy.c:83:
y.tab.h:7: field `Cm' has incomplete type
pourtant j'ai bien un executable qui marche

Reply

Marsh Posté le 02-11-2003 à 19:04:46    

le lex remarche
c'etait un pb de comilation

Reply

Marsh Posté le 02-11-2003 à 19:04:46   

Reply

Marsh Posté le 02-11-2003 à 19:18:46    

j'ai essayer ca  

Code :
  1. %{
  2.   struct Complex{
  3.     int reel;
  4.     int img;
  5. };
  6. %}
  7. %union{
  8. struct Complex Cm;
  9. }
  10. %token <Cm> NUMBER
  11. %token NAME
  12. %left '-' '+'
  13. %left '*' '/'
  14. %nonassoc MINUS
  15. %%
  16. statement: NAME '=' expression
  17. | expression { printf("= %d\n",%type<Cm>$1.reel); }
  18. ;
  19. expression: expression '+' expression {%type<Cm>$$.reel =%type<Cm>$1.reel +%type<Cm>$3.reel; }
  20. | NUMBER { %type<Cm>$$.reel = %type<Cm>$1.reel; }
  21. ;
  22. %%
  23. int yyerror(){
  24. }
  25. int main ()
  26. {
  27.   yyparse();
  28. }


ilo me dit cela comme erreur  
bash-2.03$ yacc ex5.y
"ex5.y", line 20: fatal: must specify type for expression

Reply

Marsh Posté le 02-11-2003 à 19:45:07    

%type<Cm> expression :O
en dessous de tes decls de token :O

Reply

Marsh Posté le 02-11-2003 à 20:11:43    

ca ne marche pas il me met cici comme erreur :
bash-2.03$ yacc ex5.y  
bash-2.03$ lex ex5.l
bash-2.03$ gcc -o ex5 y.tab.c lex.yy.c -lfl  
ex5.l: In function `yylex':
ex5.l:13: union has no member named `Cm'
ex5.l:14: union has no member named `Cm'

Reply

Marsh Posté le 02-11-2003 à 21:10:18    

hé, attends hein ? Melange pas erreur produites par Yacc et erreur produite par gcc !

Reply

Marsh Posté le 03-11-2003 à 12:23:21    

Ca marche  
merci de ton aide c'etait une erreur de librairie

Reply

Sujets relatifs:

Leave a Replay

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