Sunteți pe pagina 1din 4

Introduction

Quest ce quun compilateur ? Uncompilateur est un programme de traduction automatique dun programme ecrit dans un langage source en un programme ecrit dans un langage cible Le fichier resultant de cette compilation est directement executabe une fois pour un exemple de langage compile Pascal ou FreePascal . Notre TP consiste a crit un compilateur qui permet de calculer les expressions boolens et les expressions arithmtiques, le TP est consiste de deux fichiers : lex et yacc I. Le fichier lex (exprlex.l) : Structur comme suit : %{ Declaration en pascal de variables, constantes, %} Declaration de definitions regulieres %% Rgles de traduction %% Bloc principal et fonctions auxiliaires. Les deux parties importantes dans le fichier lex (exprlex.l) sont : 1-Partie dfinition (optionnel) : pour la dclaration et les abrviations pour les expressions rgulires . L1 [A-Z] pour la dfinition des lettres majuscules pour 1er identificateur. L2 [a-z ] pour la dfinition des lettres minuscules pour 2me identificateur. D [0-9] pour la dfinition des chiffres (digit). 2 Partie units lexicales : Dfinition de lexpression rgulire : {D}+(\.{D}+) ?([Ee][+ -] ?{D}+) ? : Est une expression rgulire .qui retourne un numro si le rsultat est gale zro sinon retourne illgal. Dfinition des oprations boolenes : FAUX : est un terminal qui reprsente en free pascal false et le type de retour de cet jeton est boolen VRAI : est un terminal qui reprsente en free pascal true et le type de retour de cet jeton est aussi boolen Et : reprsente le jeton (ET : conjonction) Ou : reprsente le jeton (OU : disjonction) Non : reprsente le jeton (NEG : ngation) Lexpression yylval veut dire lavaleur associ au jeton(token) {L1} : dfinit 1er identificateur dans le cas de lexpression boolen Up case : donne la lettre en majuscule. Yytext[1] : donne la lettre . Ord : donne lordre de la lettre entre A-Z. . / : na pas de caractre 1

\n : retourne la valeur par le bouton entrer qui reprsente par lexpression Yytext[1]

II. Le ficher yacc (expr.y) : Structur comme suit : %{ Declaration en pascal de variables,constantes,inclusions de fichiers, . %} Declarations des units lexicales utilises Declarations de priorits et de types %% Regles de production et actions smantiques %% Routines et bloc principal. Les parties importantes de le fichier yacc (expr.y) : 1-Partie dclaration : Uses ycc lib, lex lib , sys utils : reprsente les bibliothques utilis par lex et yacc. var X : array[1-26] of real : reprsente un tableau pour ne perdre pas les valeurs de lidentificateur dans le cas de lexpression arithmtique. var Y : array[1-26] of boolen : reprsente un tableau pour ne perdre pas les valeurs de lidentificateur dans le cas de lexpression boolen. type att : record val : real bo : boolean end. type denregistrement de la valeur relle (val) de lexpression arithmtique et boolen pour lexpression boolen . 2-Partie de definition des jetons (les units lexical) : Token <real> num pour les numros de type rel. Token<integer> id,id2 pour les variable ou les identificateurs des expressions arithmtiques et boolans . Token ET ,OU : jetons de lexpression boolan qui donne lanalyse lexical. Type <att>( aexpr,bexp) : type de retour de lexpression arithmtique et boolen. Left + - : represente la priorit gauche de loperation+ par rapport loperation-. Left * / : represente la priorit gauche de loperation* par rapport loperation/. Left ET OU : represente la priorit gauche de loperation ET par rapport loperation OU. Right NEG : represente la priorit droite de loperation negation. Right uminus : represente la priorit droite de loperation uminus. 3-Partie daffichage : Input : represente les non-terminals qui donnent le resultat final de lexprssion arithmtique ou lxpression boolan. Input \n {yyaccept} donne le resultat si en clic sur le boutton entrer . Input aexp \n {writeln ($2.val) :10 :2} donne le resultat final de lexpression arithmtique. Input bexp \n {writeln ($2.bo) } donne le resultat final de lexpression boolen. Input id2 = aexp \n{ x[$2] :=($4.val) writeln ($4.val) : 10 :2)} donne le rsultat de lexpression arithmtique si les donnes sont en relation avec lidentificateur. X[$2] le tableau qui garde les valeurs (mme explication pour les exprission boolen). 2

Error \n represente en smentique yyerrek , c--dire il y a une erreur. 4-Partie de rgles smentiques : A : grammaire de lexpression arithmtique Aexp : aexp+ aexp{$$.val :=($1.val) +($3.val) ;} : en smentique : $$.val : represente le non-terminal de lexpression arithmtique. $1.val : represente le non-terminal en 1ere place. $3.val : represente le non-terminal en 3me place. (mme explication pour les opration / , * et -). Aexp : (aexp) {$$.val :=$2.val} cest une rgle smentique qui represente une seule expression arithmtique. Aexp :- aexp {$$.val :=-($2.val)} represente lexpression ngative. Prec uminus : represente la prioritaire d uminus par rapport toute les oprations arithmtique. id2 {$$.val :=x[1]}cette rgle represente lidentificateur qui donne la valeur qui se trouve dans le tableau X. Aexp : num {$$.val :=($1)} rgle smentique qui reprsente lexpression qui peut etre un numro. b-lexperssion boolen. bexp : bexp ET bexp {$$.bo:=($1.bo) and($3.bo)}. $$.bo : represente le non-terminal de lexpression boolen. $1.bo : represente le non-terminal en 1er place. $3.bo : represente le non-terminal en 3 me place. And : represente lopration de conjonction qui reli deux rgles smentiques. (mme explication pour loperation OU) bexp : (bexp) {$$.bo :=$2.bo} cest une rgle smentique qui represente un seul expression boolan. bexp : NEG bexp {$$.bo :=NOT($2.bo)} represente lexpression ngative. Prec NEG : represente la prioritaire de la negation par rapprt toute les opration boolens. Bexp : vrai(faux) {$$.bo :=$1} rgle smentique qui represente une seule valeur logique vrai ou faux. Bexp : id { $$.bo :=y[$1]} cette rgle represente lidentificateur qui donne la valeur qui se trouve dans le tableau Y. III.

Comment executer notre compilateur :

On cre un nouveau dossier sur le rpertoire C:\ et on le nomme (par exemple : compilation) puis on met les deux fichiers (exprlex.l et expr.y) dans un ce nouveau dossier (compilation) , ensuite on execute les oprations suivantes sur linvite de commande : cd.. cd.. cd compilation c:\compilation> plex exprlex.l : qui donne exprlex.pas c:\compilation> pyacc expr.y : qui donne expr.pas c:\compilation> fpc expr.pas : qui donne expr.exe

Microsoft Windows [version 6.1.7600] Copyright (c) 2009 Microsoft Corporation. Tous droits rservs. C:\Users\USER>cd.. C:\Users>cd.. C:\>cd compilation C:\compilation>plex exprlex TP Lex Version 4.1a [April 2000], Copyright (c) 1990-2000 Albert Graef parse ... DFA construction ... code generation ... DONE 44 lines, 11 rules, 48/1200 p, 29/600 s, 45/1200 t. C:\compilation>pyacc expr TP Yacc Version 4.1a [April 2000], Copyright (c) 1990-2000 Albert Graef parse ... sort ... closures ... first sets ... LR0 set ... lookaheads ... code generation ... DONE 82 lines, 22/900 rules, 45/800 s, 194/9600 i, 142/9600 t, 25/1200 r. C:\compilation>fpc expr Free Pascal Compiler version 2.2.4 [2009/04/10] for i386 Copyright (c) 1993-2008 by Florian Klaempfl Target OS: Win32 for i386 Compiling expr.pas Linking expr.exe 1341 lines compiled, 0.4 sec , 60048 bytes code, 14136 bytes data

S-ar putea să vă placă și