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

  FORUM HardWare.fr
  Programmation
  C

  Calculette Lex + Yacc | probleme avec des strutures | oK

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Calculette Lex + Yacc | probleme avec des strutures | oK

n°556917
Mordock
Posté le 02-11-2003 à 18:20:45  profilanswer
 

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
mood
Publicité
Posté le 02-11-2003 à 18:20:45  profilanswer
 

n°556921
chrisbk
-
Posté le 02-11-2003 à 18:25:49  profilanswer
 

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
n°556926
chrisbk
-
Posté le 02-11-2003 à 18:29:57  profilanswer
 

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
;
 
 
 

n°556930
Mordock
Posté le 02-11-2003 à 18:32:17  profilanswer
 

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
 

n°556932
chrisbk
-
Posté le 02-11-2003 à 18:33:12  profilanswer
 

balance les erreurs stp

n°556935
Mordock
Posté le 02-11-2003 à 18:37:22  profilanswer
 

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

n°556936
chrisbk
-
Posté le 02-11-2003 à 18:39:59  profilanswer
 

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;  
 
 

n°556937
Mordock
Posté le 02-11-2003 à 18:41:35  profilanswer
 

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
n°556941
Mordock
Posté le 02-11-2003 à 18:46:35  profilanswer
 

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

n°556952
Mordock
Posté le 02-11-2003 à 19:04:46  profilanswer
 

le lex remarche
c'etait un pb de comilation

mood
Publicité
Posté le 02-11-2003 à 19:04:46  profilanswer
 

n°556960
Mordock
Posté le 02-11-2003 à 19:18:46  profilanswer
 

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

n°556994
chrisbk
-
Posté le 02-11-2003 à 19:45:07  profilanswer
 

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

n°557034
Mordock
Posté le 02-11-2003 à 20:11:43  profilanswer
 

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'

n°557111
chrisbk
-
Posté le 02-11-2003 à 21:10:18  profilanswer
 

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

n°557465
Mordock
Posté le 03-11-2003 à 12:23:21  profilanswer
 

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


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

  Calculette Lex + Yacc | probleme avec des strutures | oK

 

Sujets relatifs
[C++/GP32] Problème de conversion invalide[Résolu]Probleme de traitement de chaine de caractere
Probleme de taille avec ZipInputStreamproblème con : recupérer une variable passée en paramètre
Problème d'affichage d'états sous excel depuis access[PHP-NEWB] Probleme de session avec hébergement lycos
Problème lié à replace.petit probleme de break
problème avec la commande systeme(" ")[RESOLU] [ou presque] Problème de taille de JPanel
Plus de sujets relatifs à : Calculette Lex + Yacc | probleme avec des strutures | oK


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