|
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>
|