Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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
Loutil yacc/bison
2011-2012
3 / 22
Loutil yacc/bison
2011-2012
3 / 22
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
Loutil yacc/bison
2011-2012
4 / 22
` 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
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
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; }
Loutil yacc/bison
2011-2012
9 / 22
Loutil yacc/bison
2011-2012
10 / 22
` la fois des int, des double et permet de stocker dans yylval a des char .
Loutil yacc/bison
2011-2012
11 / 22
Loutil yacc/bison
2011-2012
12 / 22
Loutil yacc/bison
2011-2012
13 / 22
Loutil yacc/bison
2011-2012
14 / 22
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
Loutil yacc/bison
2011-2012
15 / 22
` 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
Loutil yacc/bison
2011-2012
17 / 22
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
Loutil yacc/bison
2011-2012
19 / 22
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
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$
Loutil yacc/bison
2011-2012
21 / 22
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
Loutil yacc/bison
2011-2012
22 / 22
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]); %%
Loutil yacc/bison
2011-2012
23 / 22
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); }
Loutil yacc/bison
2011-2012
24 / 22
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
Loutil yacc/bison
2011-2012
25 / 22