[Aide Lex] newbies en lex/yacc

newbies en lex/yacc [Aide Lex] - C - Programmation

Marsh Posté le 04-01-2005 à 17:57:15    

bonjour à tous !
 
je me permet de poster ici car j'ai un mini projet à faire pour la fac, je dois faire une calculatrice en lex. le hic c'est que je sais meme pas ce que c'est. j'ai chercher sur ggogle et je pense avoir compris qu'il s'agit en partie de programmation en C et que ca se passe principalement sous linux. est ce qu'il y a moyen de bosser ca sous windows ?
 
Sinon je suis completement paumé et je ne vois pas par quel bout prendre ce petit projet. voici le descriptif du sujet si certains pouvait m'aiguiller un peu ca m'arrangerait bien. :)  
 
Le but de ce mini projet est la réalisation d'une petite calculatrice décrite par l'exemple ci-dessous :
 
$ calcu
> 2 + 3
5
> (2+3) * 7 - 3
32
> 2 + 3 * 7 - 3
20
> fin
bye.
$
 
Vous utiliserez lex pour reconnaître les unités lexicales et yacc pour définir l'analyseur syntaxique.
Extensions du projet
 
Attention, je vous conseille fortement de terminer complètement les premières étapes avant de vous engager dans une extension. Je vous propose pour ce projet l'extension suivante :
 
Faites en sorte que votre calculatrice prenne en compte la notion de variable comme dans l'exemple ci-dessous :
 
$ calcu
> affect cinq = 2 + 3
> affect six = cinq + 1
> (cinq * 7) - 3
32
> var
cinq = 5
six = 6
>
...
 
Une autre extension consiste à pouvoir définir des fonctions réutilisables comme le montre l'exemple ci-dessous :
 
$ calcu
> fonction fois10(p,q) = (p * q) - 10
> fois10(5,6)
20
...
 
Dans ce cas, il est nécessaire de représenter une formule dans une tableau pour la ré-évaluer plus tard. Ce tableau pourrait avoir la forme suivante (c'est une notation post-fixée facile à évaluer) :
 
    $1  $2 * 10 -

 
j'espere que vous allez m'aider a avance. par avance merci
 
PS : etant novice sur le sujet je m'excuse aupres des modos si j'ai mal placé le topic, j'ai pensé que C etait plus aproprié.

Reply

Marsh Posté le 04-01-2005 à 17:57:15   

Reply

Marsh Posté le 04-01-2005 à 17:59:23    

ton prof de TD de compilation il sert à quoi?


---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 04-01-2005 à 18:01:08    

il est en deplacement à barcelone et injoignable par mail pendant 15 jours. :(

Reply

Marsh Posté le 04-01-2005 à 18:30:48    

T'as suivi les cours magistraux au moins?
Dans la négative, je ne peux rien pour toi car:
1/ c'est hors charte et j'ai déjà fait ma BA de l'année aujourd'hui
2/ j'ai pas envie de me substituer à un prof pour t'appendre ce qu'est la phase d'analyse lexicale dans un processus de compilation
 
(NB: aide inside quand même :whistle:)


Message édité par schnapsmann le 04-01-2005 à 18:31:37

---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 04-01-2005 à 18:53:42    

reponse a la premiere question : oui
 
deuxiemement, il devait nous filler de la doc qu'il a oublier avant les vacances de noel...
 
troisièment je suis dans une filiere competences complementaire en informatique (commence depuis 3mois) qui fait que nous avons eut des cours de programmations en c uniquement. et des cours generalistes sur unix, histoire de pouvoir se depatouiller un peu.
Hors pour ce projet, je ne vois pas du tout comment le prendre.
 
Quatriement : merci pour l'aide inside.;)

Reply

Marsh Posté le 04-01-2005 à 21:53:43    

starseb a écrit :

bonjour à tous !
 
je me permet de poster ici car j'ai un mini projet à faire pour la fac, je dois faire une calculatrice en lex. le hic c'est que je sais meme pas ce que c'est. j'ai chercher sur ggogle et je pense avoir compris qu'il s'agit en partie de programmation en C et que ca se passe principalement sous linux. est ce qu'il y a moyen de bosser ca sous windows ?
 


 
les concepts sous-jacents à lex et yacc sont beaucoup plus complexes qu'un problème de programmation ou de C. Si les termes analyse lexicale, syntaxique et sémantique, n'évoque rien pour toi, tu vas en chier...

Reply

Marsh Posté le 04-01-2005 à 22:06:44    

oups.  
 
bah je vais en chier alors. je vais de ce pas faire une recherche sur google avec ces criteres.
c'est deja un debut.  
mais je sais pas si vu notre niveau, il faut se pencher vers quelque chose d'aussi complexe ?
merci en tout cas. je suis preneur de toute autre info.

Reply

Marsh Posté le 04-01-2005 à 22:47:15    

Pour le truc de base (une calculette en lex et yacc) il y a des exemple dans les docs lex et yacc (ou bison & flex) dont tu peux t'inspirer.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 04-01-2005 à 22:49:19    

j'ai vu ca sur le forum dans mes recherches bison et flex c'est la meme chose que lex et yacc ?
 
je me trompe ou il va falloir que j'installe un linux sur mon pc pour faire ca ? si oui, je crois qu il existe des versions bootable sur cd qui m'eviterais d'avoir tout sur le pc, vous en connaissez une ?


Message édité par starseb le 04-01-2005 à 22:54:01
Reply

Marsh Posté le 04-01-2005 à 22:54:18    

flex et bison sont les versions gnu de lex et yacc.
 
Trouver un exemple de calculette n'est pas tres dur car c'est celui qui est repris partout (la page info de flex sous linux par exemple).
 
Developper ca sous win c'est chiant et tu peux effectivement utiliser un livecd linux (http://www.knoppix.org)
 
Sinon te plains pas trop, moi j'ai un compilateur de pseudo langage à faire (faudrait peut etre que je m'y mette d'ailleurs  :D )


Message édité par fafounet le 04-01-2005 à 22:56:37
Reply

Marsh Posté le 04-01-2005 à 22:54:18   

Reply

Marsh Posté le 04-01-2005 à 23:16:54    

suis aller sur knoppix, bon je me depatouiller de l'allemand et j'ai trouve plusieur version de lnoppix chacune faisant dans les 696mo. je suis en train de telecharger ca : KNOPPIX_V3.7-2004-12-08-EN.iso. c'est la seule que j'ai besoin de graver pour booter sur le cd apres ?

Reply

Marsh Posté le 04-01-2005 à 23:34:40    

Knoppix c'est bien mais cygwin c'est mieux :) surtout si t'est sous windowz. Sinon regarde la def des termes token, lexer, parser, analyse LR(1), automate à pile ... et SURTOUT refait des exemples de petits parsers, google en est blindé.
 
Bonne chance.

Reply

Marsh Posté le 05-01-2005 à 02:58:09    

Tiens, j'ai écris 2-3 conneries là:
http://forum.hardware.fr/hardwaref [...] 2242-1.htm

Reply

Marsh Posté le 05-01-2005 à 06:41:42    

merci à tous, ca va me permettre de déja bien commencé et attaqué, mais je pense revenir à la recharge d'ici quelques jours (ou heures ;))

Reply

Marsh Posté le 08-01-2005 à 21:37:49    

bon j'ai un peu avance la calculatrice est faite:  
 
voici le code au passage :  
 
fichier global.h

Code :
  1. * #define YYSTYPE double
  2.     * extern YYSTYPE yylval;


 
 
 
voici mon fichier lex  

Code :
  1. %{
  2. #include "global.h"
  3. #include "calc.h"
  4. #include <stdlib.h>
  5. %}
  6. blancs    [ \t]+
  7. chiffre   [0-9]
  8. entier    {chiffre}+
  9. reel {entier}
  10. %%
  11. {blancs}  { /* On ignore */ }
  12. {reel}    {
  13.       yylval=atof(yytext);
  14.       return(NOMBRE);
  15.     }
  16. "+"   return(PLUS);
  17. "-"   return(MOINS);
  18. "*"   return(FOIS);
  19. "/"   return(DIVISE);
  20. "^"   return(PUISSANCE);
  21. "("   return(PARENTHESE_GAUCHE);
  22. " )"   return(PARENTHESE_DROITE);
  23. "\n"  return(RES);
  24. "fin" {printf("bye.\n" );
  25. return 0;};
  26. %%


 
et mon fichier yacc
 

Code :
  1. %{
  2. #include "global.h"
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <math.h>
  6. %}
  7. %token  NOMBRE
  8. %token  PLUS  MOINS FOIS  DIVISE  PUISSANCE
  9. %token  PARENTHESE_GAUCHE PARENTHESE_DROITE
  10. %token  RES
  11. %left PLUS  MOINS
  12. %left FOIS  DIVISE
  13. %left NEG
  14. %start Input
  15. %%
  16. Input:
  17.     /* Vide */
  18.   | Input Ligne
  19.    ;
  20. Ligne:
  21.     RES
  22.   | Expression RES    { printf("Resultat : %f\n",$1); }
  23.   ;
  24.  
  25. Expression:
  26.     NOMBRE      { $$=$1; }
  27.   | Expression PLUS Expression  { $$=$1+$3; }
  28.   | Expression MOINS Expression { $$=$1-$3; }
  29.   | Expression FOIS Expression  { $$=$1*$3; }
  30.   | Expression DIVISE Expression  { $$=$1/$3; }
  31.   | MOINS Expression %prec NEG  { $$=-$2; }
  32.   | PARENTHESE_GAUCHE Expression PARENTHESE_DROITE  { $$=$2; }
  33.   ;
  34. %%
  35. int yyerror(){}
  36. int main(void)
  37. {
  38.   yyparse();
  39.   }


 
mon hic c'est que j'arrive pas a faire l'extension du projet  avec une variable definit par l'utilisateur qui contient une somme que la calculatrice peut calculer. il faut que cette variable puisse etre reutiliser par ce dernier dans un autre calcul sans avoir a rentrer sa valeur.

Reply

Sujets relatifs:

Leave a Replay

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