:: Enseignements :: ESIPE :: E4INFO :: 2010-2011 :: Génération de code ::
[LOGO]

Analyse sémantique - Correction


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.

  1. 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.
  2. A quoi servent les classes SymbolTable, Type, VarSymbol et TypeCheckEnv (cf. cours)?
  3. 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.


TypeCheckingVisitor.java: