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
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();
}
le fichier.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
#define YYSTYPE double
extern YYSTYPE yylval;
En plus, voici les commandes utiles pour générer l'executable.
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