Lex et Yac: programme doit lire un script
Bonjour,
J'ai une sorte de calculatrice qui fonctionne très bien pour les opérations normaux:
Source Yac:
Code:
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:
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:
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:
Pouvez-vous m'aider svp?
Merci d'avance!