Table of Contents

Devoir 3 - Sémantique

Information

Date limite: le 26 mai, 23h59
Points: 2 points hors de la note finale
Téléchargez le devoir: GitHub Devoir 3
Téléchargement tardif: 1 point / jour (maximum 3 jours)

Demande

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:

  1. la table des symboles
  2. un nouvel AST avec les modifications suivantes
    1. le nouvel AST est une liste d'instructions (statements)
    2. tous les noeuds de l'AST ont deux nouvelles propriétés 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, et errors, qui fait référence a l'erreurs associé au noeud courant.

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.

Le programme recevra deux paramètres de la ligne de commande:

java ... com.example.Main source.alf.ast.json source.alf.json

Conseils pour résoudre le devoir

Fichier de sortie

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

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"
        }
      }
    }
  }

Objet de contexte

Les objets de contexte stockent les suivantes propriétés:

Les objets de contexte sont générés par

  • le module principal
  • une définition de fonction
  • une loop for (la variable locale utilise pour l'index)

Vérification des types dans l'AST

Type de retour des expressions

Pour chacun des noeuds suivants, déterminez le type de retour

Définissez le type en ajoutant une propriété type dans le noeud.

L'algorithme pour chercher une variable suppose les étapes suivantes:

  1. S'il s'agit d'un contexte de fonction, recherchez dans le contexte des variables locales
  2. S'il n'a pas été trouvé, cherchez dans les parametres
  3. S'il n'a pas été trouvé, chechez dans le contexte des variables locales des classes
  4. S'il s'agit du contexte du module principal, cherchez dans les variables globales

Exemple

{
      "@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"
    }

Vérification de la correctitude du langage

Pour tous les noeuds AST, vérifiez que les types correspondent:

Liste d'erreurs

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

Bonus

Pour un 0.5p supplémentaire, trouver le type de variables qui sont déclarées en utilisant juste une attribution.

Le bonus ne sera attribué que si tous les autres tests réussissent.

Copiage

Le devoir est individuel. Toute tentative de copiage entraînera 0p pour les devoirs. Système anti-copiage automatisé sera utilisé.

Questions

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.

NE POSEZ AUCUN CODE . Ceci est considéré comme copiage et vous aurez 0p pour ce devoir.

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 .