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.
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
.
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.
true
et false
Les valeurs true
et false
sont aussi du
sucre syntaxique. Elles représentent simplement les valeurs
1
et 0
.
()
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 []
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 ::
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
.
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 = Expressionde 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