Está en la página 1de 26

Chapitre III Loutil yacc/bison

erale Presentation gen Structure du chier de specication bison Attributs Communication avec lanalyseur lexical : yylval enies Variables, fonctions et actions pred Conits shift-reduce et reduce-reduce Recup eration des erreurs
Loutil yacc/bison 2011-2012 1 / 22

Yousra Bendaly Hlaoui (ISITCOM)

erale Presentation gen

erale Presentation gen


Loutil yacc/bison e batis pour construire des analyseurs De nombreux outils ont et ` partir de grammaires. Cest a ` dire des outils qui syntaxiques a ` partir dune construisent automatiquement une table danalyse a grammaire donnee. yacc est un utilitaire dunix
yacc signie Yet Another Compiler Compiler : encore un compilateur de compilateur.

bison est un produit gnu. yacc/bison


la description dun langage sous forme de regles ` accepte en entree de productions produit un programme ecrit dans un langage de haut niveau reconna (langage C) qui, une fois compile, t des phrases de ce langage : ce programme est lanalyseur syntaxique
Yousra Bendaly Hlaoui (ISITCOM) Loutil yacc/bison 2011-2012 2 / 22

erale Presentation gen

erale Presentation gen


Loutil yacc/bison yacc/bison tout seul ne permet pas decrire un compilateur, il faut ` laide de (f)lex par exemple) ainsi rajouter une analyse lexicale (a que des actions semantiques pour lanalyse semantique et la eration gen de code. yacc/bison construit une table danalyse LALR qui permet de faire une analyse ascendante :
` decalages-r il utilise donc le modele eductions .

Yousra Bendaly Hlaoui (ISITCOM)

Loutil yacc/bison

2011-2012

3 / 22

erale Presentation gen

erale Presentation gen


Loutil yacc/bison yacc/bison tout seul ne permet pas decrire un compilateur, il faut ` laide de (f)lex par exemple) ainsi rajouter une analyse lexicale (a que des actions semantiques pour lanalyse semantique et la eration gen de code. yacc/bison construit une table danalyse LALR qui permet de faire une analyse ascendante :
` decalages-r il utilise donc le modele eductions .

Spcifications bison <nom>.y

Compilateur bison bison <nom>.y <nom>.tab.c

Compilateur C gcc <nom>.tab.c -ly a.out

Yousra Bendaly Hlaoui (ISITCOM)

Loutil yacc/bison

2011-2012

3 / 22

Structure du chier de specication bison

Structure dun chier Lex

Specication Lex %{ d eclaration (en C) de variables, constantes, inclusions de fichiers,... %} d eclaration des unit es lexicales utilis ees d eclaration de priorit es et de types %% r` egles de production et actions s emantiques %% routines C et bloc principal

Yousra Bendaly Hlaoui (ISITCOM)

Loutil yacc/bison

2011-2012

4 / 22

Structure du chier de specication bison

Structure dun chier Lex


Specication Lex Les symboles terminaux utilisables dans la description du langage sont :
lexicales que lon doit imperativement des unites declarer par %token
Exemple %token MC_sinon. %token NOMBRE

` des caracteres entre quotes. Par exemple : + a ` des cha nes de caracteres entre guillemets. Par exemple : "+=", "while"

` Les symboles non-terminaux sont les caracteres ou les cha nes ` comme unites lexicales. de caracteres non declar ees yacc/bison fait la difference entre majuscules et minuscules. SI et si ne designent pas le meme objet.
Yousra Bendaly Hlaoui (ISITCOM) Loutil yacc/bison 2011-2012 5 / 22

Structure du chier de specication bison

Structure dun chier Lex


Specication Lex ` Les regles de production sont des suites dinstructions de la forme :
non-terminal : | . | ; prod1 prod2 . . prodn

ees dans Les actions semantiques sont des instructions en C inser ` ees chaque fois quil y a les regles de production. Elles sont execut reduction par la production associee.
G : S B X {printf("mot reconnu");} ; S : A {printf("reduction par A");} T {printf ("reduction par T");} a ;
Yousra Bendaly Hlaoui (ISITCOM) Loutil yacc/bison 2011-2012 6 / 22

Structure du chier de specication bison

Structure dun chier Lex


Specication Lex La section du bloc principal doit contenir une fonction yylex() effectuant lanalyse lexicale du texte, car lanalyseur syntaxique lappelle chaque fois quil a besoin du terminal suivant. On peut
soit ecrire cette fonction soit utiliser la fonction produite par un compilateur (f)lex applique ` un chier de specication a (f)lex nom.l. dans ce cas il faut :
utiliser le compilateur bison du nom.y avec loption -d qui produit un chier nom.tab.h contenant les denitions ( sous forme de lexicales (les tokens) rencontrees et du type define) des unites YYTYPE sil est redeni inclure le nom.tab.h au debut du chier de specications (f)lex un .o a ` partir du lex.yy.c produit par (f)lex creer lors de la compilation C du chier nom.tab.c, il faut faire le lien avec ` ce .o et rajouter la bibliotheque(f)lex en executant : gcc nom.tab.c lex.yy.o -ly -lfl
Yousra Bendaly Hlaoui (ISITCOM) Loutil yacc/bison 2011-2012 7 / 22

Structure du chier de specication bison

Exemple de chier .y
Exemple : reconna t les mots qui ont un nombre paire de a et de b
%% mot : PI $ {printf("mot accepte\n");YYACCEPT;} ; /* le mot doit se terminer par le symbole $*/ PP : a IP | b PI | /* vide */ ; IP : a PP | b II | a ; PI : a II | b PP | b ; II : a PI | b IP | a b | b a ; %% /* On ne fait pas appel ` a la fonction yylex g en er ee par le compilateur (f)lex $*/ int yylex() { char car=getchar(); if ((car==a) || (car==b) || (car==$)) return(car); else printf("ERREUR : caractere non reconnu : %c \n",car); } Yousra Bendaly Hlaoui (ISITCOM) Loutil yacc/bison 2011-2012 8 / 22

Attributs

Attributs
une valeur (de A chaque symbole (terminal ou non) est associe type entier par defaut).
dans les actions semantiques Cette valeur peut etre utilisee e ). (comme un attribut synthetis

erence au Le symbole $$ ref la valeur de lattribut associe erence non-terminal de la partie gauche, tandis que $i ref la valeur au i-eme ` associee symbole (terminal ou non-terminal) ou action semantique de la partie droite.
Exemple
expr : expr + expr { tmp=$1+$3;} + expr { $$=tmp+$6;};}

yacc/bison gen ere ` Par defaut, lorsquaucune action nest indiquee, laction {$$ = $1; }

Yousra Bendaly Hlaoui (ISITCOM)

Loutil yacc/bison

2011-2012

9 / 22

Communication avec lanalyseur lexical : yylval

Communication avec lanalyseur lexical : yylval


Lanalyseur syntaxique et lanalyseur lexical peuvent communiquer entre eux par lintermediaire de la variable int yylval. Dans une action lexicale (donc dans le chier (f)lex par exemple), ` lanalyseur linstruction return(unit e) permet de renvoyer a lexicale unite. La valeur de cette unite lexicale syntaxique lunite dans yylval. est rangee Lanalyseur syntaxique prendra automatiquement le contenu de a ` cette unite lexicale. yylval comme valeur de lattribut associe dans la La variable yylval est de type YYSTYPE (declar e ` bibliotheque yacc/bison) qui est un int par defaut. On peut changer ce type par un # define YYSTYPE autre type C

Yousra Bendaly Hlaoui (ISITCOM)

Loutil yacc/bison

2011-2012

10 / 22

Communication avec lanalyseur lexical : yylval

Communication avec lanalyseur lexical : yylval


Ou encore par %union { champs dune union C } qui declarera automatiquement YYSTYPE comme etant une telle union.
Exemple
%union { int entier; double reel; char * chaine; }

` la fois des int, des double et permet de stocker dans yylval a des char .

Lanalyseur lexical pourra par exemple contenir :


{nombre} { yylval.entier=atoi(yytext); return NOMBRE; }

Yousra Bendaly Hlaoui (ISITCOM)

Loutil yacc/bison

2011-2012

11 / 22

Communication avec lanalyseur lexical : yylval

Communication avec lanalyseur lexical : yylval


` e en utilisant les noms Le type des lexemes doit alors etre precis des champs de lunion %token <entier> NOMBRE %token <chaine> IDENT CHAINE COMMENT On peut egalement typer des non-terminaux (pour pouvoir ` un non-terminal) par : associer une valeur de type autre que int a %type <entier> S %type <chaine> expr

Yousra Bendaly Hlaoui (ISITCOM)

Loutil yacc/bison

2011-2012

12 / 22

enies Variables, fonctions et actions pred

enies Variables, fonctions et actions pred


yyparse() : appel de lanalyseur syntaxique. YYACCEPT : instruction qui permet de stopper lanalyseur ` ). syntaxique. Dans ce cas, yyparse retourne la valeur 0 (succes YYABORT : instruction qui permet egalementb de stopper lanalyseur , mais yyparse retourne 1, ce qui peut etre utilise pour signier lechec de lanalyseur. main() : le main par defaut se contente dappeler yyparse(). Lutilisateur peut ecrire son propre main() dans la partie du bloc principal. %start non-terminal : action pour signier quel non-terminal est ` laxiome. Par defaut, cest le premier decrit dans les regles de production.

Yousra Bendaly Hlaoui (ISITCOM)

Loutil yacc/bison

2011-2012

13 / 22

Conits shift-reduce et reduce-reduce

Conits shift-reduce(decalage-r eduction) et reduce-reduce (reduction/reduction)


a ` des conits, il rend compte du Lorsque lanalyseur est confronte : type et du nombre de conits rencontres >bison exemple.y conflicts: 6 shift/reduce, 2reduce/reduce Il y a un conit reduce/reduce lorsque le compilateur a le choix entre (au moins) deux productions pour reduire une cha ne. Les conits shift/reduce apparaissent lorsque le compilateur le compilateur a le choix entre
reduire par une production et decaler le pointeur sur la cha ne dentree.

Yousra Bendaly Hlaoui (ISITCOM)

Loutil yacc/bison

2011-2012

14 / 22

Conits shift-reduce et reduce-reduce

Conits shift-reduce(decalage-r eduction) et reduce-reduce (reduction/reduction)


` suivante : yacc/bison resoud les conits de la maniere
conit reduce/reduce : la production choisie est celle apparaissant en premier dans la specication conit shift/reduce : cest le shift qui est effectue

Pour voir comment bison a resolu les conits, il est necessaire de consulter la table danalyse quil a construit :
il faut compiler avec loption -v. le chier contenant la table sappelle nom.output

Yousra Bendaly Hlaoui (ISITCOM)

Loutil yacc/bison

2011-2012

15 / 22

Conits shift-reduce et reduce-reduce

et priorite des symboles terminaux Associativite

et priorite des symboles terminaux Associativite


On peut essayer de resoudre soi-meme les conits en donnant (droite ou gauche) et des priorites aux des associativites symboles terminaux. Les declarations suivantes (dans la section des denitions) : %left term1 term2 %right term3 %left term4 %nonassoc term5 indiquent que les symboles terminaux term1, term2 et term4 sont ` gauche, term3 est associatif a ` droite, alors que term5 associatifs a nest pas associatif. Exemples :
1

` gauche, a+b+c sera evalu Pour un operateur "+" associatif a e comme (a+b)+c. a ` droite, a*b*c est evalu comme a*(b*c). Pour lassociativite e
Loutil yacc/bison 2011-2012 16 / 22

Yousra Bendaly Hlaoui (ISITCOM)

Conits shift-reduce et reduce-reduce

et priorite des symboles terminaux Associativite

et priorite des symboles terminaux Associativite


des symboles sont donnees par lordre dans lequel Les priorites les premiers ayant la plus appara t leur declaration dassociativite, Lorsque les symboles sont dans la meme faible priorite. ils ont la meme declaration dassociativite, priorite. (ainsi que lassociativite) dune production est denie La priorite ` droite. comme etant celle de son terminal le plus a Un conit shift/reduce, i.e. un choix entre une reduction A et un a, est alors resolu decalage dun symbole dentree en appliquant ` les regles suivantes :
de la production A est superieure ` celle de a, cest la si la priorite a reduction qui est effectuee, sont les memes ` si les priorites et si la production est associative a gauche, cest la reduction qui est effectuee, dans les autres cas, cest le shift qui est effectue.

Yousra Bendaly Hlaoui (ISITCOM)

Loutil yacc/bison

2011-2012

17 / 22

Recup eration des erreurs

Recup eration des erreurs


Lorsque lanalyseur produit par bison rencontre une erreur, il appelle par defaut la fonction yyerror(char *) qui se contente Cette fonction dafcher le message parse error, puis il sarrete. peut etre redenie par lutilisateur. ` plus explicite les erreurs en Il est possible de traiter de maniere bison error. utilisant le mot cle On peut rajouter dans toute production de la forme A 1 |2 | . . . une production
A error

comme une Dans ce cas, une production derreur sera traitee production classique. On pourra donc lui associer une action semantique contenant un message derreur. ` quune erreur est rencontree, tous les caracteres ` Des sont avales ` rencontrer le caractere ` correspondant a `. jusqua
Yousra Bendaly Hlaoui (ISITCOM) Loutil yacc/bison 2011-2012 18 / 22

Recup eration des erreurs

Recup eration des erreurs


Exemple ` lanalyseur qua ` la vue dune La production instr error; indique a ` du prochain ";" et supposer erreur, il doit sauter jusquau dela quune instr vient detre reconnue. La routine yyerrok replace lanalyseur dans le mode normal de ` dire que lanalyse syntaxique nest pas fonctionnement cest a interrompue.
de la production A est superieure ` celle de a, cest la si la priorite a reduction qui est effectuee, sont les memes ` si les priorites et si la production est associative a gauche, cest la reduction qui est effectuee, dans les autres cas, cest le shift qui est effectue.

Yousra Bendaly Hlaoui (ISITCOM)

Loutil yacc/bison

2011-2012

19 / 22

Exemples dun chier .y

Exemple de chier .y
ex1.y
%% mot : PI $ {printf("mot accepte\n");YYACCEPT;} ; /* le mot doit se terminer par le symbole $*/ PP : a IP | b PI | /* vide */ ; IP : a PP | b II | a ; PI : a II | b PP | b ; II : a PI | b IP | a b | b a ; %% /* On ne fait pas appel ` a la fonction yylex g en er ee par le compilateur (f)lex $*/ int yylex() { char car=getchar(); if ((car==a) || (car==b) || (car==$)) return(car); else printf("ERREUR : caractere non reconnu : %c \n",car); } Yousra Bendaly Hlaoui (ISITCOM) Loutil yacc/bison 2011-2012 20 / 22

Exemples dun chier .y

Exemple de chier .y
Compilation de lexemple 1 Compilation :
bison -d -o ex1.c ex1.y gcc -Wall -c ex1.c gcc -Wall -o ex1 ex1.o

Utilisation :
Abcbbcbhhbcaababa$

Yousra Bendaly Hlaoui (ISITCOM)

Loutil yacc/bison

2011-2012

21 / 22

Exemples dun chier .y

Exemple de chier .y
Exemple 2 ` ed ees soit du Ce deuxieme exemple lit des listes dentiers prec mot " somme ", soit du mot " produit ". dentiers separ par des Une liste dentiers est composee es virgules et se termine par un point.
Lorsque la liste debute par somme, lexecutable doit afcher la somme des entiers, Lorsquelle debute par produit, il doit en afcher le produit.

doit se terminer par $. item Cet exemple Le chier en entree er ee par le compilateur (f)lex a ` utilise la fonction yylex gen partir du chier de specication ex2.l

Yousra Bendaly Hlaoui (ISITCOM)

Loutil yacc/bison

2011-2012

22 / 22

Exemples dun chier .y

Exemple de chier .y
ex2.l
%option noyywrap %{ #include <stdlib.h> #include "ex2.h" int nbligne=0; %} chiffre [0-9] entier {chiffre}+ espace [ \t] %% somme return(SOMME); produit return(PRODUIT); \n nbligne++; [.,] return(yytext[0]); {entier} { yylval=atoi(yytext); return(NOMBRE); } {espace}+ /* rien */; "$" return(FIN); . printf("ERREUR ligne %d : %c inconnu\n",nbligne,yytext[0]); %%

Yousra Bendaly Hlaoui (ISITCOM)

Loutil yacc/bison

2011-2012

23 / 22

Exemples dun chier .y

Exemple de chier .y
Le chier de specications Bison est alors le suivant :
%token SOMME %token PRODUIT %token NOMBRE %token FIN %% texte : liste texte | FIN {printf("Merci et a bientot\n");YYACCEPT;} ; liste : SOMME sentiers . {printf("la somme est %d\n",$2);} | PRODUIT pentiers . {printf("le produit est %d\n",$2);} ; sentiers : sentiers , NOMBRE {$$=$1+$3;} | NOMBRE {$$=$1;} ; pentiers : pentiers , NOMBRE {$$=$1*$3;} | NOMBRE {$$=$1;} ; %% main() { yyparse(); } yyerror(char *s) { printf("<%s!!>",s); }

Yousra Bendaly Hlaoui (ISITCOM)

Loutil yacc/bison

2011-2012

24 / 22

Exemples dun chier .y

Exemple de chier .y
Compilation de lexemple 2 Compilation :
bison -d -o ex2 bison.c ex2.y flex exemple2.lex gcc -Wall -c lex.yy.c gcc -Wall -c ex2 bison.c gcc -Wall -o ex2 lex.yy.o ex2 bison.o

Yousra Bendaly Hlaoui (ISITCOM)

Loutil yacc/bison

2011-2012

25 / 22

También podría gustarte