Logo EPFL
LAMP
Ecole Polytechnique Fédérale de Lausanne
Compilation 2005/2006
French only

Partie 3 : Construction de l'arbre

A présenter lors de la séance du 8 décembre 2005.

Le but de cette partie est de modifier l'analyseur syntaxique pour qu'il construise l'arbre syntaxique correspondant au programme source. Cet arbre syntaxique sera ensuite utilisé par toutes les phases suivantes du compilateur.

La première chose à faire est de choisir une syntaxe abstraite pour le langage Zwei. Une syntaxe vous est proposée ici, mais vous êtes libres de choisir la vôtre si la nôtre ne vous convient pas. Notez toutefois que les fichiers que nous distribuons utilisent cette syntaxe abstraite.

Une fois la grammaire abstraite choisie, il importe de la traduire en code Scala, en écrivant une sous-classe de la classe Tree pour chaque construction de la grammaire abstraite. Ensuite, l'analyseur syntaxique doit être augmenté afin de construire effectivement l'arbre. Finalement, pour vérifier que l'arbre construit est correct, il faut un moyen de l'imprimer sous forme textuelle.

Nous avons introduit dans le langage Zwei une certaine quantité de sucre syntaxique. On nomme ainsi les constructions d'un langage qui sont strictement équivalentes à d'autres, mais qui ont une syntaxe différente. Le sucre syntaxique n'apporte donc aucune expressivité au langage, mais permet par contre souvent de rendre la vie du programmeur plus douce, en allégeant certaines notations, d'où son nom.

Un exemple de sucre syntaxique en Java est la boucle for. En effet, tout ce qui est exprimable au moyen de la boucle for est exprimable au moyen de la boucle while, puisqu'on a l'équivalence suivante :

          for (e1; e2; e3) e4
        
est équivalent à
          e1;
          while (e2) {
          e4; e3;
          }
        

La boucle for n'est donc pas strictement nécessaire en Java, puisqu'elle ne permet pas d'exprimer des choses qui ne sont pas exprimables sans elle, mais elle permet parfois de simplifier et de clarifier les programmes.

Le sucre syntaxique de Zwei est défini dans la table ci-dessous. La manière correcte (et simple) de traiter le sucre syntaxique dans un compilateur est de le supprimer totalement, au moment de la construction de l'arbre. Le sucre syntaxique existe donc dans la grammaire concrète, mais pas dans la grammaire abstraite. Cela simplifie grandement les phases ultérieures du compilateur, qui doivent gérer uniquement les constructions de base du langage.

N°  Désignation Notation Equivalence
1 Valeur false false 0
2 Valeur true true 1
3 "ou" logique expr1 || expr2 !(!expr1 && !expr2)
4 if sans else if (cond) expr if (cond) expr else null
5 Chaîne de caractères "c1 ... cn" new Cons(code(c1), ... new Cons(code(cn), new Nil())...)
6 Bloc (expression) { stat1 ... statn } { stat1 ... statn return null }

Dans l'équivalence du sucre syntaxique pour les chaînes de caractères, l'expression code(c) représente le code ASCII du caractère c.

Le tableau ci-dessous donne quelques exemples de transformation de sucre syntaxique.

L'expression ... est interprétée comme ... d'après la (les) règle(s) n°...
true || false !(!1 && !0) 1,2,3
if (c) a if (c) a else null 4
"eins" new Cons(101, new Cons(105, new Cons(110, new Cons(115, new Nil())))) 5
{} { return null } 6

Le programme de test PrinterTest.scala vous permet de tester votre analyseur syntaxique. Il lit un fichier source et affiche le source correspondant à la grammaire abstraite, càd. sans sucre syntaxique.

Pour lancer le programme à partir du répertoire racine de votre projet, utilisez la commande suivante :

      scala -cp ./classes zweic.PrinterTest fichier-source [ fichier-destination ]
    

La sortie est simplement affichée à l'écran si l'argument fichier-destination n'est pas spécifié.

Nous vous fournissons les fichiers suivants pour vous aider dans cette partie.

Canevas Scala

Printer-partial.scala (à renommer en Printer.scala) contient la définition d'un visiteur qui imprime l'arbre syntaxique. Comme pour Tree-partial.scala, la plus grosse partie du travail est faite, il ne vous reste qu'à ajouter les fonctions pour les noeuds que vous rajoutez dans Tree-partial.scala.

PrinterTest.scala contient un programme qui vous permet de tester votre analyseur syntaxique.

Bien entendu, le gros du travail consiste à modifier votre analyseur syntaxique (fichier Parser.scala) afin qu'il construise l'arbre.

Le fichier compressé part3.zip contient tous les fichiers dont vous avez besoin pour la partie 3 (part3.zip contient également les fichiers fournis pour les parties 1 et 2).

Canevas Java

Les fichiers fournis avec le canevas Java sont: Makefile, build.xml, Formal.java, Visitor-partial.java, Printer-partial.java, PrinterTest.java.

Le fichier compressé part3-java.zip contient tous les fichiers Java dont vous avez besoin pour la partie 3 (part3-java.zip contient également les fichiers fournis pour les parties 1 et 2).