Description du travail à réaliser

Dans ce TP, vous devrez écrire du code java pour créer l’arbre de syntaxe abstraite de votre langage de programmation; et commencer à écrire des algorithmes qui parcourent ces arbres. En cours, vous avez vu ces manipulations pour l’exemple d’un langage minimal contenant des arbres binaires.

Il s’agit donc de faire la même chose, mais avec les élémenst d’un langage de programmation.

Dans cette aventure, vous n’êtes pas seul…

Sur Celene, une archive pour le TP2 vous est fournie, qui contient l’architecture de base du code attendu. Vous y trouverez l’équipement suivant :

Premiers tests

Dans un terminal Unix, placez vous dans le répertoire du TP2 (une fois extrait de l’archive fournie), et lancez ./build.sh après vous être assuré d’avoir la configuration adéquate.

Ensuite, lancez la commande java Main, qui devrait vous laisser ouverte l’inivite de commande.

Tapez une expression à parser. Les seules expressions prises en charge dans le code fourni sont les entiers littéraux. Terminez votre saisie d’un entier par ’Entrée’ puis ’Ctrl+D’. L’entier devrait être recopié, car le programme a appelé le visiteur qui affiche l’ast.

Dans la suite de vos tests, vous pourrez écrire les textes à parser dans des fichiers test.plk et utiliser le programme en redirigeant le fichier vers l’entrée standard en le lançant avec java Main < test.plk.

Première mission

Répétez le test ci-dessus avec une expression unaire au lieu d’un entier. Elles sont en effet déjà définies dans plk, avec plusieurs opérateurs possibles. Vous pouvez donc tester des expressions telles que -2. Mais l’afficheur ne prend pas encore en charge ce type de nœuds.

  1. Modifiez le visiteur AstPrinter pour pouvoir afficher les expressions unaires sous formes de chaînes de caractères.

  2. Modifiez l’AstBuild pour traiter le cas des expressions parenthésées. Si vous n’y parvenez pas ou ne voyez pas du tout comment faire (mais cherchez un tout petit peu quand même, je l’ai montré en cours), regardez le code de la démo du cours.

  3. Répétez les tests avec des expressions unaires comme -(-(-(-12))).

  4. Intégrez la prise en charge de l’opérateur not et

Deuxième mission : Extension du langage

 

Spécification de la gramamire

Conseil

Dans cette partie du TP, vous devez ajouter des éléments à votre grammaire. Il est vivement recommandé de les ajouter petit à petit (par exemple, les constructions relatives au fonctions peuvent être laissées de côté dans un premier temps). Vous pouvez bien sûr récupérer ce que vous avez fait lors du TP précédent. Travaillez maintenant le fichier plk.g4 pour ajouter :

Lexèmes

Syntaxe

Création des classes de l’AST

Définissez des classes Java correspondant à votre langage :

Rassembler le parseur et l’AST

Récupérez le code java de votre parseur (qui supporte l’option Visiteur). Si votre langage s’appelle Langage, vous devriez disposer entre autres des fichiers suivants : plkLexer.java, plkParser.java, plk.tokens, plkVisitor.java, plkBaseVisitor.java.

Identification du code généré par ANTLR

Parcourez le fichier plkBaseVisitor et plkParser. Remarquez que pour chaque catégorie syntaxique que vous avez inscrite dans votre fichier .g4, une classe statique a été créee dans le parseur, et que le visiteur a une méthode de visite pour chacune de ces classes. Ces classes sont <Règle>Context, et héritent de ParserRuleContext.

Dans les classes statiques du LangageParser, vous avez des méthodes vous permettant de récupérer :

Codage

Modifiez la classe AstBuild pour créer l’AST adapté, en vous servant des points précédents et des exemples déjà codés.

Algorithmes sur l’AST

Supporter le patron visiteur

Pour que le nouvel AST soit compatible avec les algorithmes implémentés sous forme de visiteurs, il faut au préalable s’assurer des points suivants :

Premier visiteur : afficher le code source

La classe AstPrinter ne compilera pas tant que vous n’aurez pas implémenté toutes les méthodes déclarées dans l’interface lors du point précédent.

Complétez ce visiteur de façon à ce qu’il retourne une chaîne représentant l’AST de façon lisible.

Faites en sorte que le code respecte une indentation naturelle des blocs dans les conditionnelles et les boucles.

Extension du langage — Deuxième partie

Dans cette section, on vous demande de rajouter des constructions au langage, sans rajouter pour autant de classes à l’AST.

Pour les extentions demandées, vous avez le droit de modifier uniquement :

Vous devez rajouter la possibilité pour l’utilisateur d’écrire :

  1. Des boucles for (il vous faudra avoir déjà implémentées les boucles while)

  2. Des affectations/déclarations de la forme int x = 1; (il faut avoir les déclarations, et les affectations)

  3. Des incrémentations et décrémentations du type x++; (qui seront considérées uniquement comme des instructions, et non comme des expressions, pour plus de simplicité).


  1. Si vous préférez utiliser uniquement IntelliJ : Dans la liste des fichiers (présente sur le panneau latéral), faire un clic droit sur le fichier .g4 de votre grammaire, puis ’Generate Antlr recognizer’, (ou Ctrl+Maj+G). Un répertoire gen est créé. (Pour votre programme, il pourra être nécessaire de renommer les packages).

    • Il vous faudra importer les librairies Antlr4 pour Java. Pour cela, rendez-vous dans Files > Project Structure > Libraries.

    • Puis avec Maven, recherchez une librairie Antlr4 (par exemple :antlr4-4.11), puis installez-la.

    ↩︎
  2. Ajouter la ligne export CLASSPATH=".:/usr/local/lib/antlr-4.13.1-complete.jar:$CLASSPATH" en adaptant éventuellement la version et le chemin s’ils sont différents.↩︎