Compilation 2004/2005 |
|||||
French only |
|||||
Partie 4 : Analyse des noms et des types
A présenter lors de la séance du 14 janvier 2005. Le but de cette partie est d'ajouter la phase d'analyse sémantique au compilateur Eins. 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 la grammaire attribuée de Eins, qui a été vue 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 associe à chaque identificateur du programme
sa définition. Pour ce faire, elle stocke directement dans
l'arbre, dans chaque nœud contenant un
identificateur, un symbole contenant les
informations relatives à l'identificateur. Cela signifie qu'il
vous faudra ajouter un champ de type Chaque symbole contient les informations suivantes :
L'analyse des noms vérifie également que les identificateurs utilisés sont préalablement définis, et qu'en tout point du programme, il n'existe pas deux identificateurs visibles ayant le même nom.
Le langage Eins dispose de deux classes prédéfinies, qui
doivent faire partie de la portée principale du programme. Il
y a la classe class Unit {} class List { val head: Int; val tail: Le langage Eins dispose aussi de quatre fonctions d'entrée-sortie prédéfinies, qui doivent, tout comme les classes prédéfinies, faire partie de la portée principale du programme. Ces fonctions ont le profil suivant : def printInt(i: Int): Unit; def readInt(): Int; def printChar(c: Int): Unit; def readChar(): Int;Pour cette partie, ces fonctions seront traitées exactement comme des fonctions normales, si l'on excepte bien entendu le fait qu'elles sont automatiquement définies. Ce n'est qu'au moment de la production de code qu'elles devront être traitées différemment. L'analyse des types calcule le type des différentes parties du programme et vérifie qu'ils sont corrects. Il y a deux notions de types, ceux qui peuvent être écrits par l'utilisateur et qu'on nomme types externes, et ceux qui sont utilisés par le compilateur pour faire son analyse, qu'on appelle types internes. Les types externes de Eins 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
Certains nœuds ne possèdent pas de type, comme par
exemple ceux correspondant aux définitions de fonction ou aux
instructions d'un bloc. A ces nœuds, il faut attribuer
le pseudo-type
Lors des phases précédentes, vous étiez autorisé à vous
arrêter après la première erreur. Ceci 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
Pour cette partie, nous vous fournissons les fichiers suivants :
|
|