You are on page 1of 4

Introduction

Qu’est ce qu’un compilateur ? Uncompilateur est un programme de traduction automatique d’un 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 booléens et les expressions arithmétiques, 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 %% Règles de traduction %% Bloc principal et fonctions auxiliaires. • Les deux parties importantes dans le fichier lex (exprlex.l) sont : 1-Partie définition (optionnel) : pour la déclaration et les abréviations pour les expressions régulières . L1 [A-Z] pour la définition des lettres majuscules pour 1er identificateur. L2 [a-z ] pour la définition des lettres minuscules pour 2éme identificateur. D [0-9] pour la définition des chiffres (digit). 2 –Partie unités lexicales : Définition de l’expression régulière : {D}+(\.{D}+) ?([Ee][+ -] ?{D}+) ? : Est une expression régulière .qui retourne un numéro si le résultat est égale à zéro sinon retourne illégal. Définition des opérations booléenes : FAUX : est un terminal qui représente en free pascal false et le type de retour de cet jeton est booléen VRAI : est un terminal qui représente en free pascal true et le type de retour de cet jeton est aussi booléen Et : représente le jeton (ET : conjonction) Ou : représente le jeton (OU : disjonction) Non : représente le jeton (NEG : négation) L’expression yylval veut dire lavaleur associé au jeton(token) {L1} : définit 1er identificateur dans le cas de l’expression booléen Up case : donne la lettre en majuscule. Yytext[1] : donne la lettre . Ord : donne l’ordre de la lettre entre A-Z. . / : n’a pas de caractère 1

bo) } donne le resultat final de l’expression booléen. Input aexp ‘\n’ {writeln ($2. type d’enregistrement de la valeur réelle (val) de l’expression arithmétique et booléen pour l’expression booléen .OU : jetons de l’expression booléan qui donne l’analyse lexical. var Y : array[1-26] of booléen : représente un tableau pour ne perdre pas les valeurs de l’identificateur dans le cas de l’expression booléen. Le ficher yacc (expr. Left ‘+’ ‘-’ : represente la priorité à gauche de l’operation’+’ par rapport à l’operation’-’. Right ‘NEG’ : represente la priorité à droite de l’operation negation. 2 . %} Declarations des unités lexicales utilisées Declarations de priorités et de types %% Regles de production et actions sémantiques %% Routines et bloc principal.constantes. Input ‘\n’ {yyaccept} donne le resultat si en clic sur le boutton entrer . Input id2 ‘=’ aexp ‘\n’{ x[$2] :=($4. lex lib .y) : 1-Partie déclaration : Uses ycc lib.y) : • Structuré comme suit : %{ Declaration en pascal de variables. Left ‘ET’ ‘OU ’ : represente la priorité à gauche de l’operation ’ET’ par rapport à l’operation ’OU’.val) : 10 :2)} donne le résultat de l’expression arithmétique si les données sont en relation avec l’identificateur. Token ET . Left ‘*’ ‘/ ’ : represente la priorité à gauche de l’operation’*’ par rapport à l’operation’/’. X[$2] le tableau qui garde les valeurs (méme explication pour les exprission booléen).id2 pour les variable ou les identificateurs des expressions arithmétiques et booléans . • Les parties importantes de le fichier yacc (expr.val) writeln ($4.val) :10 :2} donne le resultat final de l’expression arithmétique.\n : retourne la valeur par le bouton entrer qui représente par l’expression Yytext[1] II. 3-Partie d’affichage : Input : represente les non-terminals qui donnent le resultat final de l’exprssion arithmétique ou l’éxpression booléan. Input bexp ‘\n’ {writeln ($2. sys utils : représente les bibliothèques utilisé par lex et yacc. Right uminus : represente la priorité à droite de l’operation uminus. Type <att>( aexpr. …. var X : array[1-26] of real : représente un tableau pour ne perdre pas les valeurs de l’identificateur dans le cas de l’expression arithmétique. 2-Partie de definition des jetons (les unités lexical) : Token <real> num pour les numéros de type réel.inclusions de fichiers. Token<integer> id. type att : record val : real bo : boolean end.bexp) : type de retour de l’expression arithmétique et booléen.

Bexp : id { $$. III.val)} represente l’expression négative.val :=x[1]}cette régle represente l’identificateur qui donne la valeur qui se trouve dans le tableau X.val : represente le non-terminal en 3éme place.bo) and($3.exe 3 .pas c:\compilation> pyacc expr.bo : represente le non-terminal de l’expression booléen.pas c:\compilation> fpc expr.val :=$2.Error ‘\n’ represente en sémentique yyerrek . Aexp : (‘aexp’) {$$.bo} c’est une régle sémentique qui represente un seul expression booléan.val :=-($2. (méme explication pour les opération ‘/’ .val :=($1. $1.bo)}. Bexp : vrai(faux) {$$.pas : qui donne expr. Aexp :‘-’ aexp {$$.val) +($3. cd compilation c:\compilation> plex exprlex.val : represente le non-terminal de l’expression arithmétique.bo :=$1} régle sémentique qui represente une seule valeur logique vrai ou faux. $3. bexp : bexp ET bexp {$$. id2 {$$.y) dans un ce nouveau dossier (compilation) . $3... And : represente l’opération de conjonction qui relié deux régles sémentiques.val} c’est une régle sémentique qui represente une seule expression arithmétique.} : en sémentique : $$. ensuite on execute les opérations suivantes sur l’invite de commande : cd. $$.bo)} represente l’expression négative.y : qui donne expr. bexp : ‘NEG’ bexp {$$. Prec uminus : represente la prioritaire d’ uminus par rapport à toute les opérations arithmétique. 4-Partie de régles sémentiques : A : grammaire de l’expression arithmétique Aexp : aexp’+’ aexp{$$.val) . Prec NEG : represente la prioritaire de la negation par rapprt à toute les opération booléens. cd.val : represente le non-terminal en 1ere place.l et expr.bo :=$2.bo :=NOT($2. b-l’experssion booléen.val :=($1)} régle sémentique qui représente l’expression qui peut etre un numéro.bo : represente le non-terminal en 1er place.bo:=($1.bo : represente le non-terminal en 3 éme place.bo :=y[$1]} cette régle represente l’identificateur qui donne la valeur qui se trouve dans le tableau Y. (méme explication pour l’operation ‘OU’) bexp : (‘bexp’) {$$. c-à-dire il y a une erreur. $1. ‘*’ et ‘-’). Comment executer notre compilateur : On crée un nouveau dossier sur le répertoire C:\ et on le nomme (par exemple : compilation) puis on met les deux fichiers (exprlex.l : qui donne exprlex. Aexp : num {$$.

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