Devoir 3 - Langage Alf

Informations

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

Demande

Analyser le fichier source du langage ALF et générer un arbre de syntaxe abstraite JSON (AST).

Le devoir prendra un ou deux paramètres de la ligne de commande. Le premier paramètre est le nom du fichier avec le script ALF, le deuxième est le fichier de sortie. Si le fichier de sortie manque, il aura la même nom que le fichier script avec l'extension ”.json”.

Par exemple, dans ce cas, le fichier de sortie sera script.json:

node main.js script.ast script.json

Dans l'exemple suivant, tenant compte du fait que le deuxième paramètre manque, le fichier de sortie sera automatiquement généré, ayant le nom script.ast.json:

node main.js script.ast

Conseils

Voici quelques conseils pour résoudre le devoir:

  • Commencez par écrire les règles de l'analyseur (parser) pour les valeurs
  • Ajoutez les règles de l'analyseur pour les expressions
  • Ajoutez les règles de l'analyseur pour les définitions de variables
  • Ajoutez les règles de l'analyseur pour les boucles
  • Ajoutez les règles de l'analyseur pour les définitions de fonctions
  • Ajoutez les règles de l'analyseur pour l'exécution des fonctions
  • Ajoutez les règles de l'analyseur pour les branches et les boucles
  • Ajoutez les règles de l'analyseur pour les tableaux et les structures

Essayez d'exécuter de petits scripts pour tester chaque fonctionnalité.

Format AST

Tous les nœuds de l'AST ont le format suivant:

{
  id:"node_id",
  line: "the line where the instruction is in the file, starting at 1"
}

Tous les nœuds ont id et line.

La liste des identifiants des noeuds:

  • Statements- le programme principal
  • Declaration - déclaration des variables
  • DeclarationElement - une variable qui a été déclarée
  • Expression - n'importe quelle expression
  • Assign - définir la valeur d'une variable
  • FunctionDefinition - définition d'une fonction
  • FunctionDefinitionParameter - parametre d'une fonction
  • ClassDefinition - définition d'une structure
  • LocalProperty - une propriété d'une structure lors de la définition
  • ClassProperty - une propriété d'une structure lors de l'acces
  • Array - définition d'une liste
  • ArrayElement - élément d'un tableau
  • IfBranch - déclaration d'un if
  • RepeatLoop - déclaration d'un repeat
  • WhileLoop - déclaration d'un while
  • ForLoop - déclaration d'un for
  • FunctionCall- appel d'une fonction
  • FunctionCallParameter - parametre d'un appel de fonction
  • ReturnFunction - valeur de retour d'une fonction
  • Value - une valeur (int, float, boolean, string, définie par l'utilisateur)
  • Variable - une variable

Questions

Si vous avez des questions concernant les devoir, posez-les en postant un issue sur github repository avec le format [alf] <titre de la question>. Vous aurez besoin d'un compte github pour cela.

NE POSEZ AUCUN CODE . Ceci est considéré comme copiage et se traduira par un devoir 0p.

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.

ALF

Le langage Alf est un langage typé défini comme suit:

  • définitions de variables
  • définitions de fonctions
  • définitions de classes (nouveau type de données)
  • définitions de listes (nouveau type de données)
  • expressions
  • valeurs
  • attributions
  • appel de fonctions
  • branche (if)
  • boucle (while, for, repeat)

Les instructions sont séparées par newline.

a=10;
b=20;
s=55;

Notations

  • [facultatif] - ce qui se trouve entre [] est une partie optionnelle

Valeurs

Les valeurs sont

  • nombre entier
     7 
  • nombre réel
    7.5
  • caractère
    "a"
  • chaîne
    "ceci est un texte"
  • logique (valeur true ou false)
    false
  • la valeur nulle
    empty

Les chaînes peuvent avoir les caractères spéciaux suivants:

  • ” - notée \”
  • \ - noté \\
  • \r - noté \r
  • \n - noté \n

Commentaires

Les commentaires font partie du fichier source et ils sont ignorés. Ils sont encadrés par ”/” et ne sont pas imbriqués.

Les commentaires peuvent s'étendre sur plusieurs lignes.

Tous les fichiers de test ont un commentaire sur la première ligne. Si votre grammaire n'a pas de règles pour les commentaires, vous pouvez tout simplement ignorer la première ligne.

/* Ceci est un texte pour décrire le script */
declare integer v = 5;

Variables

Une variable peut être n'importe quelle valeur qui commence par une lettre ou _ et peut contenir aussi des nombres.

Langage

identifier
identifier1
_identifier
_identifier1

AST

{
   id: "Variable",
   title: "variable_name",
   line: line_no
}

Valeur

Une valeur est un nombre entier, un nombre reel, une valeur logique ou une chaîne.

Langage

3534
45634.423
false
"s"
"string"

AST

{
    "id": "Value",
    "type": "value_type", //int, float, symbol, boolean, string
    "value": actual_value,
    "line": line_no
}

Exemple

Déclaration de variables

Langage

declare [variable_type] variable_name  [ = value ou expression], ...;
declare variable_name, variable_name, variable_name ...;

Exemples

declare integer a = 3;
declare b = false;
declare integer a = 1, string b = "text", boolean c = true;
Types de données
  • integer - nombre entier
  • float - nombre à virgule flottante
  • symbol - un seul caractère
  • string - texte
  • boolean - true ou false
  • défini par l'utilisateur (class, array)

AST

{
	"id": "Declaration",
            "elements": [
                 {
                   "id": "DeclarationElement",
                   "type": "variable_type",
                   "title": "variable_name",
                   "line": line_no
                 }
             ],
         "line": line_no
}

Exemple

Class

Langage

class class_name 
     [local property_type property_name [= initial_value]]
     ...
     ...
end;

AST

{
     "id": "ClassDefinition",
     "title": "class_name",
     "properties": [         // array of properties
          {
            "id": "LocalProperty",
            "type": "property_type",
            "title": "property_name",
            "value": { property_value }    // only if it exists
            "line": prop_line_no
           },
           ...
      ],
      "line": class_end_line_no
}

Exemple

Accès des propriétés

Langage
object_name.property
AST
{
	"id": "ClassProperty",
        "object": {               // class object
            "id": "Variable",
            "title": "s",
            "line": 10
        },
        "title": "property_name",
        "line": 10
}

Exemple

Liste

Définition des listes

Language
array_type array array_name[from:to]
<note>
[] sont des parenthèses réelles et sont obligatoires
</note>
AST
{
	id:"Array",
        title: array_name,
	element_type: "elements_data_type",
 	from: from_integer_number,
 	to: to_integer_number
}

Accès des listes

Langage
array_name[index]
AST
{
	id: "ArrayElement",
	array: "array_name",
 	index: { index_object }
}

Exemple

Expressions

Priorité des opérateurs

Opérateur Priorité
if Low
= !=
> >= < ⇐
and or xor
not
+ -
* / mod High

Langage

2+5;
2*4+5;
variable+5;

2+(x+y)*(5+6);

AST

{
	id:"Expression",
	op:"operator",
 	left: { left_operand_object },
 	right: { right_operand_object }
}

Attribution

Langage

variable = expression;

Exemples

x = 1000;
s = "text" + "s";
y = exec _f();
l[i] = 900;
q.e = "this is a text";

AST

{
   id:"Assign",
   to: { to_object },
   from: { from_object },
   line: line_no
 
}

Exemple

Définition des fonctions

Langage

function function_name([parameter1_type] parameter1 [= value], ...):return_type [=> expression];
function function_name:return_type [([parameter1_type] parameter1 [= value], ...):return_type]
begin
   // statements
end;

Exemples

function f1:(integer n1, integer n2):integer;
start
end;
function _sum (integer a, integer b):integer => a+b;
function power (integer a, integer b):integer 
begin
  declare integer n;
  declare integer i;
  return n;
end;

AST

{
      "id": "FunctionDefinition",
      "title": "function_name",
      "parameters": [    // parameters list; empty if the function has no parameter
          {
             "id": "FunctionDefinitionParameter",
             "type": "parameter_type",
             "name": "parameter_name"
          },
          ...
      ],
      "return_type": "function_return_type",
      "statements": [    //statements_list; empty if the function has no instruction
        { statement_object },
        ...
      ],
      "return_function": {    //return function object; only if the function returns something
           "id": "ReturnFunction",
           "value": { return_object },
           "line": return_line_no
      },
 
      "line": function_end_line_no
}

Exemple

Return

Ces sont les instructions qui définissent la valeur de retour d'un message.

Exemple
return x+y;
AST
{
	{    
           "id": "ReturnFunction",
           "value": { return_object },
           "line": return_line_no
        }
}

Appel de fonction

Langage

exec function_name (parameter_name1=value1, parameter_name2=value, ...);
exec function_name (parameter1_value, parameter2_value, ...)

Exemples

exec write (text="Text");
s = exec sum (3, 5);
exec _getdir ();

AST

{
	"id": "FunctionCall",
        "function_name": "function_name",
        "parameters": [    // parameters list for the function call; empty if the function call has no parameters
            {
               "id": "FunctionCallParameter",
               "name": "parameter_name",
               "value": { paramter_object_value }
            }
        ],
        "line": function_call_line_no
}

Exemple

Branches

Langage

if expression 
  ... 
end;
if expression 
  ... 
else
  ...
end;

AST

{
	id:"IfBranch",
	exp:{ evaluation_expression_object },
	then: [ //instructions list ]
}
{
	id:"IfBranch",
	exp:{ evaluation_expression_object },
	then: [ //instructions list ]
	else: [ //instructions list ]
}

Exemple

Boucles

Il existe trois types de boucles: while, repeat et for.

while

while expression start
  ...
finish;
AST
{
	id:"WhileLoop",
	exp: { evaluation_expression_object },
	statements: [ //instructions list ]
}

repeat

repeat
  ...
while expression
AST
{
	id:"RepeatLoop",
	exp: { evaluation_expression_object },
	statements: [ //instructions list ]
}

for

for variable_name from expr to expr start
	n = n + 1;
finish;

or

for variable_name in variable_name
   ...
end;
AST
{
	id:"ForLoop",
        variable: "variable_name",
	from :{ from_expression_object },
        to :{ to_expression_object },
	statements: [ //instructions list ]
}

or

{
	id:"ForLoop",
        variable: "variable_name",
	exp :{ var_expression_object },
	statements: [ //instructions list ]
}

Exemple

BONUS

Pour 0.5 points supplémentaires, implémentez une fonctionnalité pour le traitement des erreurs.

Erreurs

Si le fichier source a des erreurs, vous devrez générer un JSON avec elles. Il y a deux types d'erreurs:

  • lexicale (jeton pas reconnu)
  • syntaxe (jeton inattendu)

Erreur Lexicale

Pour toute erreur lexicale, la sortie sera:

{
    "id": "Lexical Error",
    "line": line_no_in_file,
    "position": position_in_string,
    "message": "error_message"
}

Syntax

Pour toute erreur de syntaxe, la sortie sera:

{
    "id": "Syntax Error",
    "line": line_no_in_file,
    "position": position_in_string,
    "message": "erorr_message"
}

La liste des erreurs doit être inclue dans un noeud de l'AST ayant la structure suivante:

{
     "id": "Errors",
     "errors": [error_node_array]
}

CONDITIONS

Les lignes sont numérotées à partir de 1

Sur GitHub, vous devez télécharger les fichiers suivants:

  • index.ts
  • Alf.g4
  • AlfLexer.ts
  • AlfListener.ts
  • AlfParser.ts
  • AlfVisitor.ts
  • tout autre fichier supplémentaire que vous avez créé pour traiter votre code

Les noms de jetons seront différents pour chacun d'entre vous, donc ils seront ignorés par le checker. Il vérifiera seulement que vous avez un jeton dans la liste.

alf/teme/tema3.txt · Last modified: 2022/04/08 12:28 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