Téléchargez comme DOC, PDF, TXT ou lisez en ligne sur Scribd
Télécharger au format doc, pdf ou txt
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 :