:: Enseignements :: ESIPE :: E4INFO :: 2011-2012 :: Génération de code ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) | Projet - Partie 2 |
Seconde partie du projet, implantation d'un interpreteur.
Alors que la première partie demandait de développer un typechecker, la seconde partie se concentre sur le
développement d'un interpreteur dont le but est d'exécuter les scripts.
Pour repartir sur des bases saines (surtout en terme de grammaire),
le fichier ZIP contient tout ce qu'il faut pour démarrer:
ir2012-td4.zip.
Attention !, éviter le copier/coller entre le projet de la partie 1 et celui de la partie 2,
les packages ne sont pas les mêmes !
Comme pour l'exercice précédent, il existe dans le répertoire
lib un jar exécutable
nommé
interpreter-slim.jar qui implante déjà un interpreter.
Cela vous permettra de tester la sortie de votre programme par rapport à la sortie de ce jar exécutable.
Pour exécuter le jar:
java -jar lib/interpreter-slim.jar samples/mon_super_samples.ir2012
Exercice 1 - Implantation d'un interpreter
Le but est d'écrire un visiteur qui va exécuter le code, il vérifiera aussi que les opérations
sont possibles de la même façon que le fait le typechecker.
Comparé au typechecker, le fonctionnement est un peut différent,
l'interpreteur par du block principale et exécute les fonctions à partir de celui-ci,
donc si une fonction n'est pas appelée, elle peut contenir du code qui ne fonctionne
pas cela ne doit pas poser de problème.
Sinon, alors que le typechecker propageait des types et se souvenait du type des variables locales,
un interpreteur propage des valeurs (des Object) et stocke la valeur des variables locales.
Enfin, le fonctionnement des break, continue et return est un peu particulier car
il faut arrêter les appels recursifs au visiteur pour revenir soit dans la visit de la boucle
ou dans celle de l'appel de fonction. On utilise pour cela des exceptions, dans le cas de return
l'exception contiendra la valeur de retour.
Donc, comme précédemment il faut fournir une implantation à toute les méthodes visit du
visiteur nommé Interpreter (là où il y a des TODOs) mais avant il faut comprendre un peu
le code et les classes annexes qui vous ont été founies.
Les commentaires ont aussi été retiré, à vous de les ajouter.
-
Quelle est le nom des classes qui correspondent respectivement à
Env, Symbol et SymbolTable dans le cas de l'interpreteur.
Notez que ces classes stockent des Object et pas des types.
-
Ajouter les commentaires de doc pour ces classes.
-
Quel est le design pattern utilisé dans les classes BreakException et
ContinueException ?
Maintenant, passont aux choses sérieuses.
-
Implanter les méthodes visit pour les constantes ainsi que la méthode
visit pour print. tester avec un exemple simple.
-
Implanter la méthode visit pour les built-ins scan_bool,
scan_int et scan_string.
-
Implanter les visit pour la déclaration, l'affectation (assignment en anglais)
ainsi que la visit d'une expression contenant une variable.
N'oublier pas de tester.
-
Implanter la méthode privée visitIf pour le if.
-
Vérifier que le code ci-dessous affiche bien 1 puis 2 puis 1.
var a = 1
if a == 1:
print a
var a = 2
print a
end
print a
-
Implanter les méthodes visit correspondant au moins et au plus unaire.
Tester avec un exemple simple.
-
Implanter les operations binaires.
Vous pouvez tester avec le sample cascaded_if.ir2012.
-
Ajouter les visits correspondant à la boucle for ainsi
que pour les instructions break et continue.
-
Ajouter les visits correspondant à l'appel de fonction
ainsi qu'à l'instruction return.
Comme dans le cas du typechecker, vérifier que l'appel avec des
paramètres nommés fonctionne avec l'exemple ci-dessous.
def foo(a, b):
print a - b
foo(1, a: 2) // calls foo(2, 1)
foo(b: 1, a: 2) // calls foo(2, 1)
foo(b: 1, 2) // calls foo(2, 1)
foo(a:1, a:2) // error: duplicate argument name
foo(a:1, 1) // error: duplicate argument name
© Université de Marne-la-Vallée