Computer Science Department
Programming Methods Laboratory
(LAMP)
Ecole Polytechnique Federale de Lausanne
Programmation Avancée et Compilation     semestre d'été 2000

Projet - Séance 2 (31.03.2000)

Analyseur lexical
Analyseur syntaxique
Durant cette séance, vous devriez en principe terminer l'analyseur lexical et commencer la réalisation de l'analyseur syntaxique.

Analyseur lexical

Commentaires

Nous nous sommes rendu compte que l'expression régulière pour les commentaires fournie dans le cours est incorrecte. Voici l'expression qui apparaît dans le cours
  "/" "*" { noStar | "*" { "*" } noStarOrSlash } "*" "/"
et voici l'expression correcte
  "/" "*" { noStar | "*" { "*" } noStarOrSlash } "*" { "*" } "/".
Comme vous pouvez le constater, la différence n'est pas énorme. Malheureusement, elle est suffisante pour empêcher une analyse correcte du fichier de test donné ci-dessous. En effet, avec la première expression, le second commentaire du fichier n'est pas reconnu correctement.

Cette erreur n'était en aucun cas volontaire et nous tenons à nous excuser pour tout le temps qu'elle vous aura fait perdre.

Corrigé

Nous ne donnerons aucun corrigé pour l'analyseur lexical et il en sera de même pour les prochaines étapes. Cela signifie que si vous ne réalisez ou ne terminez pas l'une des étapes, il vous faut récupérer les résultats d'un autre groupe.

Fichier de test

A défaut de corrigés, nous tâcherons de vous fournir des fichiers de tests afin que vous puissiez vérifier le bon fonctionnement de votre programme. Ci-dessous un fichier contenant au moins un exemplaire de chaque lexème et un second contenant le résultat affiché par notre programme. Lors de l'analyse du fichier examples/tokens.jex, votre programme doit afficher la même suite de lexèmes que la nôtre, il ne doit y avoir aucun message d'erreur et aucun lexème du type <unknown>. Par contre, il se peut que le résultat affiché soit légèrement différent du nôtre. En effet, il se peut que votre fonction representation retourne d'autres chaînes de caractères que la nôtre.

Analyseur syntaxique

Les fichiers

Voici les fichiers dont vous aurez besoin pour réaliser, compiler et tester l'analyseur syntaxique:
  • jex.cup: grammaire du langage (le fichier que vous devez modifier)
  • JexException.java: exception utilisée par l'analyseur syntaxique
  • ParserTest.java: programme permettant de tester l'analyseur syntaxique
  • Makefile: nouveau fichier Makefile (remplacez le vôtre par celui-ci)

Votre travail

Le fichier jex.cup ne décrit qu'une partie de la grammaire de Jex. Votre travail est de le compléter. Pour cela, il vous faudra:
  • compléter la liste des instructions,
  • compléter la liste des expressions,
  • supprimer les conflits en indiquant la priorité et l'associativité des opérateurs,
  • déclarer les nouveaux non-terminaux que vous introduisez.

Comment compiler

Le nouveau Makefile compile automatiquement les nouveaux fichiers. Il vous permet aussi, avec la commande ci-dessous, de ne compiler que le fichier jex.cup.
  gmake jcup
Pour compiler ce fichier sans gmake utilisez les commandes suivantes:
  java jcup.Main -symbols Tokens -f jex.cup
  mv Parser.tables classes/jex/Parser.tables

Comment tester

Pour tester votre analyseur avec le fichier examples/factorial.jex, utilisez la commande suivante:
  gmake run.jex.ParserTest < examples/factorial.jex
ou, sans utiliser gmake:
  java jex.ParserTest < examples/factorial.jex
Ce fichier ne contenant aucune erreur de syntaxe, le programme devrait simplement se terminer et n'afficher aucun message. Comme pour l'analyseur lexical, il vous faudra écrire vos propres fichiers de test afin de vérifier que toutes les constructions du langages sont correctement reconnues.

Comment déverminer

Lors de la compilation du fichier jex.cup, il est possible d'imprimer la liste des états de l'analyseur syntaxique généré. Pour cela, il faut utiliser la commande suivante:
  java jcup.Main -dump_states -symbols Tokens -f jex.cup
Puis, lors de l'analyse d'un fichier, il est possible d'afficher la séquence de shift et de reduce réalisée ainsi que les états traversés. Pour cela, il faut utiliser la commande suivante:
  gmake run.jex.ParserTest ARGS=-debug < <fichier>
ou, sans utiliser gmake:
  java jex.ParserTest -debug < <fichier>


Teaching
LAMP homepage
Last modified: 27.04.2000, Philippe Altherr <philippe.altherr@epfl.ch>