Bonjour,
J'ai une sorte de calculatrice qui fonctionne très bien pour les opérations normaux:

Source Yac:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
%{
 
#include "global.h"
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
%}
 
%token  NOMBRE
%token  PLUS  MOINS FOIS  DIVISE  PUISSANCE
%token  PARENTHESE_GAUCHE PARENTHESE_DROITE
%token  FIN
 
%left PLUS  MOINS
%left FOIS  DIVISE
%left NEG
%right  PUISSANCE
 
%start Input
%%
 
Input:
    /* Vide */
  | Input Ligne
  ;
 
Ligne:
    FIN
  | Expression FIN    { printf("Resultat : %f\n",$1); }
  ;
 
Expression:
    NOMBRE      { $$=$1; }
  | Expression PLUS Expression  { $$=$1+$3; }
  | Expression MOINS Expression { $$=$1-$3; }
  | Expression FOIS Expression  { $$=$1*$3; }
  | Expression DIVISE Expression  { $$=$1/$3; }
  | MOINS Expression %prec NEG  { $$=-$2; }
  | Expression PUISSANCE Expression { $$=pow($1,$3); }
  | PARENTHESE_GAUCHE Expression PARENTHESE_DROITE  { $$=$2; }
  ;
 
%%
 
int yyerror(char *s) {
  printf("%s\n",s);
}
 
int main(void) {
  yyparse();
}
Source lex:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
%{
 
#include "global.h"
#include "calc.h"
 
#include <stdlib.h>
 
%}
 
blancs    [ \t]+
 
chiffre   [0-9]
entier    {chiffre}+
exposant  [eE][+-]?{entier}
 
reel    {entier}("."{entier})?{exposant}?
 
%%
 
{blancs}  { /* On ignore */ }
 
{reel}    {
      yylval=atof(yytext);
      return(NOMBRE);
    }
 
"+"   return(PLUS);
"-"   return(MOINS);
 
"*"   return(FOIS);
"/"   return(DIVISE);
 
"^"   return(PUISSANCE);
 
"("   return(PARENTHESE_GAUCHE);
")"   return(PARENTHESE_DROITE);
 
"\n"  return(FIN);
Et j'exécute le code avec:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
>bison -d calc.y
>mv calc.tab.h calc.h
>mv calc.tab.c calc.y.c
>flex calc.lex
>mv lex.yy.c calc.lex.c
>gcc -c calc.lex.c -o calc.lex.o
>gcc -c calc.y.c -o calc.y.o
>gcc -o calc calc.lex.o calc.y.o -ll -lm
Après un ./calc, il y a lecture d'une expression dans le terminal et affichage de la réponse, par exemple je rentre: 1+1 et il m'affiche Resultat: 2.0000

J'aimerais maintenant utiliser tout ça avec la lecture de scripts, j'aurais par exemple un script:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
x=45.2*(5+9)
print x
Pouvez-vous m'aider svp?

Merci d'avance!