IFT313 - Introduction aux langages formels

Département d'informatique
Université de Sherbrooke

Été 2014
Travail pratique 6 - Mini projet avec Java CUP
à remettre le lundi 4 août 2014

Enseignant  : froduald.kabanza@usherbrooke.ca
Correcteur : francis.bisson@usherbrooke.ca (personne contact pour les questions)

1. Tâches

Ce travail pratique consiste à écrire un interpréteur du langage Graph313 à l'aide de Java CUP. C'est l'équivalent du TP 4, sauf que vous devez le faire maintenant avec Java CUP. Une option vous est donnée d'étendre légèrement le langage Garph313.

Vous devez partir des fichiers fournis dans l'archive suivante : tp6-sources.zip.

Vous devez utiliser la version 2006 de Java CUP utilisée dans le Lab #8.

1.1  Implémenter un parseur avec JavaCUP pour Graph313  [8 points]

Vous devez compléter le fichier ParserGraph313.cup, en vous basant sur la grammaire du travail pratique #4. Elle est redonnée ci-bas.

La spécification de l'analyseur léxical en Jflex vous est ai donnée. Vous pouvez l'utiliser ou refaire une autre spécification si vous préférez.

Testez votre analyseur syntaxique à l'aide de TestSemantique2.java et MainFrame2.java : JavaCUP ne doit afficher aucune erreur et aucun avertissement. Vous devez spécifier des règles pour résoudre les conflits même si la résolution par défaut fonctionne correctement.

La grammaire d'un graphique Graph313 :

<Graphique> ::= <Fonction>* "main" <EnonceBloc>

<Fonction> ::= "define" <ID> "(" <NomsParams> ")" <EnonceBloc>

<NomsParams> ::= (<ID> ( "," <ID>)*)?

<EnonceBloc> ::= "{" <Enonce>* "}"

<Enonce> ::= <Assign>
           | <EnonceAppel>
           | <EnonceIfElse>
           | <EnonceFor>
           | <EnonceReturn>
           | <EnonceWhile>
           | <EnonceBloc>
           | <Commande> ";"

<Assign> ::= <ID> "=" <ExpReel> ";"

<EnonceAppel> ::= "@" <ID>:nomfonction "(" <ExpsParams> ")" ";"

<EnonceIfElse> ::= "if" "(" <ExpBool> ")" <Enonce> ( "else" <Enonce>)?

<EnonceFor> ::= "for" "(" <ID>:var "," <ExpReel>:debut "," <ExpReel>:max "," <ExpReel>:incre ")" <Enonce>

<EnonceReturn> ::= "return" <ExpReel> ";"

<EnonceWhile> ::= "while" "(" <ExpBool> ")" <Enonce>

<ExpReel> ::= <ID>
            | "(" <ExpReel> ")"
            | <Number>
            | "@" <ID>:nomfonction "(" <ExpsParams> ")"
            | <ExpReel> "+" <ExpReel>
            | <ExpReel> "-" <ExpReel>
            | <ExpReel> "*" <ExpReel>
            | <ExpReel> "/" <ExpReel>

<ExpBool> ::= <ExpBool> "||" <ExpBool>
            | <ExpBool> "&&" <ExpBool>
            | "(" <ExpBool> ")"
            | <ExpReel> "<" <ExpReel>
            | <ExpReel> "<=" <ExpReel>
            | <ExpReel> "==" <ExpReel>
            | <ExpReel> ">=" <ExpReel>
            | <ExpReel> ">" <ExpReel>

<ExpsParams> ::= (<ExpReel> ( "," <ExpReel>)*)?

<Commande> ::= <CmdLine> | <CmdRect> | <CmdBegin> | <CmdPoints> | <CmdEnd>

<CmdLine> ::= "LINE" <ExpReel>:x1 "," <ExpReel>:y1 "," <ExpReel>:x2 "," <ExpReel>:y2

<CmdRect> ::= "RECT" <ExpReel>:x "," <ExpReel>:y "," <ExpReel>:w "," <ExpReel>:h

<CmdBegin> ::= "BEGIN" ("MODE_LINE" | "MODE_POLY")

<CmdPoints> ::= "POINTS" (<ExpReel>:x1 "," <ExpReel>:y1 ("," <ExpReel>:x "," <ExpReel>:y)*)?

<CmdEnd> ::= "END"

<ID> ::= <Lettre>(<Lettre>|<Chiffre>)*

<Number> ::= <Chiffre>+ ("." <Chiffre>+)

1.2  Étendre le langage de Graph313 [2 points]

Ajoutez une ou deux fonctionnalités à Graph313. Voici quelques suggestions d'ajouts :
  1. Ajouter une boucle de contrôle d'exécution (ex: switch, do while, ...).  [1 pt part type de boucle]
  2. Supporter des tableaux [1 pt]
  3. Supporter des opérateurs +=, -=, *=, /=. [1 pt]
  4. Ajouter le support de couleurs (on pouvoir créer des couleurs à partir d'unités lexicales et d'expressions réelles, ex: COULEUR 0+i, 255-i, 127; ). [1 pt]
  5. Ajouter de nouvelles commandes (ex: courbes de Béziers). [1 pt]
  6. Créer des animations simples. [2 pts]
Vous devez fournir un min-rapport concis en format PDF décrivant la ou les extensions appportées. Il doit contenir:
  1. les règles de production ajoutées à la grammaire;
  2. un résumé des ajouts ou modifications faites aux classes de Graph313;
  3. extrait de code du fichier demoX.g313 correspondant;
  4. une capture d'écran de MainFrame2.java exécutant le test au format PNG (demoX.png);
Le rapport fait partie intégrante du livrable. Un rapport qui n'est pas clair peut nuire à l'évaluation.

2. Remise

Vous devez soumettre un répertoire nommé tp6 contenant la même arborescence que celle retrouvée dans le fichier ZIP de départ :
tp6/
  |--- graph313/

Nettoyez les fichiers .class avant de faire le turnin. Le turnin doit être fait à l'aide de la commande suivante sous Unix :

turnin -c ift313 -p tp6 tp6

Vous ne devez pas utiliser de packages autres que Graph313, JFlex, JavaCup et ceux fournis avec Java 1.7 SE.

Vous devez soumettre votre travail au plus tard le lundi 4 août 2014 à 23 h 59. Prévoyez le soumettre en avance en cas de problèmes techniques.

3. Évaluation

Ce projet compte pour 10 % de la note finale. L’évaluation sera basée sur le niveau de correction de vos programmes, l’efficacité et la simplicité. Le plus votre code sera simple (succinct) et plus il fonctionnera correctement (par exemple, identifier le plus de tokens valides et le moins de tokens invalides) et rapidement, mieux il sera. De manière générale, vous devez respecter les critères usuels d’un code modulaire et bien écrit selon la pratique courante de la programmation.

Votre travail sera évalué en utilisant des scripts automatiques. Si l’évaluation échoue parce que vous n’avez pas respecté les directives, vous serez pénalisé avec la possibilité d’avoir une note nulle si tous les tests échouent. Il est donc important de ne pas modifier les noms de classe et de package.