Le but de ce travail est de vous familiariser avec les concepts suivants:
Le but du devoir est d'écrire un interprète pour le langage Design . Le langage est utilisé pour dessiner des figures géométriques.
L'interprète reçoit 2 fichiers en tant que paramètres de la ligne de commande:
S'il y a des erreurs dans le fichier d'entrée, l'interprète va afficher sur l'écran un message qui contient le numéro de la ligne et le texte d'erreur, mais sans arrêter le programme.
Exemple d'exécution du programme:
node main.js design.dsn canvas.svg
Cela va exécuter le fichier design.dsn et va dessiner les figures indiquées par les instructions dans le fichier canvas.svg.
Pour le fichier design.dsn suivant :
& Move POSITION: 200, 200 COMMAND_WITH_ERROR
L'interpreteur devra déplacer la position du crayon et ensuite afficher:
ERROR LINE (2): Unknown statement (COMMAND_WITH_ERROR)
Le devoir est individuel. Toute tentative de tricher entraînera 0p pour les devoirs. On va utiliser un systeme automatisé pour détecter les devoirs copiés.
Si vous avez des questions concernant les devoirs, posez-les en publiant un problème sur le github repository pour les questions avec le format du titre [design] <titre de votre question>. Vous aurez besoin d'un compte github pour cela.
Si vous souhaitez recevoir un e-mail lorsque des problèmes sont publiés ou lorsqu'il y a de nouveaux messages, accédez au repository pour les questions github et cliquez sur Regarder.
Le langage simplement déplace un stylo. La position initiale du stylo est 0, 0. Lors du dessin, le stylo est déplace vers la nouvelle position.
Les commentaires sont précédés par &.
& Sur cette ligne il y a un commentaire INSTRUCTION: p1 p2 INSTRUCTION: p1 p2
Toutes les instructions acceptent comme paramètres des nombres ou des variables. Les variables ont le format suivant:
%variable
Avant de pouvoir être utilisé, une variable doit recevoir une valeur (en utilisant l'instruction set).
Les instructions sont stockées dans un fichier. Chaque instruction est sur une ligne distincte.
Le format d'un instruction est le suivant:
INSTRUCTION: paramètre1 paramètre2 etc
Les instructions peuvent avoir n'importe quel nombre d'espaces avant leur nom, entre les paramètres et n'importe quel nombre d'espaces après le dernier paramètre. Voici quelques exemples d'instructions valides:
INSTRUCTION: p1 p2 p3 INSTRUCTION: p1 p2 p3 INSTRUCTION: p1 p2 p3
Toutes les instructions et tous les paramètres sont case insensitive.
Déplace le stylo dans une position, sans rien dessiner. Les paramètres sont x et y.
POSITION: 150 150 POSITION: %here %there & %here et %there sont des variables qui ont été assignées précédemment
Mauvais nombre de paramètres:
ERROR LINE (line_number):POSITION has 2 parameters, you wrote (number_of_written_parameters)
Mauvais type de paramètre:
ERROR LINE (line_number):POSITION parameter (the number of the parameter) requires a number or a variable, you wrote (actual_written_parameter_value)
Trace une ligne de la position actuelle vers une autre position ou avec une longueur et un angle spécifiés. Met à jour les coordonnées du stylo.
LINE: x y location LINE: l a polar
Elle prend exactement 3 paramètres
Nombre de paramètres erroné:
ERROR LINE (line_number):LINE has 3 parameters, you wrote (number_of_written_parameters)
Type de paramètre erroné pour type:
ERROR LINE (line_number):LINE parameter 3 requires one of (location, polar), you wrote (actual_written_parameter_value)
Type de paramètre erroné:
ERROR LINE (line_number):LINE parameter (the number of the parameter) requires a number or a variable, you wrote (actual_written_parameter_value)
Dessine un cercle Elle ne met pas à jour la position du stylo.
CIRCLE: x y r
Elle prend exactement 3 paramètres
Nombre de paramètres erroné:
ERROR LINE (line_number):CIRCLE has 3 parameters, you wrote (number_of_written_parameters)
Type de paramètre erroné:
ERROR LINE (line_number):CIRCLE parameter (the number of the parameter) requires a number or a variable, you wrote (actual_written_parameter_value)
Dessine une ellipse Elle ne met pas à jour la position du stylo.
ELLIPSE: x y r1 r2
Elle prend exactement 4 paramètres
Nombre de paramètres erroné:
ERROR LINE (line_number):ELLIPSE has 4 parameters, you wrote (number_of_written_parameters)
Type de paramètre erroné:
ERROR LINE (line_number):ELLIPSE parameter (the number of the parameter) requires a number or a variable, you wrote (actual_written_parameter_value)
Dessine un rectangle Elle ne met pas à jour la position du stylo.
RECTANGLE: x1 y1 x2 y2
Elle prend exactement 4 paramètres
Nombre de paramètres erroné:
ERROR LINE (line_number):RECTANGLE has 4 parameters, you wrote (number_of_written_parameters)
Type de paramètre erroné:
ERROR LINE (line_number):RECTANGLE parameter (the number of the parameter) requires a number or a variable, you wrote (actual_written_parameter_value)
Met à jour la couleur du stylo ou de remplissage.
La couleur initiale du stylo est noir. La couleur de remplissage initiale est blanc.
COLOR: pen r g b COLOR: fill r g b
Elle prend exactement 4 paramètres
Les valeurs sont comprises entre 0 et 255.
Nombre de paramètres erroné:
ERROR LINE (line_number):COLOR has 4 parameters, you wrote (number_of_written_parameters)
Type de paramètres erroné pour type
ERROR LINE (line_number):COLOR parameter 1 requires one of (pen, fill), you wrote (actual_written_parameter_value)
Type de paramètre erroné:
ERROR LINE (line_number):COLOR parameter (the number of the parameter) requires a number or a variable, you wrote (actual_written_parameter_value)
Valeur hors de portée:
ERROR LINE (line_number):COLOR parameter (the number of the parameter) requires a number or a variable between [0, 255], you wrote (actual_written_parameter_value, if it is a variable write the value of the variable)
Répète certaines lignes de déclarations jusqu'à REPEAT
LOOP: times
Les instructions LOOP ne sont pas imbriquées (LOOP dans LOOP)
Elle prend exactement 1 paramètre
* times - un nombre entier ou une variable spécifiant le nombre de répétitions des instructions jusqu'à REPEAT
Nombre de paramètres erroné:
ERROR LINE (line_number):LOOP has 1 parameters, you wrote (number_of_written_parameters)
Paramètre erroné pour les temps:
ERROR LINE (line_number):LOOP parameter 1 requires a number or a variable, you wrote (actual_written_parameter_value)
Le fichier se termine et il y a encore au moins une boucle sans REPEAT:
ERROR LINE (line_number):LOOP with no REPEAT
Répète certaines lignes de déclarations jusqu'à REPEAT
WHILE: variable
Les instructions WHILE ne sont pas imbriquées (WHILE dans WHILE)
Elle prend exactement 1 paramètre
* variable - une variable, si la variable est différente de 0, répète les instructions jusqu'à REPEAT, une ou plusiers fois
Nombre de paramètres erroné:
ERROR LINE (line_number):WHILE has 1 parameters, you wrote (number_of_written_parameters)
Paramètre erroné pour la variable:
ERROR LINE (line_number):WHILE parameter 1 requires a variable, you wrote (actual_written_parameter_value)
Le fichier se termine et il y a encore au moins un WHILE sans REPEAT:
ERROR LINE (line_number):WHILE with no REPEAT
Termine un LOOP ou un WHILE.
Elle ne prend pas de paramètres:
Nombre de paramètres erroné:
ERROR LINE (line_number):REPEAT has 0 parameters, you wrote (number_of_written_parameters)
REPEAT est utilisé sans un LOOP précédente:
ERROR LINE (line_number):REPEAT and no LOOP
Exécuter certaines lignes d'instructions jusqu'à ELSE ou END
IF: variable
Les instructions IF ne sont pas imbriquées (IF dans IF)
Elle prend exactement 1 paramètre
* variable - une variable, si la variable est différente de 0, exécute les instructions jusqu'à ELSE ou END (s'il n'y a pas d'ELSE)
Nombre de paramètres erroné:
ERROR LINE (line_number):IF has 1 parameters, you wrote (number_of_written_parameters)
Paramètre erroné pour times
ERROR LINE (line_number):IF parameter 1 requires a variable, you wrote (actual_written_parameter_value)
Le fichier se termine et il y a encore au moins un IF sans END
You have number_of_repeats IF without END
ELSE est une partie du IF
Elle ne prend pas de paramètres
Nombre de paramètres erroné:
ERROR LINE (line_number):ELSE has 0 parameters, you wrote (number_of_written_parameters)
END est utilisé sans un IF précédent:
ERROR LINE (line_number):ELSE and no IF
Termine un IF
Elle ne prend pas de paramètres
Nombre de paramètres erroné:
ERROR LINE (line_number):END has 0 parameters, you wrote (number_of_written_parameters)
END est utilisé sans un IF précédent:
ERROR LINE (line_number):END and no IF
Définit la valeur d'une variable
SET: variable value
Elle prend exactement 2 paramètres
Nombre de paramètres erroné:
ERROR LINE (line_number):SET has 2 parameters, you wrote (number_of_written_parameters)
Paramètre erroné pour variable
ERROR LINE (line_number):SET parameter 1 requires a variable, you wrote (actual_written_parameter_value)
Paramètre erroné pour value
ERROR LINE (line_number):SET parameter 2 requires a number or a variable, you wrote (actual_written_parameter_value)
Ajoute une valeur à la valeur d'une variable
ADD: variable value
Elle prend exactement 2 paramètres
Nombre de paramètres erroné:
ERROR LINE (line_number):ADD has 2 parameters, you wrote (number_of_written_parameters)
Type de paramètre erroné pour la variable
ERROR LINE (line_number):ADD parameter 1 requires a variable, you wrote (actual_written_parameter_value)
Type de paramètre erroné pour value:
ERROR LINE (line_number):ADD parameter 2 requires a number or a variable, you wrote (actual_written_parameter_value)
Soustrait une valeur de la valeur d'une variable
SUB: variable value
Elle prend exactement 2 paramètres
Nombre de paramètres erroné:
ERROR LINE (line_number):SUB has 2 parameters, you wrote (number_of_written_parameters)
Type de paramètre erroné pour variable
ERROR LINE (line_number):SUB parameter 1 requires a variable, you wrote (actual_written_parameter_value)
Type de paramètre erroné pour value
ERROR LINE (line_number):SUB parameter 2 requires a number or a variable, you wrote (actual_written_parameter_value)
Multiplie la valeur d'une variable par une valeur.
MUL: variable value
Elle prend exactement 2 paramètres
Nombre de paramètres erroné
ERROR LINE (line_number):MUL has 2 parameters, you wrote (number_of_written_parameters)
Type de paramètre erroné pour variable
ERROR LINE (line_number):MUL parameter 1 requires a variable, you wrote (actual_written_parameter_value)
Type de paramètre erroné pour value
ERROR LINE (line_number):MUL parameter 2 requires a number or a variable, you wrote (actual_written_parameter_value)
Divise la valeur d'une variable par une valeur
DIV: variable value
Elle prend exactement 2 paramètres
Nombre de paramètres erroné
ERROR LINE (line_number):DIV has 2 parameters, you wrote (number_of_written_parameters)
Type de paramètre erroné pour variable
ERROR LINE (line_number):DIV parameter 1 requires a variable, you wrote (actual_written_parameter_value)
Type de paramètre erroné pour value
ERROR LINE (line_number):DIV parameter 2 requires a number or a variable, you wrote (actual_written_parameter_value)
Divise la valeur d'une variable par une valeur (valeur entière)
IDIV: variable value
Elle prend exactement 2 paramètres
Nombre de paramètres erroné
ERROR LINE (line_number):IDIV has 2 parameters, you wrote (number_of_written_parameters)
Type de paramètre erroné pour variable
ERROR LINE (line_number):IDIV parameter 1 requires a variable, you wrote (actual_written_parameter_value)
Type de paramètre erroné pour value
ERROR LINE (line_number):IDIV parameter 2 requires a number or a variable, you wrote (actual_written_parameter_value)
Le reste de la division d'une variable avec une valeur
MOD: variable value
Elle prend exactement 2 paramètres
Nombre de paramètres erroné:
ERROR LINE (line_number):MOD has 2 parameters, you wrote (number_of_written_parameters)
Type de paramètre erroné pour variable
ERROR LINE (line_number):MOD parameter 1 requires a variable, you wrote (actual_written_parameter_value)
Type de paramètre erroné pour value
ERROR LINE (line_number):MOD parameter 2 requires a number or a variable, you wrote (actual_written_parameter_value)
Pour un 0.2p supplémentaire, implémentez les imbrications pour LOOP, WHILE et IF.