This is an old revision of the document!


Devoir 4 - Semantique

Information

Date limite: le 5 mai, 23h55
Points: 2 points hors de la note finale
Téléchargez le devoir: vmchecker.cs.pub.ro
Téléchargement tardif: 0,1 point / jour (maximum 4 jours)

Ce que vous devez faire

Le but du devoir est d'écrire l'analyse sémantique, le langage intermédiaire pour le langage Alf.

Vous recevrez un AST de l'analyseur qui analyse correctement une source de langue Alf et doit écrire:

  1. le tableau des symboles
  2. ajouter à chaque noeud d'AST un attribut symbole avec l'ID de contexte et déterminer les types pour les noeuds qui retournent (expression, value, id, element_of_array, element_of_struct elements, value_of_function)
  3. la liste d'erreurs sémantiques

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 des symboles et l'AST sont corrects.

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

  • le fichier source
  • le fichier de sortie
noeud main.js source.alf source.alf.json

Le fichier de grammaire Alf

Vous pouvez utiliser votre fichier de grammaire ou le fichier reference

Conseils pour résoudre le devoir

  • Faire le tableau des symboles
  • Déterminer tous les types de variables dans le tableau des symboles
  • Déterminer les types pour toutes les instructions qui retournent un résultat
  • Lors de la détermination des types, écrivez les erreurs

Fichier de sortie

Le format du fichier de sortie est le suivant

{
    symbol_table: [...], // le tableau symbol_table
    ast: {...}, // l'ast avec le type pour un noeud qui retourne une valeur
    error_list: [] // la liste des erreurs
}

Tableau des symboles

Le tableau des symboles est un tableau d'objets de contexte.

[
   // ID de l'objet de contexte 0 - le contexte du script principal
   {
      ...
   },
   // ID de l'objet de contexte 1 - l'objet de contexte d'une fonction
   {
      ...
   },
   ...
]

Lors de la détermination de la table de symboles, ajoutez à chaque noeud AST un paramètre symbole avec la valeur de son identifiant de contexte.

Objet de contexte

Les objets de contexte stockent

  • la variable déclarée dans ce contexte
  • le message déclaré dans ce contexte
  • les classes déclarées dans ce contexte
  • l'identifiant de contexte parent (position dans le tableau symbol_table)
  • le type du contexte (module ou message)
  • le nom du message duquel est le contexte (s'il n'est pas le module)
  • le nom de la classe duquel est le contexte (s'il n'est pas le module)
  • le type de la valeur de retour du message duquel est le contexte (s'il n'est pas le module)

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

  • le module principal
  • une définition de message
  • une classe

L'objet ressemble à:

{
   "variables": {// un dictionnaire des variables
      "Nom de la variable": {
         "type": // type de la variable
         "line": // la ligne où la variable a été déclarée
         "value": // l'expression que la variable a initialement (facultatif, si elle a ete definie avec une valeur)
      }
   },
   "messages": {// un dictionnaire des fonctions
      "message_name": {
         "type": // le type de retour de la fonction
         "parametres": [] // la liste des paramètres que la fonction prenne (le noeud parameters de l'AST)
         "line": // la ligne où la fonction a été déclarée
         "symbol": // l'identifiant de l'objet de contexte créé par la fonction
 
      }
   },
   "types": {// un dictionnaire de types
      "type": {
               "type": // le type de la nouvelle classe de type ou tableau
               "line": // la ligne où le type a été déclaré
               // pour le tableau
               "elements_type": // le type de chaque élément du tableau
               "from": // le premier index
               "to": // le dernier index
               // pour la classe
               "elements": [// une liste d'éléments de tableau (le noeud de l'AST)
                  {
                     "type":
                     "id":
                     "line":
                  },
                  ...
               ]
            }
   },
   "parent": 0, // la position du contexte parent dans le tableau symbol_table (à l'exception du script principal qui n'a pas de parent), généralement 0,
   "type": //
   "message": // le nom du message s'il s'agit d'un contexte de fonction
   "class": // le nom de la classe si le contexte est dans un message qui est dans une classe
   "return_value": // le type de retour de la fonction s'il s'agit d'un contexte de fonction
}

Exemple

{
   "variables": {
      "s": {
         "type": "school",
         "line": 8
      }
   },
   "messages": {},
   "types": {
      "school": {
         "type": "class",
         "line": 6,
         "elements": [
            {
               "type": "int",
               "id": "type",
               "line": 5
            },
            {
               "type": "logic",
               "id": "private",
               "line": 4
            },
            {
               "type": "string",
               "id": "name",
               "line": 3
            }
         ]
      }
   }
}

Vérification des types dans l'AST

Type de retour d'expression

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

  • exp
  • value
  • identifier
  • return
  • element
  • property
  • dispatch

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

Lors de la recherche d'une variable, l'algorithme est:

  • S'il s'agit d'un contexte de message, recherchez les variables locales
  • Si elle n'est pas trouvé, recherchez les paramètres
  • Si elle n'est pas trouvé, recherchez les variables locales du contexte de classe
  • si c'est le contexte du module, recherchez les variables globales

Exemple

{   
   "id": "exp",
   "op": "=",
   "left": {
      "id": "exp",
      "op": "mod",
      "left": {
         "id": "id",
         "value": "n",
         "line": 8,
         "symbol": 1,
         "type": "int"
      },
      "right": {
         "id": "id",
         "value": "i",
         "line": 8,
         "symbol": 1,
         "type": "int"
      },
      "line": 8,
      "symbol": 1,
      "t": "int"
   },
   "right": {
      "id": "value",
      "type": "int",
      "value": 0,
      "line": 8,
      "symbol": 1
   },
   "line": 8,
   "symbol": 1,
   "type": "logic"
}

Vérifier les types

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

  • attributions sont faisables
  • les expressions peuvent être calculées
  • l'expression if / while / repeat a une valeur logique
  • la variable est un nombre / string / boolean
  • que les variables 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 propriétés de la classe existent
  • la variable pour element_of_array est un tableau
  • la variable pour une propriété est une classe
  • les variables ne sont pas redéfinies
  • les fonctions ne sont pas redéfinies
  • les types ne sont pas redéfinis

C'est là que la plupart des erreurs apparaissent.

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.

Format d'objet d'erreur

Chaque erreur a le format suivant:

{
    type: // chaîne avec le type d'erreur
    line: // le numéro de ligne dans la source (commençant par 1)
    elements: // éléments pour l'erreur, chaque type d'erreur a des éléments différents
    text: // le message d'erreur
}

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
{
    variable: // nom de la variable
}

FUNCTION_ALREADY_DEFINED

L'erreur se produit lorsqu'une définition de fonction est répétée.

Eléments
{
    function: // nom de la fonction
}

TYPE_ALREADY_DEFINED

L'erreur se produit lors de la répétition d'une définition de type (tableau ou struct).

Eléments
{
    type: // nom du type
}

STRUCT_ELEMENT_ALREADY_DEFINED

L'erreur se produit lorsqu'une définition d'élément struct est répétée.

Eléments
{
    struct: // nom du type de structure
    element: // nom de l'élément
}

ARRAY_INDEX_VALUE

L'erreur se produit lorsque l'index inférieur du tableau est supérieur à l'index supérieur

Eléments
{
    array: // nom du type de tableau
    low_index: // la valeur d'index inférieure
    high_index: // la valeur d'index la plus élevée
}

TYPE_RESOLUTION

L'erreur se produit lorsque le type d'une variable n'est pas déterminable (bonus uniquement).

Eléments
// variable
{
    variable: // le nom de la variable avec le type non résolu
}
// Elément struct
{
    struct: // nom du type de structure
    element: // nom de l'élément struct avec le type non résolu
}

UNDEFINED_MESSAGE

L'erreur se produit lorsqu'un appel de fonction est effectué sur une fonction qui n'est pas définie.

Eléments
{
   id: // nom du message
}

UNDEFINED_VARIABLE

L'erreur se produit lorsqu'une variable non définie est utilisée.

Eléments
{
   variable: // nom de la variable
}

UNDEFINED_TYPE

L'erreur se produit lorsqu'un type qui n'est pas défini est utilisé.

Eléments

{     variable: la variable qui a ce type     type: le type qui n'est pas défini }

NOT_CLASS_PROPERTY

L'erreur se produit lorsqu'un élément ne fait pas partie de cette structure.

Eléments
{
   class: // nom de la structure
   propriété: // nom de l'élément
}

NOT_CLASS

L'erreur se produit lorsqu'une propriété est demandée pour une variable qui n'est pas un type de classe

Eléments
{
   type: // type réel que la variable est (au lieu d'un type struct)
}

NOT_ARRAY

L'erreur se produit lorsqu'un index est demandé pour une variable qui n'est pas un tableau

Eléments
{
   type: // type réel que la variable est (au lieu d'un type de tableau)
}

ARRAY_INDEX_TYPE

L'erreur se produit lorsqu'un index pour un tableau n'est pas un nombre ou un symbole

Eléments
{
   array: // type de tableau
   index: // type d'index fourni
}

RETURN_OUTSIDE_MESSAGE

L'erreur se produit lorsqu'une instruction de valeur (noeud de retour) est utilisée en dehors d'un message

Eléments
{
   // vide
}

TYPE_EXPRESSION

L'erreur se produit lorsqu'une expression a des types incompatibles

Eléments
// left op right
{
    left:
    right:
    op:
}
// op value
{
    value:
    op:
}
// if, while or repeat
{
    expression: // expression type
    op: // if, while, repeat
}
// for
{
    expression: // expression type
    op: "for"
    element:
}
// value_of_function
{
    op: "value"
    to: // return type
    from: // provided type
}
// assign
{
    op: ":="
    to: // to type
    from: // from type
}
// struct element type is undefined
{
    struct: // struct type,
    element: // name of struct element
}
// variable type is undefined
{
    variable: // name of the variable
}

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
}

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 .

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 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.

cd verify
./run_all.sh

Vous aurez besoin de bash pour ça. Vous pouvez utiliser Linux ou Windows Linux Subsystem.

Pour installer nodejs sous Linux ou Windows Linux Subsystem, procédez comme suit:

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

  

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.

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.

Télécharger les devoirs

Le devoir doit être téléchargé sur vmchecker. Connectez-vous avec votre nom d'utilisateur moodle, sélectionnez le cours Automates et Langages Formelles (FILS) et téléchargez homework archive.

Readme

Le fichier readme a le format suivant:

Nom complet
Groupe

Une explication comment vous avez écrit vos devoirs, qu'avez vous utilisé, quelles sont les idées principales.

Archive des devoirs

Pour télécharger vos devoirs, suivez les instructions suivantes:

  1. 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
  2. Connectez-vous avec vmchecker
  3. sélectionner les Automates et Langages Formelles (FILS) cours
  4. sélectionnez 4. Sémantique
  5. télécharger l'archive

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 .

Lorsque l'archive est téléchargée, vmchecker va exécuter:

unzip archive.zip homework
cd homework
npm install
echo '{ "node":true, "esnext":true }' > .jshintrc
jshint *.js
alf/teme/tema4.1556461776.txt.gz · Last modified: 2019/04/28 17:29 by alexandru.radovici
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