Université Blaise Pascal - UFR ST - M1 informatique
TP de compilation - projet noté 2014
Sujet à réaliser en binômes (groupes de 2 étudiants), sauf autorisation.
L'évaluation prendra en compte la réalisation du projet ainsi que sa présentation orale.
-
Au plus tard la veille de l'exposé oral à midi (lundi 17 mars 2014 à 12h00, sauf contrordre),
Envoyer dans la rubrique Travaux du support de TP sur l'ENT le compte-rendu qui sera un diaporama
en deux parties :
-
Présentation orale (ce qui a été réalisé / choix faits / exemples bien choisis
d'exécution / limites du programme) – au plus 5 diapositives,
-
Code source Lex / Yacc / éventuel code additionnel – a priori au plus trois
diapositives équivalentes à trois pages A4 en Arial 12pt ;
-
L'exposé oral (au plus 5 minutes) aura lieu à la dernière séance de TP (mardi 18 mars 2014 à partir
de 13h30 sauf contrordre) selon un planning qui sera affiché sur l'ENT ;
cet exposé sera immédiatement suivi de questions du jury et d'une démonstration (5 minutes).
REALISER UNE CALCULATRICE EN NOMBRES ENTIERS
Le cahier des charges du projet de base est le suivant.
-
Dans le projet de base, une ligne saisie par l'utilisateur correspond soit
à une expression numérique à évaluer soit à une instruction d'affectation
d'une variable.
- Les différents "tokens" (lexèmes) sont :
-
Nombres entiers relatifs (dans un intervalle de [-109..+109]),
-
Opérateurs binaires : + (addition), -
(soustraction), * (multiplication), / (division entière) ,
% (modulo = reste de la division entière) ;
opérateurs unaires : - (opposé),
-
26 variables de 'A' à 'Z', sans distinction entre majuscules
et minuscules,
-
@ est le symbole d'affectation (l'instruction X@541, par exemple,
placera la valeur 541 dans la variable X, l'instruction X@expression placera
dans X le résultat (nombre) de l'évaluation préalable de l'expression),
-
Les parenthèses ouvrante et fermante.
-
En cas d'erreur sur une ligne, l'interpréteur redémarre sans difficulté à la ligne suivante.
-
Les expressions n'ont pas besoin d'être totalement parenthésées. On utilisera
les priorités classiques (par ordre décroissant de priorité) :
- unaire, * / et %, + et - binaires, puis
l'affectation. Associativité à gauche pour tous les opérateurs binaires, sauf
pour @ : associativité à droite.
Ce projet de base pourra être amélioré, au choix, dans une ou plusieurs des directions suivantes.
N.B. Toutes les directions d'amélioration ne sont pas intercompatibles, il faudra veiller à maintenir la cohérence
globale du projet.
-
Une affectation correspond à une expression (par exemple X@340+Y@123 affecte
123 à Y, affecte 340+123 à X, et est interprétée comme 463=340+123 qui est le
résultat affiché/retourné).
-
Robustesse et convivialité. Un analyseur robuste accepte n'importe quelle
entrée de l'utilisateur sans défaillir ; un analyseur convivial sait en plus indiquer
(succinctement) à l'utilisateur quelle erreur il a commise.
Exemple 1 : Toute suite de caractères inconnus est interprétée comme un zéro.
Exemple 2 : L'analyseur autorise les opérateurs de multiplication implicites :
23G et GH sont respectivement interprétés comme 23*G et G*H (on décidera si G23 doit être interprété comme G*23 ou
donner lieu à une erreur syntaxique).
Exemple 3 : En cas d'erreur, l'analyseur indique les variables qui ont été modifiées par la ligne de commande,
soit automatiquement, soit grâce à une commande spécifique pouvant être saisie à tout moment.
Exemple 4 : Ajout d'un token #, éventuellement pourvu d'un signe, correspondant à
un dépassement de capacité (dont division par zéro), et géré comme un nombre (#+5=#, -#*-#=#, etc.).
-
Les noms des variables sont de la forme [G-Zg-z][A-Za-z]* ; la gestion de la table
des symboles sera faite autant que possible au niveau lexical.
Exemple 1 : seule la première lettre du motif est prise en compte, il y a 26 variables.
Exemple 2 : la taille du nom des variables n'est pas limité, mais leur nombre l'est (comment
gérer un dépassement de capacité en nombre de variables ?).
Exemple 3 : ni la taille ni le nombre des variables n'est limité ; pour retrouver
plus rapidement les variables, on utilise une table de hachage basée sur la première lettre de la
variable.
-
L'analyseur accepte l'affectation combinée à une opération (X+@61 pour X@X+61).
-
L'analyseur peut fonctionner avec des nombres réels et une précision de quatre chiffres après la virgule :
Soit : deux commandes spécifiques basculent l'analyseur entre le mode nombres entiers (par défaut)
et le mode nombres réels,
Soit : la saisie d'au moins un nombre réel dans une ligne bascule en mode nombres réels pour la ligne
considérée, l'interpréteur restant par défaut toujours en mode nombres entiers.
N.B. on décidera si on gère un symbole 'E' d'exposant décimal (12.33E(-5) dénotera 12,3*10^(-5)), avec une priorité adaptée.
-
L'interpréteur construit à la demande l'arbre syntaxique associé à une ligne de calcul.
Une commande spéciale basculera donc entre un mode calcul du résultat et un mode affichage de l'arbre.