This shows you the differences between two versions of the page.
|
alf:teme:tema3_java [2023/05/12 12:51] amalia.simion [Objet de contexte] |
alf:teme:tema3_java [2023/05/12 13:21] (current) amalia.simion [Devoir 4 - Sémantique] |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Devoir 4 - Sémantique ====== | + | ====== Devoir 3 - Sémantique ====== |
| ===== Information ===== | ===== Information ===== | ||
| <note important> | <note important> | ||
| - | Date limite: ** le 22 mai, 23h55 ** \\ | + | Date limite: ** le 26 mai, 23h59 ** \\ |
| Points: ** 2 points ** hors de la note finale \\ | Points: ** 2 points ** hors de la note finale \\ | ||
| - | Téléchargez le devoir: [[https://classroom.github.com/a/P2YgEyZL | GitHub Devoir 4]] \\ | + | Téléchargez le devoir: [[https://classroom.github.com/a/QARUXoMs | GitHub Devoir 3]] \\ |
| Téléchargement tardif: ** 1 point / jour ** (maximum 3 jours) \\ | Téléchargement tardif: ** 1 point / jour ** (maximum 3 jours) \\ | ||
| </note> | </note> | ||
| Line 141: | Line 141: | ||
| * une loop for (la variable locale utilise pour l'index) | * une loop for (la variable locale utilise pour l'index) | ||
| </note> | </note> | ||
| - | |||
| - | L'objet ressemble à: | ||
| - | |||
| - | <code javascript> | ||
| - | { | ||
| - | "variables": { // a dictionary of variables | ||
| - | "variable_name": { | ||
| - | "type": // type of the variable | ||
| - | "line": // the line where the variable was declared | ||
| - | "value": // the expression that the variable initially has (optional, if the define was with an assignment) | ||
| - | } | ||
| - | }, | ||
| - | "messages": { // a dictionary of functions | ||
| - | "message_name": { | ||
| - | "type": // the return type of the function | ||
| - | "parameters": [] // the list of parameters the function takes (the parameters node from the AST) | ||
| - | "line": // the line where the function was declared | ||
| - | "symbol": // the context object id that the function creates | ||
| - | |||
| - | } | ||
| - | }, | ||
| - | "types": { // a dictionary of types | ||
| - | "type": { | ||
| - | "type": // the type of the new type class or array | ||
| - | "line": // the line where the type was declared | ||
| - | // for array | ||
| - | "elements_type": // the type of each array element | ||
| - | "from": // the first index | ||
| - | "to": // the last index | ||
| - | // for class | ||
| - | "elements": [ // a list of array elements (the node form the AST) | ||
| - | { | ||
| - | "type": | ||
| - | "id": | ||
| - | "line": | ||
| - | }, | ||
| - | ... | ||
| - | ] | ||
| - | } | ||
| - | }, | ||
| - | "parent": 0, // the parent context position in the symbol_table (except of the main script that has no parent), usually 0, | ||
| - | "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> | ||
| - | |||
| - | === Exemple === | ||
| - | |||
| - | <code javascript> | ||
| - | { | ||
| - | "variables": {}, | ||
| - | "functions": { | ||
| - | "_sum": { | ||
| - | "type": "integer", | ||
| - | "parameters": [ | ||
| - | { | ||
| - | "id": "FunctionDefinitionParameter", | ||
| - | "type": "integer", | ||
| - | "name": "n1", | ||
| - | "symbol": 1 | ||
| - | }, | ||
| - | { | ||
| - | "id": "FunctionDefinitionParameter", | ||
| - | "type": "integer", | ||
| - | "name": "n2", | ||
| - | "symbol": 1 | ||
| - | } | ||
| - | ], | ||
| - | "line": 4, | ||
| - | "symbol": 1 | ||
| - | } | ||
| - | }, | ||
| - | "types": {}, | ||
| - | "type": "Statements" | ||
| - | } | ||
| - | </code> | ||
| - | |||
| ===== Vérification des types dans l'AST ===== | ===== Vérification des types dans l'AST ===== | ||
| Line 248: | Line 169: | ||
| <code javascript> | <code javascript> | ||
| { | { | ||
| - | "id": "Expression", | + | "@class" : "org.easycompiler.ast.BinaryExpression", |
| - | "op": "+", | + | "errors" : [ "java.util.ArrayList", [ ] ], |
| - | "left": { | + | "line" : 5, |
| - | "id": "Value", | + | "typeName" : "integer", |
| - | "type": "integer", | + | "left" : { |
| - | "value": 2, | + | "@class" : "org.easycompiler.ast.Value", |
| - | "line": 5, | + | "errors" : [ "java.util.ArrayList", [ ] ], |
| - | "symbol": 0 | + | "line" : 5, |
| - | }, | + | "typeName" : "integer", |
| - | "right": { | + | "value" : "2" |
| - | "id": "FunctionCall", | + | }, |
| - | "function_name": "number", | + | "right" : { |
| - | "parameters": [], | + | "@class" : "org.easycompiler.ast.FunctionCall", |
| - | "line": 5, | + | "errors" : [ "java.util.ArrayList", [ ] ], |
| - | "symbol": 0, | + | "line" : 5, |
| - | "type": "integer" | + | "typeName" : "integer", |
| - | }, | + | "function_name" : { |
| - | "line": 5, | + | "@class" : "org.easycompiler.ast.Identifier", |
| - | "symbol": 0, | + | "errors" : [ "java.util.ArrayList", [ ] ], |
| - | "type": "integer" | + | "line" : 5, |
| - | } | + | "typeName" : "number", |
| + | "title" : "number" | ||
| + | }, | ||
| + | "arguments" : [ "java.util.ArrayList", [ ] ] | ||
| + | }, | ||
| + | "op" : "ADD" | ||
| + | } | ||
| </code> | </code> | ||
| Line 290: | Line 217: | ||
| ===== Liste d'erreurs ===== | ===== Liste d'erreurs ===== | ||
| - | La liste d'erreurs est un tableau qui contient des objets d'erreur. L'ordre dans lequel ces erreurs figurent dans la liste vous appartient. | + | La liste d'erreurs est une liste contient des objets d'erreur avec le type d'erreur. L'ordre dans lequel ces erreurs figurent dans la liste vous appartient. |
| - | ==== Format d'objet d'erreur ==== | + | Pour les types des erreurs s'il vous plait verifie l'enum **SemanticError.Type** |
| - | + | ||
| - | Chaque erreur a le format suivant: | + | |
| - | <code javascript> | + | |
| - | { | + | |
| - | type: // string with the error type | + | |
| - | line: // the line number in the source (starting at 1) | + | |
| - | elements: // items for the error, each type of error has different items | + | |
| - | text: // the error text message | + | |
| - | } | + | |
| - | </code> | + | |
| - | ==== Type d'erreur ==== | + | |
| - | + | ||
| - | Le type d'erreur est une chaîne avec l'un des titres suivants | + | |
| - | + | ||
| - | === VARIABLE_ALREADY_DEFINED === | + | |
| - | L'erreur se produit lorsqu'une définition de variable est répétée. | + | |
| - | + | ||
| - | == Eléments == | + | |
| - | <code javascript> | + | |
| - | { | + | |
| - | "type": "VARIABLE_ALREADY_DEFINED", | + | |
| - | "line": 5, | + | |
| - | "elements": { | + | |
| - | "variable": "var_name" | + | |
| - | }, | + | |
| - | "text": "variable var_name is already defined" | + | |
| - | } | + | |
| - | </code> | + | |
| - | + | ||
| - | === FUNCTION_ALREADY_DEFINED === | + | |
| - | L'erreur se produit lorsqu'une définition de fonction est répétée. | + | |
| - | + | ||
| - | == Eléments == | + | |
| - | <code javascript> | + | |
| - | { | + | |
| - | "type": "FUNCTION_ALREADY_DEFINED", | + | |
| - | "line": 5, | + | |
| - | "elements": { | + | |
| - | "variable": "function_name" | + | |
| - | }, | + | |
| - | "text": "Function function_name is already defined" | + | |
| - | } | + | |
| - | </code> | + | |
| - | + | ||
| - | === TYPE_ALREADY_DEFINED === | + | |
| - | L'erreur se produit lors de la répétition d'une définition de type (tableau ou struct). | + | |
| - | + | ||
| - | == Eléments == | + | |
| - | <code javascript> | + | |
| - | { | + | |
| - | "type": "TYPE_ALREADY_DEFINED", | + | |
| - | "elements": { | + | |
| - | "type": "s" | + | |
| - | }, | + | |
| - | "text": "type s is already defined" | + | |
| - | } | + | |
| - | </code> | + | |
| - | + | ||
| - | === CLASS_PROPERTY_ALREADY_DEFINED === | + | |
| - | L'erreur se produit lorsqu'une définition d'élément class est répétée. | + | |
| - | + | ||
| - | == Eléments == | + | |
| - | <code javascript> | + | |
| - | { | + | |
| - | "type": "CLASS_PROPERTY_ALREADY_DEFINED", | + | |
| - | "line": 5, | + | |
| - | "elements": { | + | |
| - | "struct": "s" // class_name | + | |
| - | }, | + | |
| - | "text": "struct's class_name element title is already defined" | + | |
| - | + | ||
| - | } | + | |
| - | </code> | + | |
| - | + | ||
| - | === ARRAY_INDEX_VALUE === | + | |
| - | L'erreur se produit lorsque l'index inférieur du tableau est supérieur à l'index supérieur | + | |
| - | + | ||
| - | == Eléments == | + | |
| - | <code javascript> | + | |
| - | { | + | |
| - | "type": "ARRAY_INDEX_VALUE", | + | |
| - | "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> | + | |
| - | + | ||
| - | === TYPE_RESOLUTION === | + | |
| - | L'erreur se produit lorsque le type d'une variable n'est pas déterminable (bonus uniquement). | + | |
| - | + | ||
| - | == Eléments == | + | |
| - | <code javascript> | + | |
| - | // variable | + | |
| - | { | + | |
| - | variable: // le nom de la variable avec le type non résolu | + | |
| - | } | + | |
| - | // struct property | + | |
| - | { | + | |
| - | struct: // nom du type de structure | + | |
| - | property: // nom de l'élément struct avec le type non résolu | + | |
| - | } | + | |
| - | + | ||
| - | </code> | + | |
| - | + | ||
| - | === UNDEFINED_FUNCTION === | + | |
| - | L'erreur se produit lorsqu'un appel de fonction est effectué pour une fonction qui n'est pas définie. | + | |
| - | + | ||
| - | == Eléments == | + | |
| - | <code javascript> | + | |
| - | { | + | |
| - | "type": "UNDEFINED_FUNCTION", | + | |
| - | "line": 2, | + | |
| - | "elements": { | + | |
| - | "id": "function_name" | + | |
| - | }, | + | |
| - | "text": "Undefined function function_name" | + | |
| - | } | + | |
| - | </code> | + | |
| - | + | ||
| - | === UNDEFINED_VARIABLE === | + | |
| - | L'erreur se produit lorsqu'une variable non définie est utilisée. | + | |
| - | + | ||
| - | == Eléments == | + | |
| - | <code javascript> | + | |
| - | { | + | |
| - | "type": "UNDEFINED_VARIABLE", | + | |
| - | "line": 3, | + | |
| - | "elements": { | + | |
| - | "variable": "var_name" | + | |
| - | }, | + | |
| - | "text": "Undefined variable var_name" | + | |
| - | } | + | |
| - | </code> | + | |
| - | + | ||
| - | === UNDEFINED_TYPE === | + | |
| - | L'erreur se produit lorsqu'un type qui n'est pas défini est utilisé. | + | |
| - | + | ||
| - | == Eléments == | + | |
| - | { | + | |
| - | "type": "UNDEFINED_TYPE", | + | |
| - | "line": 3, | + | |
| - | "elements": { | + | |
| - | "variable": "type_name" | + | |
| - | }, | + | |
| - | "text": "Undefined type type_name" | + | |
| - | } | + | |
| - | + | ||
| - | + | ||
| - | === NOT_STRUCT === | + | |
| - | L'erreur se produit lorsqu'une propriété est demandée pour une variable qui n'est pas un type de classe | + | |
| - | + | ||
| - | == Eléments == | + | |
| - | <code javascript> | + | |
| - | { | + | |
| - | "type": "NOT_STRUCT", | + | |
| - | "line": 13, | + | |
| - | "elements": { | + | |
| - | "type": "var_name" | + | |
| - | }, | + | |
| - | "text": "var_name is not a struct" | + | |
| - | } | + | |
| - | + | ||
| - | </code> | + | |
| - | + | ||
| - | === NOT_ARRAY === | + | |
| - | L'erreur se produit lorsqu'un index est demandé pour une variable qui n'est pas un tableau | + | |
| - | + | ||
| - | == Eléments == | + | |
| - | <code javascript> | + | |
| - | { | + | |
| - | "type": "NOT_ARRAY", | + | |
| - | "line": 5, | + | |
| - | "elements": { | + | |
| - | "type": "var_name" | + | |
| - | }, | + | |
| - | "text": "var_name is not an array" | + | |
| - | } | + | |
| - | </code> | + | |
| - | + | ||
| - | === ARRAY_INDEX_TYPE === | + | |
| - | L'erreur se produit lorsqu'un index pour un tableau n'est pas un nombre ou un symbole | + | |
| - | + | ||
| - | == Eléments == | + | |
| - | <code javascript> | + | |
| - | { | + | |
| - | "type": "ARRAY_INDEX_TYPE", | + | |
| - | "line": 7, | + | |
| - | "elements": { | + | |
| - | "array": "array_name", | + | |
| - | "index": "string" | + | |
| - | }, | + | |
| - | "text": "Array (array_name) index must be integer or symbol" | + | |
| - | } | + | |
| - | </code> | + | |
| - | + | ||
| - | === RETURN_OUTSIDE_FUNCTION === | + | |
| - | L'erreur se produit lorsqu'une instruction de valeur (noeud de retour) est utilisée en dehors d'un message | + | |
| - | + | ||
| - | == Eléments == | + | |
| - | <code javascript> | + | |
| - | { | + | |
| - | "type": "RETURN_OUTSIDE_FUNCTION", | + | |
| - | "line": 3, | + | |
| - | "elements": {}, | + | |
| - | "text": "value is used out of function" | + | |
| - | } | + | |
| - | </code> | + | |
| - | + | ||
| - | === TYPE_EXPRESSION === | + | |
| - | L'erreur se produit lorsqu'une expression a des types incompatibles | + | |
| - | + | ||
| - | == Eléments == | + | |
| - | <code javascript> | + | |
| - | { | + | |
| - | "type": "TYPE_EXPRESSION", | + | |
| - | "line": 6, | + | |
| - | "elements": { | + | |
| - | "op": "=", | + | |
| - | "to": "to_type", | + | |
| - | "from": "from_type" | + | |
| - | }, | + | |
| - | "text": "Type expression error to_type is from_type" | + | |
| - | } | + | |
| - | </code> | + | |
| ===== Bonus ===== | ===== Bonus ===== | ||
| Line 537: | Line 236: | ||
| ===== Questions ===== | ===== Questions ===== | ||
| - | Si vous avez des questions concernant les devoirs, posez-les en postant un problème sur le github [[https://github.com/alexandruradovici/alf2018.git|repository]] avec le format de titre // [semantic] <votre titre de la question> //. Vous aurez besoin d'un compte github pour cela. | + | Si vous avez des questions concernant les devoirs, posez-les en postant un problème sur le github [[https://github.com/UPB-FILS-ALF/questions|repository]] avec le format de titre // [semantic] <votre titre de la question> //. Vous aurez besoin d'un compte github pour cela. |
| <note warning> | <note warning> | ||
| Line 543: | Line 242: | ||
| </note> | </note> | ||
| - | 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/UPB-FILS-ALF/questions|repository]] et cliquez sur // Watch //. |