Compilation 2005/2006 |
|||||
French only |
|||||
Partie 4 : Analyse des noms et des typesA présenter lors de la séance du 10 janvier 2006. Le but de cette partie est d'ajouter la phase d'analyse sémantique au compilateur Zwei. Cette analyse sémantique effectue deux tâches : l'analyse des noms et l'analyse des types. Au même titre que l'analyse lexicale se basait sur la grammaire lexicale et l'analyse syntaxique sur la grammaire syntaxique, l'analyse sémantique se base sur les règles de typage de Zwei, qui ont été vues au cours. L'analyse des noms consiste à associer à chaque identificateur du programme sa définition, et donc à vérifier que les identificateurs utilisés dans le programme sont effectivement définis. L'analyse des types consiste à vérifier que les types des différentes parties du programme sont corrects. Une fois l'analyse sémantique effectuée avec succès, la production de code pourra enfin commencer, car le programme sera garanti correct par rapport aux règles statiques du langage.
L'analyse des noms consiste à associer à chaque
utilisation d'un nom la définition de ce
nom. Dans l'arbre de syntaxe abstraite, les définitions et les
utilisations de noms sont représentés par des instances de la
classe
Si le programmeur désire utiliser des chaînes de
caractères dans son programme Zwei, il doit lui-même
définir les classes class List { Int isEmpty() { return this.isEmpty() } Int head() { return this.head() } List tail() { return this.tail() } List cons(Int x) { return this.cons(x) } } class Cons extends List { Int head; List tail; Int isEmpty() { return false } Int head() { return this.head } List tail() { return this.tail } List cons(Int x) { return new Cons(x, this) } } class Nil extends List { Int isEmpty() { return true } List cons(Int x) { return new Cons(x, this) } } L'analyse des types calcule le type des différentes parties du programme et vérifie qu'ils sont corrects. On utilise deux représentations pour les types dans le compilateur Zwei. Celle définie dans le fichier Tree.scala et celle définie dans le fichier Type.scala. La première est utilisée pour représenter les types qui apparaissent dans le programme source écrit par l'utilisateur, la deuxième est utilisée en interne par le compilateur pour faire son analyse. Les types de Zwei sont :
Ces types sont liés entre eux par une relation de
sous-typage. L'interprétation de cette relation est
qu'un type T1 est un sous-type d'un autre type
T2 si des valeurs de type T1 peuvent être
utilisées partout où des valeurs de type T2 sont
attendues. On écrit alors
Le type
Lors des phases précédentes, vous étiez autorisé à vous arrêter après
la première erreur. Cela n'est pas le cas pour cette phase;
cette fois-ci, toutes les erreurs doivent être signalées. Il
peut arriver qu'à cause d'une erreur, il soit impossible de calculer le
type d'un nœud. Dans ce cas, vous pouvez lui attribuer le type
Le programme de test Pour lancer le programme à partir du répertoire racine de votre projet, utilisez la commande suivante : scala -cp ./classes zweic.AnalyzerTest fichier-source Pour cette partie, nous vous fournissons les fichiers suivants : Canevas Scala
Le fichier compressé
Les fichiers fournis avec le canevas Java sont:
Le fichier compressé |
|