Le but de ce TD est d'implémenter un visiteur capable de vérifier certaines contraintes sémantiques sur un AST.
Préliminaires
Télécharger et décompresser l'archive gc-td3-ir2-2011.zip.
Importer le répertoire td3 dans votre projet eclipse.
Le fichier td3.ebnf spécifie une grammaire qui reconnait le code suivant par exemple :
let x = 1 + 3*2;
let w = 2 + if(x == 2) 3 else 1;
let z = w - 1;
{
let x = 5;
}
Exercice 1 - Construction automatique de l'AST et visiteur
Le but de l'exercice est d'implémenter un analyseur AnalyserMain qui construit
l'AST associé au code analysé en entrée, en utilisant les classes générées par Tatoo.
Pour cela, vous utiliserez la tache ant sur build.xml.
Dans ce fichier de configuration, la tâche ebnf contient en plus un attribut generateast="true".
Cette tâche va permettre de générer le lexeur et le parseur spécifiés dans td3.ebnf.
Elle produira également le ASTGrammarEvaluator générant l'AST et les classes correspondants aux noeuds de l'AST
(dans le package ast).
Le squelette de l'analyseur se trouve dans la classe AnalyserMain.
Il s'agira ensuite d'implémenter et appliquer un visiteur de l'AST vérifiant la sémantique du code.
Générer les classes grâce à la tâche ant.
Ecrivez deux fichiers d'exemples test1.txt et test2.txt permettant de tester
que la grammaire reconnait bien le language proposée.
A quoi servent les classes SymbolTable, Type, VarSymbol et
TypeCheckEnv (cf. cours)?
Compléter le visiteur TypeCheckingVisitor qui verifiera que le code est valide
en terme de typage. Les règles sont les suivantes :
Les constantes booléennes sont de type boolean, les constantes réelles de type double
Les opérations +, -, * ne marchent qu'entre deux réels
Les opérations == et != marchent pour les réels et les booléens, le résultat est un booléen
Les variables peuvent être de type double ou boolean
La condition d'un if doit être de type booléen et le type de l'expression si le if est vrai
et le type de l'expression si le if est faux doivent être identiques.
Un bloc (entre accolades) définit un nouveau scope, une variable d'un scope peut masquer
une variable d'un scope précédent.
Les variables sont en réalité des constantes (elles ne sont pas modifiables)
Signaler la première erreur grace à une runtime exception.