Bonjour,
J'ai une sorte de calculatrice qui fonctionne très bien pour les opérations normaux:
Source Yac:
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
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(); }
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
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);
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
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
J'aimerais maintenant utiliser tout ça avec la lecture de scripts, j'aurais par exemple un script:
Pouvez-vous m'aider svp?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 x=45.2*(5+9) print x
Merci d'avance!
Partager