Vous êtes sur la page 1sur 8

Maitrise Informatique Lyon-1 Compilation

T dCompilation Sujet 2007-2008

1
1.1

Analyse lexicale
Flex

Le but de lanalyse lexicale est de transformer une suite de symboles en terminaux (un terminal peut tre par exemple un nombre, un signe +, un identicateur, etc...). Une fois cette transformation effectue, la main est repasse lanalyseur syntaxique (voir ci-dessous). Le but de lanalyseur lexical est donc de consommer des symboles et de les fournir lanalyseur syntaxique. Un chier de description pour Lex est form de trois parties, selon le schma suivant : declarations %% dfinition des symboles %% code additionnel dans lequel aucune partie nest obligatoire. Cependant, le premier %% lest, an dindiquer la sparation entre les dclarations et les productions.

1.1.1

les dclarations

Cette partie dun chier Lex peut contenir : Du code crit dans le langage cible, encadr par %{ et %}, qui se retrouvera au dbut du chier synthtis par Lex. Cest ici que lon va spcier les chiers inclure. Lex recopie tel quel tout ce qui est crit entre ces deux signes, qui devront toujours tre placs en dbut de ligne. Des expressions rgulires dnissant des notions non terminales, telles que lettre, chiffre et nombre. Ces spcications sont de la forme : notion expression_reguliere Les notions ainsi dnies pourront alors tre utilises dans la suite de la premire partie du chier, ainsi que dans la deuxime partie, en les parenthsant par et . Exemple : blancs lettre chiffre10 chiffre16 entier10 [\t\n ]+ [A-Za-z] [0-9] /* base 10 */ [0-9A-Fa-f] /* base 16 */ {chiffre10}+

1.1.2

Les expressions rgulires Symbole x . [xyz] [bz] [a z] [a z] R R+ R? R{2, 5} R{2, } R{2} [xyz\f oo {N OT ION } \X \0 \123 \x2A RS R&S R/S
R

R$ << EOF >> 1.1.3

Signication Le caractere x Nimporte quel caractere sauf le retour la ligne Soit x, soit y, soit z Tous les caracteres, SAUF b et z Nimporte quel caractere entre a et z Tous les caracteres, SAUF ceux compris entre a et z Zero R ou plus, ou R est nimporte quelle expression reguliere Un R ou plus Zero ou un R (cest-a-dire un R optionnel) Entre deux et cinq R Deux R ou plus Exactement deux R La chaine [xyz\f oo Lexpansion de la notion NOTION denie plus haut Si X est un a, b, f, n, r, t. Caractere ASCII 0 Caractere ASCII dont le numero est 123 EN OCTAL Caractere ASCII en hexadecimal R suivi de S R ou S R, seulement sil est suivi par S R, mais seulement en debut de ligne R, mais seulement en n de ligne Fin de chier

les dnitions des symboles

Cette partie sert indiquer Lex ce quil devra faire lorsquil rencontrera tel ou tel symbole. Celle-ci peut contenir : Des spcications crites dans le langage cible, encadres par %{ et %} (toujours placs en dbut de ligne), qui seront places au dbut de la fonction yylex(), la fonction charge de consommer les terminaux, et qui renvoit un entier. Des productions de la forme : expression_reguliere action Si action est absente, Lex recopiera les caractres tels quels sur la sortie standard. Si action est prsente, elle sera crite en du code du langage cible. Si celle-ci comporte plus dune seule instruction ou ne peut tenir sur une seule ligne, elle devra tre parenthse par et . Il faut de plus savoir que les commentaires tels que /* ... */ ne peuvent tre prsents dans la deuxime partie dun chier Lex que sil sont placs dans les actions parenthses. Dans le cas contraire, ceux-ci seraient considrs par Lex comme des expressions rgulires ou des actions, ce qui donnerait lieu des messages derreur, ou, au mieux, un comportement inattendu. Enn, la variable yytext dsigne dans les actions les caractres accepts par expression_rgulire. Il sagit dun tableau de caractre de longueur yyleng (donc dni comme char yytext[yyleng]). Exemple : %% [ \t]+$ ; [ \t] printf(" ");

%% Ce programme supprime tous les espaces inutiles dans un chier. Tu auras dailleurs not que Lex permet de faire normment de choses, et pas seulement des interprteurs et des compilateurs (Il peut par exemple servir la recherche/remplacement dans un texte, etc...). 1.1.4 Le code additionnel

Cette section du chier ex contient les implmentations C des fonctions ncessaires. main() { yylex(); } 1.1.5 La compilation

La gnration de lexcutable se fera laide des commandes suivantes : flex -olexer.c lexer.l gcc -o lexer.o -c lexer.c gcc -o main lexer.o -lfl

1.2

Exercices
Ecrire lexpression rgulire dnissant les identicateurs (lettres, chiffres et _, ne commenant ni par un chiffre ni par _) identificateur {lettre}(_|{lettre}|{chiffre10})* reconnaitra comme identicateur les mots integer, une_variable, a1, mais pas _ident ni 1variable. Ecrire la dnition dun rel (partie entire et ottante obligatoire, signe optionnel, sans exposant) chiffre [0-9] entier {chiffre}+ reel -?{entier}"."{entier} Ecrire la dnition dun rel (partie entire obligatoire, partie ottante optionnelle, signe optionnel, avec/sans exposant) chiffre [0-9] entier {chiffre}+ exposant [eE][+-]?{entier} reel -?{entier}("."{entier})?{exposant}?

2
2.1
2.1.1

Analyse syntaxique
Bison
Principe de fonctionnement

Loutil bison permet de gnrer des analyseurs syntaxiques. Un chier dentre dcrit la grammaire analyser ainsi que les attributs et actions smantiques associs. Un chier .c est gnr partir de cette description, celui-ci contient la mise en oeuvre de lautomate pile pour une analyse ascendante (voir gure 1). Lappel de lanalyseur se fait par le biais de la fonction int yyparse () cre par bison.

fichier .c

description de la grammaire

Bison

fichier .h

F IG . 1 principe de fonctionnement de bison

2.1.2

Les chiers de description

Les chiers de description de grammaire pour bison ont un formalisme similaire ceux de flex (voir gure 2).

} } }

Dfinitions

%% Rgles de production

%% Code C/C++

F IG . 2 chier de description de bison

2.1.3

Les dnitions

La section de dnition permet de dcrire certaines parties de la grammaire (ensemble des symboles terminaux, axiomes, attributs smantiques...). Il est possible dy inclure du code C en lencadrant avec %{ et %}. Le mot-cl %start permet de dnir laxiome de la grammaire. Le mot-cl %token permet de dnir les lments du vocabulaire terminal. Les mot-cls %left,%right et %nonassoc permettent de dnir la priorit (ordre de spcication des lments) et lassociativit des oprateurs. 2.1.4 Les rgles de production

Les rgles de production sont donnes sous la forme Symble : Rgle (voir gure 3). Le symbole : permet de sparer les parties gauche et droite de la rgle. Le ; permet de terminer une rgle. Dans le cas o un symbole accpte plusieurs drivations possibles, on utilisera le formalisme le caractre | pour diffrencier les rgles.
%% A : a b c ... z ; %% %% A:abc |def ; %%

F IG . 3 description de rgles pour bison

2.1.5

Le code C

La dernire section du chier de description contient du code C (fonctions, variables globales...).

2.1.6

Exemple

Soit la grammaire G-2.a des expressions arithmtiques (addition et multiplication) entires.


Grammaire G-2.a = < VN = { E } , VT = { cste + } , E, E E+E P = >

EE

cste

Cette grammaire sera dcrite sous la forme dcrite dans la gure 4.


%start E %token + %token * %token cste %% E : E + E | E * E | cste ; %% int main ( int argc, char** argv ) { yyparse (); }

F IG . 4 description de rgles pour bison

2.2

Lien entre lanalyseur syntaxique et un analyseur lexical

Lanalyseur syntaxique fait appel lanalyseur lexical pour connatre le prochain symbole dans la chaine analyser. Pour bison lappel lanalyseur lexical se fait par le biais de la fonction int yylex (). Dans la majeure partie des cas, cet analyseur lexical sera gnr laire de flex (voir gure 5).
parser .c yyparse () description de la grammaire gcc parser.o

Bison executable

gcc parser .h

gcc

lexer.o

description des symboles

lexer .c Flex yylex ()

F IG . 5 principe de fonctionnement de bison et flex

La gnration de lexcutable se fera laide des commandes suivantes : flex -olexer.c lexer.l bison -d -o parser.c parser.y gcc -o parser.o -c parser.c gcc -o lexer.o -c lexer.c gcc -o main parser.o lexer.o -lfl Loption -d de bison permet de dire ce dernier de gnrer un chier .h contenant la dnition des constantes associes aux diffrents symboles terminaux de la grammaire. Ce chier est include

dans le chier lexer.l pour que lanalyseur lexical puisse renvoyer la valeur de ces constantes en rsultat. Dans les actions de lanalyseur lexical, on aura un return symbole o symbole est lune des valeurs dnies dans les %token. 2.2.1 Exemple

Soit le langage dcrit par an bn . Malgr le fait que ce langage soit dcrit par une expression rgulire, il est difcile de le reconnatre en nutilisant que loutil flex. 2.2.2 Version simple

Pour simplier, nous le dcrivons laide de la grammaire hors-contexte G-2.b.


Grammaire G-2.b = < VN = { E } , VT = { a b } , E, E P = >

aEb

ab

Dans ce cas, lanalyseur sera gnr laide des chiers de description suivants de la gure 6.
lexer.l
%{ #include "parser.h" int yyerror (char*); %} %% a return TOKEN_A; b return TOKEN_B; (.|\n) yyerror ( "symbole non reconnu" ); %% int yyerror ( char* m ) { printf ( "%s\n", m ); return 1; }

parser.y
%token TOKEN_A %token TOKEN_B %start E %% E : TOKEN_A E TOKEN_B | TOKEN_A TOKEN_B ; %% int main ( int argc, char** argv ) { yyparse (); }

F IG . 6 analyseur du langage an bn

En utilisant cette mise en oeuvre de la grammaire, lanalyse dune chaine se fait directement. En n danalyse, on est sur que le nombre de a est gal au nombre de b. 2.2.3 Version avec actions

Dans cette deuxime version, nous allons mettre en place une grammaire reconnaissant le langage a+ b+ : la grammaire G-2.c. Les actions permettront de restreindre le champs dapplication de la grammaire au langage an bn .

On dni alors 2 variables globales nba et nbb qui permettront de comptabiliser le nombre de a et de b rencontrs au cours de lanalyse. Les actions sont dcrites ainsi : Dans ce cas, lanalyseur sera gnr laide des chiers de description de la gure 7.

Grammaire G-2.c = < VN = { E A B } , VT = { a b } , E, E AB A Aa P = B Bb >

| |

a b

A B E

Aa a Bb b AB

nba + +; nba + +; nbb + +; nbb + +; si nba <> nbb alors erreur;

lexer.l
%{ #include "parser.h" int yyerror (char*); %} %% a return TOKEN_A; b return TOKEN_B; (.|\n) yyerror ( "symbole non reconnu" ); %% int yyerror ( char* m ) { printf ( "%s\n", m ); return 1; } %{

parser.y
int nba, nbb; %} %token TOKEN_A %token TOKEN_B %start E %% E : A B { if ( nba != nbb ) yyerror ( "erreur" ); ; A : A TOKEN_A { nba ++; } | TOKEN_A { nba ++; } ; B : B TOKEN_B { nbb ++; } | TOKEN_B { nbb ++; } ; %% int main ( int argc, char** argv ) { nba = nbb = 0; yyparse (); }

F IG . 7 analyseur du langage an bn

2.3

Exercices

Considrons la grammaire G-2.d dcrivant les expressions arithmtiques entires.


Grammaire G-2.d = < VN = { E } , VT = { cste ( ) + / } , E, E E+E E+E P = >

E+E

E+E

(E)

cste

La mise en oeuvre de cette grammaire est dcrite dans la gure 8. Cette mise en oeuvre pose un certain nombre de problmes avec bison (des conits sur la rsolution de lautomate pile).

lexer.l
%{ #include "parser.h" %} %% "+" return ADD; "-" return SUB; "*" return MUL; "/" return DIV; [0-9]+ return CSTE; "(" return POUV; ")" return PFER; \n [ \t] . yyerror ( "symbole non reconnu" ); %%

parser.y
%token ADD %token SUB %token MUL %token DIV %token POUV %token PFER %token CSTE %start E %% E : E ADD E | E SUB E | E MUL E | E DIV E | POUV E PFER | CSTE ; %% int main ( int argc, char** argv ) { yyparse (); }

F IG . 8 analyseur dexpressions

An de rsoudre ces problmes sans modier la grammaire nous allons utiliser les mots-cl : 1. %left qui permet de spcier un oprateur associatif gauche 2. %right qui permet de spcier un oprateur associatif droite 3. %nonassoc qui permet de spcier un oprateur non associatif Ces mot-cl seront utiliss suivant lordre de priorit des oprateurs : du moins prioritaire au plus prioritaire (voir gure 9).
lexer.l
%{ #include "parser.h" %} %% "+" return ADD; "-" return SUB; "*" return MUL; "/" return DIV; [0-9]+ return CSTE; "(" return POUV; ")" return PFER; \n [ \t] . yyerror ( "symbole non reconnu" ); %% %token %token %token %token %token %token ADD SUB MUL DIV POUV PFER

parser.y
%% E : | | | | | ; E ADD E E SUB E E MUL E E DIV E POUV E PFER CSTE

%token CSTE %start E %left ADD SUB %left MUL DIV

%% int main ( int argc, char** argv ) { yyparse (); }

F IG . 9 analyseur dexpressions

Vous aimerez peut-être aussi