L'outil menhir et la bibliothèque graphics sont nécessaires pour ce TD. Si ce n'est pas déjà fait, vous pouvez les installer avec la commande opam install menhir graphics.
Nous vous fournissons la structure de base que vous pouvez récupérer ici : mini-turtle.tar.gz. Une fois cette archive décompressée avec tar zxvf mini-turtle.tar.gz, vous obtenez un répertoire mini-turtle/ contenant les fichiers suivants :
turtle.ml(i) | la tortue graphique (complet) |
ast.ml | la syntaxe abstraite de mini-Turtle (complet) |
lexer.mll | l'analyseur lexical (à compléter) |
parser.mly | l'analyseur syntaxique (à compléter) |
interp.ml | l'interprète (complet) |
miniturtle.ml | le programme principal (complet) |
Makefile/dune | pour automatiser la compilation (complet) |
Le code fourni compile (taper make, qui va lancer dune build mais est incomplet. L'exécutable s'applique à un fichier mini-Turtle portant le suffixe .logo. Quand on fait make, le programme est lancé sur le fichier test.logo.
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
Si besoin, on pourra faire make explain pour afficher les conflits détectés par menhir.
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 mini-turtle sur chacun de ces fichiers. On doit obtenir les images suivantes (en appuyant sur une touche après chaque image) : ![]() | ![]() | ![]() | ![]() | ![]() | ![]() |