L'analyse syntaxique sera effectuée avec les outils JFlex et Cup. L'outil JFlex est déjà installé en salles info. L'outil Cup est contenu dans le code fourni.
Nous vous fournissons la structure de base (sous la forme d'un ensemble de fichiers Java et d'un Makefile) que vous pouvez récupérer ici : mini-turtle-java.tar.gz. Une fois cette archive décompressée (par exemple avec tar zxvf mini-turtle-java.tar.gz), vous obtenez un répertoire mini-turtle-java/. Ce projet contient un package mini_turtle avec les fichiers suivants :
Turtle.java(i) | la tortue graphique (complet) |
Syntax.java | la syntaxe abstraite de mini-Turtle (complet) |
Lexer.flex | l'analyseur lexical (à compléter) |
Parser.cup | l'analyseur syntaxique (à compléter) |
Interp.java | l'interprète (complet) |
Main.java | le programme principal (complet) |
Makefile | pour automatiser la compilation (complet) |
Le code fourni compile mais est incomplet. Les endroits à compléter contiennent * À COMPLÉTER */. Le programme accepte un nom de fichier à interpréter. En cas d'absence, il utilise le fichier test.logo.
Note : La bibliothèque java-cup-11a-runtime.jar qui est contenue dans le sous-répertoire lib/ est requise pour l'exécution du code produit par CUP. VSCode et Eclipse devraient ajouter automatiquement lib/ au class path, mais de vieilles versions d'Eclipse nécessitent de le faire manuellement (avec Java Build Path -> Libraries -> Add JARs).
if else def repeat penup pendown forward turnleft turnright color black white red green blueUn identificateur ident contient des lettres, des chiffres et des caractères _ et débute par une lettre. Une constante entière integer est une suite de chiffres.
file ::= def* stmt* def ::= def ident ( ident*Les priorités des opérations arithmétiques binaires sont usuelles et la négation unaire a une priorité encore plus forte., ) stmt stmt ::= penup | pendown | forward expr | turnleft expr | turnright expr | color color | ident ( expr*, ) | if expr stmt | if expr stmt else stmt | repeat expr stmt | { stmt* } expr ::= integer | ident | expr + expr | expr - expr | expr * expr | expr / expr | - expr | ( expr ) color ::= black | white | red | green | blue
Note : on peut visualiser/compiler/lancer le code Java depuis VSCode (ou Eclipse) et même se servir de VSCode pour éditer les fichiers Lexer.flex et Parser.cup. Mais il faut tout de même lancer les commandes jflex et cup (avec make dans un terminal).
forward 100doit alors être accepté et la fenêtre doit s'ouvrir avec le dessin d'un trait horizontal (de 100 pixels de long). Vérifier que les priorités des opérateurs arithmétiques sont les bonnes, par exemple avec la commande suivante :
forward 100 + 1 * 0Si la priorité n'est pas la bonne, un point s'affichera plutôt qu'un trait.
Tester avec des programmes comme
forward 100 turnleft 90 color red forward 100
Tester avec des programmes comme
repeat 4 { forward 100 turnleft 90 }
On pourra tester avec les fichiers fournis dans le sous-répertoire tests, à savoir :
La commande make tests lance le programme sur chacun de ces fichiers. On doit obtenir les images suivantes (en appuyant sur une touche après chaque image) : ![]() | ![]() | ![]() | ![]() | ![]() | ![]() |