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 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 programme recevra deux paramètres de la ligne de commande:
java ... com.example.Main source.alf.ast.json source.alf.json
Le format du fichier de sortie est le suivant
{ symbol_table: [...], // la table de symboles ast: [...], // le nouvel AST error_list: [] // la liste des erreurs }
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:
"symbolTable" : { "@class" : "org.easycompiler.semantic.SymbolTable", "errors" : [ "java.util.ArrayList", [ ] ], "variables" : { "@class" : "java.util.HashMap" }, "types" : { "@class" : "java.util.HashMap" }, "functions" : { "@class" : "java.util.HashMap", "_sum" : { "@class" : "org.easycompiler.type.Function", "errors" : [ "java.util.ArrayList", [ ] ], "title" : null, "symbolTable" : { "@class" : "org.easycompiler.semantic.SymbolTable", "errors" : [ "java.util.ArrayList", [ ] ], "variables" : { "@class" : "java.util.HashMap", "n1" : "integer", "n2" : "integer" }, "types" : { "@class" : "java.util.HashMap", "integer" : { "@class" : "org.easycompiler.type.Integer", "errors" : [ "java.util.ArrayList", [ ] ], "title" : "integer", "type" : "I64" } }, "functions" : { "@class" : "java.util.HashMap" } }, "parameters" : [ "java.util.ArrayList", [ { "@class" : "org.easycompiler.ast.Property", "errors" : [ "java.util.ArrayList", [ ] ], "line" : 4, "typeName" : "integer", "title" : "n1", "value" : null }, { "@class" : "org.easycompiler.ast.Property", "errors" : [ "java.util.ArrayList", [ ] ], "line" : 4, "typeName" : "integer", "title" : "n2", "value" : null } ] ], "statements" : { "@class" : "org.easycompiler.ast.Block", "errors" : [ "java.util.ArrayList", [ ] ], "line" : 4, "typeName" : null, "statements" : [ "java.util.ArrayList", [ ] ] }, "returnType" : { "@class" : "org.easycompiler.type.Integer", "errors" : [ "java.util.ArrayList", [ ] ], "title" : "integer", "type" : "I64" } } } }
Les objets de contexte stockent les suivantes propriétés:
Pour chacun des noeuds suivants, déterminez le type de retour
Définissez le type en ajoutant une propriété type dans le noeud.
{ "@class" : "org.easycompiler.ast.BinaryExpression", "errors" : [ "java.util.ArrayList", [ ] ], "line" : 5, "typeName" : "integer", "left" : { "@class" : "org.easycompiler.ast.Value", "errors" : [ "java.util.ArrayList", [ ] ], "line" : 5, "typeName" : "integer", "value" : "2" }, "right" : { "@class" : "org.easycompiler.ast.FunctionCall", "errors" : [ "java.util.ArrayList", [ ] ], "line" : 5, "typeName" : "integer", "function_name" : { "@class" : "org.easycompiler.ast.Identifier", "errors" : [ "java.util.ArrayList", [ ] ], "line" : 5, "typeName" : "number", "title" : "number" }, "arguments" : [ "java.util.ArrayList", [ ] ] }, "op" : "ADD" }
Pour tous les noeuds AST, vérifiez que les types correspondent:
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.
Pour les types des erreurs s'il vous plait verifie l'enum SemanticError.Type
Pour un 0.5p supplémentaire, trouver le type de variables qui sont déclarées en utilisant juste une attribution.
Le devoir est individuel. Toute tentative de copiage entraînera 0p pour les devoirs. Système anti-copiage automatisé sera utilisé.
Si vous avez des questions concernant les devoirs, posez-les en postant un problème sur le github repository avec le format de titre [semantic] <votre titre de la question> . Vous aurez besoin d'un compte github pour cela.
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 repository et cliquez sur Watch .