:: Enseignements :: Master :: M2 :: 2014-2015 :: Machine Virtuelle (et bazard autour ...) ::
[LOGO]

Lab 1 - AST walker


Le but de ce premier lab est d'implanter un interpréteur pour la langage Script en parcourant l'arbre de syntax abstrait (AST).

Exercice 1 - AST interpreter

Le but de cet exercice est d'écrire un interpreteur parcourant l'arbre correspondant à un script du language Script et affichant sa valeur.
Archive au format ZIP contenant une base de code (le lexer, parseur et les classes définissant l'AST)
vm2015-lab1.zip
La commande ant compile et créé le JAR executable script.jar qui peut être testé avec la commande
         java -jar script.jar mon_program_que_je_veux_executer.script
        

  1. Tester le JAR exécutable sur les différents scriptes du répertoire samples. Que fait-il ?
  2. La JAR exécutable execute le code contenu dans la classe Main. Que font les méthodes Parser.parse et PrettyPrinter.prettyPrint ?
  3. Nous allons dans un premier temps, nous intéresser à la classe PrettyPrinter pour en comprendre sont fonctionnement.
    A quoi sert la classe Env ? Quelle est sa responsabilité ?
  4. A quoi sert la classe Visitor ?
    Si vous ne vous souvenez plus, un petit rappel sur le Visitor Pattern.
    Dans ce cadre, a quoi servent les méthodes when et call du Visitor ?
    A quoi sert la méthode privée print du PrettyPrinter ?
  5. On veut maintenant implanter l'interpreteur ASTInterpreter en suivant le même mode de fonctionnement.
    A quoi servent les méthodes evalScript, evalFn et eval ?
  6. Que doit on implanter pour que le script suivant fonctionne ?
              fn (main:
                print(3)
              )
             
  7. Qu'affiche le script suivant, est-ce normal ?
              fn (main:
                print(print(3))
              )
             
  8. Verifier aussi que le helloworld fonctionne aussi
              fn (main:
                print('hello world !')
              )
             
  9. Que doit on implanter pour que le script suivant fonctionne ?
              fn (main:
                a = 3
                print(a)
              )
             
  10. Verifier que le script suivant fonctionne aussi
              fn (main:
                b = a = 3
                print(a)
                print(b)
              )
             
  11. Faire en sorte que le script suivant fonctionne
              fn (main:
                a = 1
                print(a + 1)
              )
             
  12. On cherche à implanter le 'if', faire en sorte que le script suivant fonctionne
              fn (main:
                a = 1
                b = if(a 23 34)
                print(b)
              )
             
  13. On cherche à implanter le 'while', faire en sorte que le script suivant fonctionne
              fn (main:
                a = 0
                while(a < 10
                  print(a)
                  a = a + 1
                )
                print('done')
              )
             
  14. On souhaite que l'appel de fonction marche. Faire en sorte que le script suivant fonctionne.
              fn(identity x:
               x)
               
              fn(main:
                print(123)
                print('hello')
              )
             
  15. Vérifier que les codes suivants ne sont pas valides et lève une exception
    Utilisation de variable non définie:
               fn(main:
                 print(a)
               )
             
    Utilisation d'une fonction non définie:
               fn(main:
                 foo()
               )
             
  16. Vérifier que les codes récursifs fonctionnent, par exemple, avec factoriel
              fn (fact x:
                if(x == 1 1 fact(n - 1)))
                
              fn(main:
                print(fact(5))
              ) 
             

Exercice 2 - Pour aller plus loin

Le langage Script support aussi les records et les assignations de-structurantes, par exemple le code suivant devra fonctionné
          fn(main:
            a = 2
            record = { 1, a }
            b, c = record
            print(b)
            print(c)
        
Faire en sorte que le code suivant affiche 1 et 2.