Compilation : Corrections et éclaircissements (partie 3)

Nous avons apporté quelques corrections à la donnée de la partie 3 du projet. Ce document énumère ces corrections et fournit également quelques éclaircissements supplémentaires.

Corrections

Grammaire abstraite

Une ancienne version de la grammaire abstraite était présente sur la page du cours au début de la séance du 22 novembre. Celle-ci comportait à tort dans la liste des opérateurs, les opérateurs Neg et Not. Ceux-ci sont inutiles, les opérations de négation arithmétique et logique étant du sucre syntaxique.

Une autre différence concerne les nœuds UnitLit, Intlit et NilLit. Dans l'ancienne version, ils étaient appelés Unit, Int et Nil.

Listes constantes

Dans la version originale de la donnée, dans la partie consacrée au sucre syntaxique, nous utilisions le terme listes constantes pour désigner les constructions du type [x, ..., z]. Par constant, nous entendions le fait que la forme de la liste était constante, et non pas que ses termes l'étaient. Le sucre syntaxique s'applique donc à toutes les constructions du type [x, ..., z] et non pas à seulement celles dont les termes sont constants.

Valeurs true et false

Les valeurs true et false sont aussi du sucre syntaxique. Elles représentent simplement les valeurs 1 et 0.

Eclaircissements

La valeur ()

La valeur () est la seule valeur ayant le type Unit. On l'appelle la valeur unit. Dans l'arbre syntaxique elle est représentée par un nœud de type UnitLit.

La valeur []

La valeur [] représente la liste vide. On la nomme généralement nil. Dans l'arbre syntaxique elle est représentée par un nœud de type NilLit.

L'opérateur ::

L'opérateur :: permet de construire une nouvelle liste en ajoutant un nouvel élément à une liste existante. L'élément se trouve à gauche de l'opérateur et la liste à droite. L'opérateur est associatif à droite. L'expression 1::2::3::[] est donc équivalente à 1::(2::(3::[])) et retourne une liste dont le premier élément est 1, le second 2 et le troisième et dernier 3.

L'opérateur :: est appelé cons (abréviation de constructeur). Dans l'arbre syntaxique il est représenté par un nœud de type Operation dont l'opérateur est Cons.

Le nœud Exec

Le nœud Exec est utilisé pour marquer les expressions qui sont utilisées comme des instructions. Il s'agit de toutes les expressions qui sont reconnues par la règle

Statement = Expression
de la grammaire syntaxique. Ci-dessous un petit exemple qui montre l'arbre qui devrait être généré pour l'expression { printInt(7); foobar(x) }.

                 Block
                /     \
            Exec       FunCall
            /          /     \
     FunCall       Ident     Ident
     /     \         |         |
  Ident   IntLit  "foobar"    "x" 
    |       |
"printInt"  7