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
|