Differences

This shows you the differences between two versions of the page.

Link to this comparison view

alf:teme:tema4 [2020/04/21 23:18]
diana.ghindaoanu
alf:teme:tema4 [2022/05/03 12:23] (current)
diana.ghindaoanu [Information]
Line 1: Line 1:
-====== Devoir 4 - Semantique ​======+====== Devoir 4 - Sémantique ​======
  
 ===== Information ===== ===== Information =====
  
 <note important>​ <note important>​
-Date limite: ** le mai, 23h55 ** \\+Date limite: ** le 22 mai, 23h55 ** \\
 Points: ** 2 points ** hors de la note finale \\ Points: ** 2 points ** hors de la note finale \\
-Téléchargez le devoir: [[https://vmchecker.cs.pub.ro|vmchecker.cs.pub.ro]] \\ +Téléchargez le devoir: [[https://classroom.github.com/​a/​P2YgEyZL ​GitHub Devoir 4]] \\ 
-Téléchargement tardif: ** 0,1 point / jour ** (maximum ​jours) \\+Téléchargement tardif: ** 1 point / jour ** (maximum ​jours) \\
 </​note>​ </​note>​
  
-===== Ce que vous devez faire =====+===== Demande ​=====
  
-Le but du devoir est de créer ​le tableau ​de symboles et d'​écrire l'​analyse sémantique pour le langage Alf.+L'​objectif ​du devoir est de créer ​la table de symboles et d'​écrire l'​analyse sémantique pour le langage Alf.
  
-Vous recevrez un AST de l'​analyseur ​qui analyse correctement ​une source de langue Alf et doit écrire+Vous recevrez ​comme entrée un fichier qui contient ​un AST qui analyse correctement ​un langage ​source. Ce que vous devez faire est de générer
-  - le tableau ​des symboles+  - la table des symboles
   - un nouvel AST avec les modifications suivantes   - un nouvel AST avec les modifications suivantes
-       - le nouvel AST est une liste de statements ​des fonctions +       - le nouvel AST est une liste d'​instructions (//statements//)  
-       - tous les noeuds de l'​AST ​auront ​une propriété appellée ​symbol_table ​qui fera référence a l'​entrée du tableau de symboles ou ils déclarent des variables, fonctions et types +       - tous les noeuds de l'​AST ​ont une nouvelle ​propriété appellée ​**symbol**, ​qui fait référence a l'​entrée du tableau de symboles ou ils déclarent des variables, fonctions et types 
-       - le programme principal s'​appelle "script+       - le programme principal s'​appelle "Statements
-           ​tous les autres définitions des fonctions seront transférées de l'​ancien AST vers le nouvel AST +   ​- une liste des erreurs ​
-           - toutes les noeuds de définition des variables sont supprimés ou, s'ils ont une attribution ''​@var i:int <- 3;'',​ seront remplacés par un noeud d'​attribution ''​i <- 3;''​ +
-   - la list des erreurs ​+
  
 <​note>​ <​note>​
-Toutes les trois exigences sont vérifiées et classées séparément. Les exemples qui ne produisent pas d'​erreurs recevront des points d'​erreur uniquement si le tableau ​de symboles et le nouvel AST sont corrects.+Toutes les trois exigences sont vérifiées et classées séparément. Les exemples qui ne produisent pas d'​erreurs recevront des points d'​erreur uniquement si la table de symboles et le nouvel AST sont corrects.
 </​note>​ </​note>​
  
Line 32: Line 30:
   * le fichier de sortie   * le fichier de sortie
 <code bash> <code bash>
-noeud main.js source.alf source.alf.json+node main.js source.alf.ast.json ​source.alf.json
 </​code>​ </​code>​
- 
-===== Le fichier de grammaire Alf ===== 
-Vous pouvez utiliser votre fichier de grammaire ou le fichier [[https://​github.com/​alexandruradovici/​alf2018/​blob/​master/​Devoirs/​alf/​grammar.jison|reference]] 
  
  
 ===== Conseils pour résoudre le devoir ===== ===== Conseils pour résoudre le devoir =====
  
-  * Faire le tableau ​des symboles +  * Générer la table des symboles 
-  * Déterminer tous les types de variables dans le tableau ​des symboles +  * Déterminer tous les types des variables dans la table des symboles 
-  * Déterminer les types pour toutes les instructions qui retournent un résultat +  * Déterminer les types pour toutes les instructions qui retournent un résultat ​(expressions,​ fonctions) 
-  * Lors de la détermination ​des types, écrivez les erreurs+  * Intégration ​des messages d'​erreur
  
 ===== Fichier de sortie ===== ===== Fichier de sortie =====
Line 51: Line 46:
 <code javascript>​ <code javascript>​
 { {
-    symbol_table:​ [...], // le tableau symbol_table +    symbol_table:​ [...], // la table de symboles 
-    ast: [...], // l'ast avec le type pour un noeud qui retourne une valeur+    ast: [...], // le nouvel AST
     error_list: [] // la liste des erreurs     error_list: [] // la liste des erreurs
 } }
 </​code>​ </​code>​
  
-===== Tableau des symboles =====+===== La table de symboles =====
  
-Le tableau des symboles est un objet Javascript, ou chaque propriété est le nom d'un contexte. Dans l'​exemple ci-dessous, on peut voir qu'il y a 2 contextes:​ +La table de symboles est une liste composée par des objets représentant des **contextes**. Dans l'​exemple ci-dessous, on peut voir qu'il y a 2 contextes:​ 
-  * //​script// ​- le contecte ​du script ​principal +  * **"​type":​ "​Statements"​** ​- le contexte ​du module ​principal, qui contient toutes les instructions 
-  * //​function_sum// ​- le contexte généré par la fonction ​sum+  * **"​type":​ "​function"​** ​- le contexte généré par la fonction ​_sum
  
 <code javascript>​ <code javascript>​
-+"symbol_table": ​
-   "script": { +    ​{
-      "​type":​ "​script",​+
       "​variables":​ {},       "​variables":​ {},
       "​functions":​ {       "​functions":​ {
-         "sum": { +        ​"_sum": { 
-            "​type":​ "int", +          "​type":​ "integer", 
-            "​parameters":​ [ +          "​parameters":​ [ 
-               ​{  +            
-                  "​type":​ "int", +              "​id":​ "​FunctionDefinitionParameter",​ 
-                  "title": "​n1",​ +              ​"​type":​ "integer", 
-                  "line": ​4 +              "name": "​n1",​ 
-               ​}, +              "symbol": ​1 
-               ​{  +            }, 
-                  "​type":​ "int", +            
-                  "title": "​n2",​ +              "​id":​ "​FunctionDefinitionParameter",​ 
-                  "line": ​4 +              ​"​type":​ "integer", 
-               ​+              "name": "​n2",​ 
-             ​], +              "symbol": ​1 
-             ​"​line":​ 4 +            
-          } +          ], 
-       ​}, +          "​line":​ 4, 
-       ​"​types":​ {}+          ​"​symbol":​ 1 
 +        ​
 +      }, 
 +      "​types":​ {}
 +      "​type":​ "​Statements"​
     },     },
-    ​"​function_sum": ​+    { 
-       "​title":​ "​sum",​ +      "​variables":​ {}, 
-       "​type":​ "​function",​ +      "functions": {}
-       "​parent":​ "​script",​ +      "types": ​{}
-       "​variables":​ { +      "parent": 0, 
-          "n1": { +      "​type":​ "function", 
-              "​type":​ "​int"​+      "function": "_sum", 
-              "parameter": ​true+      "return_type": "integer"
-              "index": 0 +
-          }+
-          "​n2":​ { +
-             "​type":​ "int", +
-             ​"parameter": ​true, +
-             "index": 1 +
-          } +
-       }+
-       ​"functions": ​{}, +
-       "types": {}+
     }     }
-}+  ]
 </​code>​ </​code>​
  
-Lors de la détermination ​de la table de symboles, ​ajoutez ​à chaque noeud AST un paramètre // symbole_table ​// avec le nom du tableau de symboles ou il a les variables, fonctions et types.+Lors de la création ​de la table de symboles, ​vous devez ajouter ​à chaque noeud AST un paramètre //symbole//, représentant l'​identifiant ​du contexte.
  
 ==== Objet de contexte ==== ==== Objet de contexte ====
-Les objets de contexte stockent+Les objets de contexte stockent ​les suivantes propriétés:​
   * la variable déclarée dans ce contexte   * la variable déclarée dans ce contexte
   * la fonction déclarée dans ce contexte   * la fonction déclarée dans ce contexte
   * les types (array, struct) déclarés dans ce contexte   * les types (array, struct) déclarés dans ce contexte
-  * l'​identifiant ​de contexte parent (position dans le tableau symbol_table) +  * l'​identifiant ​du contexte parent (position dans le tableau symbol_table) 
-  * le nom du contexte +  * le type du contexte (Statements ​ou function)  
-  * le type du contexte (script, statements ​ou function)  +  * le nom de la fonction, si le contexte est de type '​function'​, 
-  * le nom de la fonction, si le contexte est de type '​function'​ +  * le type de retour de la fonction 
 +  * 
 <​note>​ <​note>​
 Les objets de contexte sont générés par Les objets de contexte sont générés par
   * le module principal   * le module principal
-  * une définition de message+  * une définition de fonction
   * une classe   * une classe
 </​note>​ </​note>​
Line 133: Line 121:
 <code javascript>​ <code javascript>​
 { {
-   "​variables":​ {// un dictionnaire des variables+   "​variables":​ { // a dictionary of variables
       "​variable_name":​ {       "​variable_name":​ {
-         "​type":​ // type de la variable +         "​type":​ // type of the variable 
-         "​line":​ // la ligne où la variable ​a été déclarée +         "​line":​ // the line where the variable ​was declared 
-         "​value":​ // l'expression ​que la variable ​a initialement ​(facultatifsi elle a ete definie avec une valeur)+         "​value":​ // the expression ​that the variable ​initially has (optionalif the define was with an assignment)
       }       }
    },    },
-   "​functions": {// un dictionnaire des fonctions +   "​messages": { // a dictionary of functions 
-      ​function_title": { +      ​"​message_name": { 
-         "​type":​ // le type de retour de la fonction +         "​type":​ // the return ​type of the function 
-         "​parameters":​ [] // la liste des paramètres que la fonction prenne ​(le noeud parameters ​de l'AST) +         "​parameters":​ [] // the list of parameters the function takes (the parameters ​node from the AST) 
-         "​line":​ // la ligne où la fonction a été déclarée +         "​line":​ // the line where the function was declared 
-            +         "​symbol":​ // the context object id that the function creates 
 + 
       }       }
-   }, +   },  
-   "​types":​ {// un dictionnaire de types+   "​types":​ {  // a dictionary of types
       "​type":​ {       "​type":​ {
-               "​type":​ // le type de la nouvelle classe de type ou tableau +               "​type": ​ // the type of the new type class or array 
-               "​line":​ // la ligne où le type a été déclaré +               "​line": ​ // the line where the type was declared 
-               // ​pour le tableau +               // ​for array 
-               "​elements_type":​ // le type de chaque élément du tableau +               "​elements_type": ​ // the type of each array element 
-               "​first": // le premier ​index +               "​from": ​ // the first index 
-               "​length": // numero d'​elements +               "​to": // the last index 
-               // ​pour la classe +               // ​for class 
-               "​properties": [// une liste d'​éléments de tableau ​(le noeud de l'AST)+               "​elements": [ // a list of array elements ​(the node form the AST)
                   {                   {
-                     "​type":​ +                     "​type":​  
-                     "​title":​ +                     "​id":  
-                     "​value": +                     "​line": ​
-                     "​line": +
-                     "​symbol_table":+
                   },                   },
                   ...                   ...
Line 169: Line 156:
             }             }
    },    },
-   "​parent":​  +   "​parent": ​0, // the parent context position in the symbol_table (except of the main script that has no parent), usually 0,  
-   "​type":​ // +   "​type":​ // the type of the  
-   +   "​message":​ // the message name if this is a function context 
 +   "​class":​ // the class name if the context is in a message that is in a class 
 +   "​return_value":​ // the return type of the function if this is a function context
 } }
 </​code>​ </​code>​
  
-=== Noms des contextes ​=== +=== Exemple ​===
- +
-   - ''​script''​ - script +
-   - ''​function''​ - titre de la fonction +
-   - ''​if_then''​  +
-   - ''​loop_when''​ +
-   - ''​loop_go''​ +
- +
-===== Le nouvel AST ===== +
- +
-L'AST donné par le parser doit etre transformé afin de ne plus contenir de variables, fonctions ou définitions de types.  +
- +
-Le nouvel AST sera une liste d'​objets,​ chaque objet étant soit le script, soit une fonction.+
  
 <code javascript>​ <code javascript>​
-[ +{ 
-   ​"script": { +      "variables": {}, 
-      ​statements: [ +      ​"​functions":​ { 
-         ... +        "​_sum":​ { 
-      ] +          "​type":​ "​integer",​ 
-   }+          "​parameters"​: [ 
-   ​"function_title": { +            { 
-      ​statements[ +              "​id":​ "​FunctionDefinitionParameter",​ 
-         ... +              "​type":​ "​integer"​
-      ] +              "name": ​"​n1",​ 
-   ​+              "​symbol":​ 1 
-]+            }, 
 +            ​
 +              "​id"​"​FunctionDefinitionParameter",​ 
 +              "​type":​ "​integer",​ 
 +              "​name":​ "​n2",​ 
 +              "​symbol":​ 1 
 +            ​
 +          ]
 +          "​line":​ 4, 
 +          "​symbol":​ 1 
 +        } 
 +      }, 
 +      "​types":​ {}, 
 +      "​type":​ "​Statements"​ 
 +    }
 </​code>​ </​code>​
  
-==== Définition des variables ==== 
- 
-Les définitions des variables seront écrites dans le tableau de symboles. La définition sera supprimée de l'AST (elle ne sera pas placée dans les statements). Si la définition inclut une attribution ''​@var x: int <- 7;'',​ elle sera remplacée par un noeud d'​attribution equivalent a ''​x <- 7;''​. 
- 
-==== Définition des types ==== 
- 
-Les structures et les vecteurs sont des définitions des types. Ils seront écrits dans la partie ''​types''​ du tableau de symboles. 
- 
-Pour struct, si les propriétés ont des valeurs par défaut, chaque déclaration de variable de la structure sera remplacée par des attribution pour toutes les propriétés. Il y a un [[https://​github.com/​UPB-FILS/​alf/​blob/​master/​Devoir/​semantic/​verify/​semantic/​4_struct/​definition_with_values_and_variable.alf|example]] dans le repository. 
  
 ===== Vérification des types dans l'AST ===== ===== Vérification des types dans l'AST =====
  
-==== Type de retour ​d'​expression ​====+==== Type de retour ​des expressions ​====
 Pour chacun des noeuds suivants, déterminez le type de retour Pour chacun des noeuds suivants, déterminez le type de retour
-  * expr +  * Expression 
-  * value +  * Value 
-  * identifier +  * Variable 
-  * return +  * ReturnFunction 
-  * element_of_vector +  * ArrayElement 
-  * property +  * ClassProperty 
-  * function+  * FunctionDefinition
  
 Définissez le type en ajoutant une propriété type dans le noeud. Définissez le type en ajoutant une propriété type dans le noeud.
-Tous les autres éléments ont le type de retour ''​none''​. S'il y a une erreur de types, le type sera error. 
  
 <​note>​ <​note>​
-Au moment de la recherche d'une variable, l''​algorithme est:+L'algorithme pour chercher ​une variable ​suppose les étapes suivantes:
  
-   ​- ​recherche ​dans le contexte ​local +   ​- ​S'il s'agit d'un contexte de fonction, recherchez ​dans le contexte ​des variables locales 
-   ​- ​si on n'obtient ​pas un résultatrecherche ​dans le contexte ​parent+   ​- ​S'​il ​n'pas été trouvécherchez dans les parametres 
 +   - S'il n'a pas été trouvé, chechez ​dans le contexte ​des variables locales des classes 
 +   - S'il s'agit du contexte du module principal, cherchez dans les variables globales
  
 </​note>​ </​note>​
Line 239: Line 222:
 === Exemple === === Exemple ===
 <code javascript>​ <code javascript>​
-  ​ +
-   ​"​id":​ "expr", +         ​"​id":​ "Expression", 
-   ​"​op":​ "​+",​ +         ​"​op":​ "​+",​ 
-   ​"​left":​ { +         ​"​left":​ { 
-         ​"​id":​ "value", +           ​"​id":​ "Value", 
-         ​"​type":​ "int", +           ​"​type":​ "integer", 
-         ​"​value": ​"2"+           ​"​value":​ 2, 
-         ​"​line": ​3+           ​"​line": ​5
-         ​"symbol_table": ​"​script",  ​ +           ​"symbol": ​0 
-   ​}, +         ​}, 
-   ​"​right":​ { +         ​"​right":​ { 
-         ​"​id":​ "value", +           ​"​id":​ "FunctionCall", 
-         ​"type": "int", +           ​"function_name": "number", 
-         ​"value": ​3+           ​"parameters": ​[]
-         ​"​line": ​3+           ​"​line": ​5
-         ​"symbol_table": "script+           ​"symbol": ​0, 
-   ​}, +           "type": "​integer
-   ​"​line": ​3+         ​}, 
-   ​"symbol_table": ​script+         ​"​line": ​5
-   ​"​type":​ "int+         ​"symbol": ​0
-}+         ​"​type":​ "integer
 +       ​}
 </​code>​ </​code>​
  
  
-==== Vérifier les types ====+==== Vérification de la correctitude du langage ​====
 Pour tous les noeuds AST, vérifiez que les types correspondent:​ Pour tous les noeuds AST, vérifiez que les types correspondent:​
-  * attributions sont faisables+  * les attributions sont faisables
   * les expressions peuvent être calculées   * les expressions peuvent être calculées
-  * l'​expression if / while / repeat a une valeur logique 
   * la variable est un nombre / string / boolean   * la variable est un nombre / string / boolean
-  * que les variables sont définies avant d'​être utilisées+  * les variables sont définies avant d'​être utilisées
   * les fonctions sont définies avant d'​être utilisées   * les fonctions sont définies avant d'​être utilisées
-  * les index de tableau sont des nombres+  * les indices ​de tableau sont des nombres
   * les propriétés de la classe existent   * les propriétés de la classe existent
   * la variable pour element_of_array est un tableau   * la variable pour element_of_array est un tableau
Line 279: Line 262:
   * les types ne sont pas redéfinis   * les types ne sont pas redéfinis
  
-<​note>​ 
-C'est là que la plupart des erreurs apparaissent. 
-</​note>​ 
  
 ===== Liste d'​erreurs ===== ===== Liste d'​erreurs =====
Line 292: Line 272:
 <code javascript>​ <code javascript>​
 { {
-    type: // chaîne avec le type d'​erreur +    type: //  ​string with the error type 
-    ​elements+    ​line: // the line number in the source (starting at 1) 
-       // éléments pour l'​erreur,​ chaque type d'​erreur a des éléments différents +    ​elements: // items for the erroreach type of error has different items 
-       line: +    text: // the error text message
-    ​}+
-    text: // le message ​d'​erreur+
 } }
 </​code>​ </​code>​
Line 310: Line 288:
 <code javascript>​ <code javascript>​
 { {
-    ​variable: ​// nom de la variable+       "​type":​ "​VARIABLE_ALREADY_DEFINED",​ 
 +       "​line":​ 5, 
 +       "​elements":​ { 
 +         "​variable": "​var_name"​ 
 +       }, 
 +       "​text"​"variable ​var_name is already defined"​
 } }
 </​code>​ </​code>​
Line 320: Line 303:
 <code javascript>​ <code javascript>​
 { {
-    function// nom de la fonction+       "​type"​"​FUNCTION_ALREADY_DEFINED",​ 
 +       "​line":​ 5, 
 +       "​elements":​ { 
 +         "​variable":​ "​function_name"​ 
 +       }, 
 +       "​text":​ "​Function function_name is already defined"​
 } }
 </​code>​ </​code>​
Line 330: Line 318:
 <code javascript>​ <code javascript>​
 { {
-    ​type: // nom du type +       "​type""​TYPE_ALREADY_DEFINED",​ 
-}+       "​elements":​ { 
 +         "​type": "​s"​ 
 +       }, 
 +       "​text":​ "type s is already defined"​ 
 +     }
 </​code>​ </​code>​
  
-=== STRUCT_PROPERTY_ALREADY_DEFINED ​=== +=== CLASS_PROPERTY_ALREADY_DEFINED ​=== 
-L'​erreur se produit lorsqu'​une définition d'​élément ​struct ​est répétée.+L'​erreur se produit lorsqu'​une définition d'​élément ​class est répétée.
  
 == Eléments == == Eléments ==
 <code javascript>​ <code javascript>​
 { {
-    type: // nom du type de structure +       "​type""​CLASS_PROPERTY_ALREADY_DEFINED",​ 
-    title: // nom de l'élément+       "​line"​5, 
 +       "​elements":​ { 
 +         "​struct":​ "​s" ​// class_name 
 +       }, 
 +       "​text":​ "​struct's class_name element title is already defined"​ 
 } }
 </​code>​ </​code>​
Line 351: Line 348:
 <code javascript>​ <code javascript>​
 { {
-    array: ​// nom du type de tableau +       "​type":​ "​ARRAY_INDEX_VALUE",​ 
-    length:  +       "​line":​ 3, 
-}+       "​elements":​ { 
 +         "​array""​array_name",​ 
 +         "​low_index":​ "​low_index_value",​ 
 +         "​high_index":​ "​high_index_value"​ 
 +       }, 
 +       "​text"​"Array index lower value (low_index_value) must be smaller that the upper value (high_index_value)"​ 
 +     ​}
 </​code>​ </​code>​
  
Line 374: Line 377:
  
 === UNDEFINED_FUNCTION === === UNDEFINED_FUNCTION ===
-L'​erreur se produit lorsqu'​un appel de fonction est effectué ​sur une fonction qui n'est pas définie.+L'​erreur se produit lorsqu'​un appel de fonction est effectué ​pour une fonction qui n'est pas définie.
  
 == Eléments == == Eléments ==
 <code javascript>​ <code javascript>​
 { {
-   title// nom du message+       "​type"​"​UNDEFINED_FUNCTION",​ 
 +       "​line":​ 2, 
 +       "​elements":​ { 
 +         "​id":​ "​function_name"​ 
 +       }, 
 +       "​text":​ "​Undefined function function_name"​
 } }
 </​code>​ </​code>​
Line 389: Line 397:
 <code javascript>​ <code javascript>​
 { {
-   variable: ​// nom de la variable+       "​type":​ "​UNDEFINED_VARIABLE",​ 
 +       "​line":​ 3, 
 +       "​elements":​ { 
 +         "​variable": "​var_name"​ 
 +       }, 
 +       "​text"​"​Undefined ​variable ​var_name"​
 } }
 </​code>​ </​code>​
Line 398: Line 411:
 == Eléments == == Eléments ==
 { {
-    value//le type qui n'est pas definit+       "​type":​ "​UNDEFINED_TYPE",​ 
 +       "​line":​ 3, 
 +       "​elements":​ { 
 +         "​variable":​ "​type_name"​ 
 +       }, 
 +       "​text"​"​Undefined ​type type_name"​
 } }
  
-=== NOT_STRUCT_PROPERTY === 
-L'​erreur se produit lorsqu'​un élément ne fait pas partie de cette structure. 
- 
-== Eléments == 
-<code javascript>​ 
-{ 
-   type: // nom de la structure 
-   title:​ // nom de l'​élément 
-} 
-</​code>​ 
  
 === NOT_STRUCT === === NOT_STRUCT ===
Line 418: Line 426:
 <code javascript>​ <code javascript>​
 { {
-   type: // type réel que la variable est (au lieu d'​un ​type struct)+        "type""​NOT_STRUCT",​ 
 +        "​line":​ 13, 
 +        "​elements":​ { 
 +          "type": "​var_name"​ 
 +        }, 
 +        "​text":​ "​var_name is not a struct"
 } }
 +
 </​code>​ </​code>​
  
Line 428: Line 442:
 <code javascript>​ <code javascript>​
 { {
-   type: // type réel que la variable est (au lieu d'un type de tableau)+       "​type""​NOT_ARRAY",​ 
 +       "​line":​ 5, 
 +       "​elements":​ { 
 +         "​type": "​var_name"​ 
 +       }, 
 +       "​text":​ "​var_name is not an array"
 } }
 </​code>​ </​code>​
Line 438: Line 457:
 <code javascript>​ <code javascript>​
 { {
-   type:  +       "​type""​ARRAY_INDEX_TYPE",​ 
-}+       "​line":​ 7, 
 +       "​elements":​ { 
 +         "​array":​ "​array_name",​ 
 +         "​index":​ "​string"​ 
 +       }, 
 +       "​text":​ "Array (array_name) index must be integer or symbol"​ 
 +     }
 </​code>​ </​code>​
  
-=== RETURN_OUTSIDE_MESSAGE ​===+=== RETURN_OUTSIDE_FUNCTION ​===
 L'​erreur se produit lorsqu'​une instruction de valeur (noeud de retour) est utilisée en dehors d'un message L'​erreur se produit lorsqu'​une instruction de valeur (noeud de retour) est utilisée en dehors d'un message
  
Line 448: Line 473:
 <code javascript>​ <code javascript>​
 { {
-   // vide+       "​type":​ "​RETURN_OUTSIDE_FUNCTION",​ 
 +       "​line":​ 3, 
 +       "​elements":​ {}, 
 +       "​text":​ "value is used out of function"​
 } }
 </​code>​ </​code>​
Line 457: Line 485:
 == Eléments == == Eléments ==
 <code javascript>​ <code javascript>​
-// left op right 
 { {
-    left: +       "​type""​TYPE_EXPRESSION"​
-    right: +       ​"line": ​6, 
-    op: +       ​"elements": { 
-+         "op": "=", 
-// op value +         "to""​to_type"​
-+         "from""​from_type"​ 
-    value: +       ​}, 
-    op: +       "text""Type expression error to_type is from_type"​
-+
-// if, loop-go, loop-when +
-+
-    exp: // expression ​type +
-    op// ifwhile, repeat +
-} from: // provided type +
-// assign +
-+
-    to: // to type +
-    op: "<-" +
-    from// from type +
-+
-// return +
-+
-   ​op: ​"return" +
-   to// type de return +
-   from: //type +
-+
-// iteration (for i in exp go) +
-+
-    op"iteration"​ +
-    value: // the exp type +
-+
-// typecast +
-+
-    op: "typecast", +
-    to: // to type+
-    from: // from type +
-+
- +
-=== LEXICAL === +
-Ceci est une erreur lexicale. +
- +
-== Eléments == +
-+
-    line:​ // le numéro de ligne +
-    text: // le texte de l'​erreur +
-+
-</ code> +
- +
-=== SYNTAXE === +
-Ceci est une erreur de syntaxe +
- +
-== Eléments == +
-<code javascript>​ +
-+
-    line:​ // le numéro de ligne +
-    text:​ // le texte de l'​erreur +
-    token: // le jeton obtenu +
-    expected: [] / la liste des jetons attendus+
 } }
 </​code>​ </​code>​
- 
  
 ===== Bonus ===== ===== Bonus =====
Line 544: Line 520:
 Si vous souhaitez recevoir un e-mail lorsque des problèmes sont signalés ou lorsqu'​il y a de nouveaux messages, accédez au site github [[https://​github.com/​alexandruradovici/​alf2018|repository]] et cliquez sur // Watch //. Si vous souhaitez recevoir un e-mail lorsque des problèmes sont signalés ou lorsqu'​il y a de nouveaux messages, accédez au site github [[https://​github.com/​alexandruradovici/​alf2018|repository]] et cliquez sur // Watch //.
  
-===== Tests ===== 
  
-Les devoirs seront testés automatiquement en utilisant un ensemble de tests publics et privés. 
- 
-==== Tests publics ==== 
- 
-Vous pouvez télécharger les tests publics de GitHub [[https://​github.com/​alexandruradovici/​alf2018.git|repository]]. 
- 
-Pour exécuter les tests, téléchargez le contenu du référentiel dans le directoire avec les devoirs. Entrez dans le directoire // verify // et exécutez ./​run_all.sh. 
- 
-<code bash> 
-cd verify 
-./​run_all.sh 
-</​code>​ 
- 
-Vous aurez besoin de bash pour ça. Vous pouvez utiliser Linux ou [[https://​msdn.microsoft.com/​fr-fr/​commandline/​wsl/​install_guide|Windows Linux Subsystem]]. 
- 
-<​note>​ 
-Pour installer nodejs sous Linux ou Windows Linux Subsystem, procédez comme suit: 
- 
-<code bash> 
-wget https://​nodejs.org/​dist/​v8.9.4/​node-v8.9.4-linux-x64.tar.xz 
-tar xvfJ node-v8.9.4-linux-x64.tar.xz 
-cd node-v8.9.4-linux-x64 
-sudo cp -R * /usr 
-</​code>​ 
-   
-</​note>​ 
- 
-==== Tests privés ==== 
-Lors du téléchargement des devoirs, il est possible qu'on a des tests privés à faire passer. vmchecker les exécutera. 
- 
-<​note>​ 
-Vous pouvez toujours télécharger les devoirs autant de fois que vous le souhaitez jusqu'​à la date limite. Cela va exécuter tous les tests pour vous et afficher le résultat. 
-</​note>​ 
- 
-===== Télécharger les devoirs ===== 
-Le devoir doit être téléchargé sur [[https://​vmchecker.cs.pub.ro | vmchecker]]. Connectez-vous avec votre nom d'​utilisateur moodle, sélectionnez le //cours Automates et Langages Formelles (FILS)// et téléchargez [[# homework-archive | homework archive]]. 
- 
-==== Readme ==== 
-Le fichier readme a le format suivant: 
- 
-<​code>​ 
-Nom complet 
-Groupe 
- 
-Une explication comment vous avez écrit vos devoirs, qu'​avez vous utilisé, quelles sont les idées principales. 
-</​code>​ 
- 
- 
-==== Archive des devoirs ==== 
-Pour télécharger vos devoirs, suivez les instructions suivantes: 
- 
-  - Créer une archive zip (pas rar, ace, 7zip ou autre) conten 
-    * votre fichier principal 
-    * votre fichier grammar.jison 
-    * vos fichiers javascript (*.js) 
-    * le fichier package.json 
-    * le fichier Readme 
-  - Connectez-vous avec [[https://​vmchecker.cs.pub.ro | vmchecker]] 
-  - sélectionner les //Automates et Langages Formelles (FILS)// cours 
-  - sélectionnez //4. Sémantique//​ 
-  - télécharger l'​archive 
- 
- 
-<​note>​ 
-L'​archive doit contenir les fichiers dans sa racine, pas dans un directoire. NE PAS archiver un dossier avec des fichiers, archiver DIRECTEMENT les fichiers. 
- 
-NE PAS inclure // node_modules //. 
-</​note>​ 
- 
-Lorsque l'​archive est téléchargée,​ vmchecker va exécuter: 
- 
-<code bash> 
-unzip archive.zip homework 
-cd homework 
-npm install 
-echo '{ "​node":​true,​ "​esnext":​true }' > .jshintrc 
-jshint *.js 
-</​code>​ 
alf/teme/tema4.1587500320.txt.gz · Last modified: 2020/04/21 23:18 by diana.ghindaoanu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0