Bonjour,
Je cherche à faire tourner un premier programme supposé ultra-simple à l'aide de Flex et Bison.
Mon problème: Mon expression régulière renseignée dans la première partie du fichier Flex ne fonctionne pas.
Voici les fichiers Flex, Bison, et le header nécessaires à la compilation de l'executable:
Le fichier.l,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 %{ #include "global.h" #include "calculatrice.h" #include <stdlib.h> %} chiffre [0-9] %% {chiffre} return(CHIFFRE); "+" return(PLUS); "9" return(CHIFFRE9); %%
Le fichier.y
le fichier.h
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 %{ #include "global.h" #include <stdio.h> #include <stdlib.h> #include <math.h> %} %token CHIFFRE %token CHIFFRE9 %token PLUS %token FIN %start Input %% Input:/* Vide */ | Input CHIFFRE9 { printf ("chiffre 9");} | Input CHIFFRE { printf ("chiffre");} | Input PLUS { printf ("symbol +");} ; %% int yyerror(char *s) { printf("%s\n",s); } int main(void) { yyparse(); }
En plus, voici les commandes utiles pour générer l'executable.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 #define YYSTYPE double extern YYSTYPE yylval;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 flex fichier.l; mv lex.yy.c fichier_lex.c; bison -y -d fichier.y; mv y.tab.c fichier_yy.c; mv y.tab.h fichier.h; gcc -c fichier_lex.c; gcc -c fichier_yy.c; gcc -o calc fichier_lex.o fichier_yy.o -ll -lm;
Constat: Lorsque je fais tourner l'exécutable, si je rentre un "+" ou un "9", je vais bien faire mon affichage en retour càd "symbol +" ou "chiffre 9". En revanche, si je rentre un chiffre entre 0 et 9, le programme se contente de me renvoyer ce chiffre sans imprimer "chiffre" comme je semble vouloir le faire. La différence entre mes entrées "+" ou "9" et l'ensemble des chiffres de 0 à 9 est que j'ai utilisé une expression régulière pour la deuxième. Cette dernière ne semble pas fonctionner...
Pourquoi ?
Merci beaucoup
Anthony Brézillon
Partager