Vous êtes sur la page 1sur 2

2. Format du fichier de règles Bison: 3.

Exemple de fichier Bison :


Mini manuel d’utilisation de l’outil Bison
Le fichier de règles pour Bison est similaire dans sa Nous allons tenter de réaliser un analyseur
structure et sa syntaxe à celui de Flex. La différence grammatical qui reconnaît la simple grammaire :
1. L'outil Bison: majeure étant bien entendu que Bison attend une S  a b c | a b c S.
grammaire.
Afin de réaliser un analyseur syntaxique il faut Le code ci-dessous décrit un tel analyseur
décrire d'abord l'outil à construire dans un texte, ce 1. La première partie du fichier contient les en-têtes, grammatical sous la forme d’un fichier de règle
texte fourni à l’outil Bison permet d'obtenir ensuite les macros et les autres déclarations C nécessitant Destiné à Bison.
un analyseur syntaxique en langage C qui a pour d’être définies avant le code de l’analyseur Ce qui nous donne le fichier suivant :
nom « y.tab.c. » syntaxique. On y trouve également les déclarations
Une fois obtenu cet analyseur il faut le compiler et des symboles terminaux de la grammaire (tokens). 1 %{
l'on a alors un exécutable qui effectue l'analyse 2 # include <stdio.h>
syntaxique suivant les instructions données dans le 2. La seconde partie du fichier décrit la grammaire 3 typedef char* string ; /* les tokens sont des
fichier Bison dont l'extension est « .y ». Ce dans un formalisme proche du BNF. chaînes* /
fonctionnement peut être schématisé par la figure La syntaxe est la suivante : 4 # define YYSTYPE string /* le ty pe de la
suivante: <nom de la variable> : <règle de dérivation 1> variable de retour de Bison /
| <règle de dérivation 2> 5 %}
| ... 6 %token NEED NUMB THING
On regroupe les règles de dérivation partageant la 7 %%
Description Biso Analyseur même partie gauche à l’aide du caractère | . 8 file : record file
syntaxique
non
syntaxique 9 |record
3. Finalement, la dernière partie contient le code 10 ;
Fichier.y y.tab.c principal du parseur grammatical ainsi que 11 record : NEED NUMB THING { printf ( ” Tu
des définitions de procédures si nécessaire. as besoin de %s %s \n ” , $2 , $3 ) ; }
Identificateurs
Généralement la forme d’un fichier Bison est 12 ;
des non- donnée comme suite : 13 %%
terminaux 1 %{ 14 int yyerror ( char* msg ) {
y.tab.h Compilate 2 Ici les déclarations en C 15 printf ( ” Error : %s encountered \n ” , msg );
ur
C
3 %} 16 }
Description Analyseur
4 % t o k e n <énumération> <des> <symboles> 17
Flex
lexicale lexical <terminaux> 18 int main ( )
5 %% 19 {
Fichier.l Lex.yy.c
6 Description de l a grammaire 20 printf ( ”Taper CTRL+D pour stopper\n” ) ;
7 %% 21 yyparse( ) ;
Analyseur 8 Définition des procédures et du code principal 22 return 0 ;
Exécutable 23 }
1. La première partie définit le type string, type 1 %{ #flex essai.l
utilisé pour les tokens (symboles terminaux) 2 # include ”essai.tab.h ” # bison -d essai.y
au sein de Bison. 3 # include <stdio.h> # cc essai.tab.c lex.yy.c -o essai
Ce type est également celui de la variable yyval au 4 # include <string.h>
sein du fichier de Lex. 5 extern YYSTYPE yylval; Testons maintenant notre tout nouvel analyseur
On y définit ensuite les symboles terminaux NEED, 6 %} grammatical avec quelques phrases simples :
NUMB et THING. 7 chars [A-Za-z ]
8 numbers ( [0-9]+) # ./essai
2. La seconde partie décrit la grammaire et les 9 whitespace ( [ ˆA-Za-z0-9\-]+)
actions à effectuer lors de l’application des règles de 10 mot {chars}+ Taper CTRL+D pour stopper
dérivation. 11 %% Il faut 1 voiture
12 ” Il faut ” {yylval = (YYSTYPE) strdup Tu as besoin de 1 voiture
3. La dernière partie permet finalement de définir la ( yytext ) ; return NEED; } Il faut 2 canards
fonction principale d’exécution qui lance 13 {numbers } { yylval = (YYSTYPE) strdup Tu as besoin de 2 canards
l’analyseur grammatical. ( yytext ) ; return NUMB; }
La définition de la fonction yyerror() est nécessaire 14 {mot} {yylval = (YYSTYPE) strdup (yytext) ;
car elle permet de gérer les éventuelles erreurs return THING; }
d’analyse. 15 {mot}”-”{mot} { yylval = (YYSTYPE) strdup
( yytext ) ; return THING; }
4. Passerelle entre Flex et Bison : 16 { whitespace} {}
17 %%
La passerelle entre Flex et Bison se réalise en 18 int yywrap ( ) {
plusieurs étapes : 19 return 1 ;
20 }
– inclusion de l’en-tête généré par Bison au
sein du fichier Flex ; 5. Compilation et tests :
– passage des valeurs reconnues par le biais
d’une variable yylval La compilation d’un couple de fichiers Flex et
– retour en fin d’action du nom du token Bison est un peu plus délicate à cause du croisement
correspondant à l’expression reconnue dans des dépendances. Cependant cela reste assez simple
Bison puisqu’il suffit, dans notre cas, de compiler les deux
sources simultanément, Le compilateur C ayant
Ce qui nous donne pour le fichier de règles destiné l’intelligence de gérer
à Flex : ces dépendances tout seul !
Ce qui revient à exécuter les commandes suivantes :