flex/bison: expression régulière
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:
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
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
| %{
#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();
} |
le fichier.h
Code:
1 2
| #define YYSTYPE double
extern YYSTYPE yylval; |
En plus, voici les commandes utiles pour générer l'executable.
Code:
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