0% ont trouvé ce document utile (0 vote)
586 vues2 pages

Guide Pratique pour Bison et Flex

Transféré par

Willer Costigan
Copyright
© Attribution Non-Commercial (BY-NC)
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats DOC, PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
586 vues2 pages

Guide Pratique pour Bison et Flex

Transféré par

Willer Costigan
Copyright
© Attribution Non-Commercial (BY-NC)
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats DOC, PDF, TXT ou lisez en ligne sur Scribd

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 :

Vous aimerez peut-être aussi