Devoir 2 - Langage Alf

Informations

Date limite: 7 Mai, 23:55
Points: 3 points de la note finale
Téléchargez le devoir: Devoir 2
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:

java ... com.example.Main script.alf 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:

java ... com.example.Main script.alf

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

Voici un example pour le script suivant:

 45.5; 

AST

{
  "@class" : "org.easycompiler.ast.Module",
  "line" : 1,
  "title" : "program",
  "block" : {
    "@class" : "org.easycompiler.ast.Block",
    "line" : 1,
    "type" : null,
    "statements" : [ "java.util.ArrayList", [ {
      "@class" : "org.easycompiler.ast.Value",
      "line" : 1,
      "type" : {
        "@class" : "org.easycompiler.type.Float",
        "title" : "float",
        "type" : "F64"
      },
      "value" : "45.5"
    } ] ]
  }
}

Tous les nœuds ont title et line.

Pour les identifiants des noeuds voir le directoire easycompiler dans votre repository. La vous aller trouver des classes pour chaque identifient des noeuds et une courte documentation qui decrire comment l'utiliser.

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

Voir la classe Identifier.java. Si vous voulez voir le json de cette classe vous pouvez creer un instance et afficher myObj.toJSON()

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

Voir la classe Value.java. Si vous voulez voir le json de cette classe vous pouvez creer un instance et afficher myObj.toJSON()

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

Voir la classe VariableDefinition.java. Si vous voulez voir le json de cette classe vous pouvez creer un instance et afficher myObj.toJSON()

Exemple

Class

Langage

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

AST

Voir la classe Definition.java et pour le type la classe Struct.java. Si vous voulez voir le json de cette classe vous pouvez creer un instance et afficher myObj.toJSON()

Exemple

Accès des propriétés

Langage
object_name.property
AST

Voir la classe StructElement.java. Si vous voulez voir le json de cette classe vous pouvez creer un instance et afficher myObj.toJSON()

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

Voir la classe Definition.java et pour le type la classe Array.java. Si vous voulez voir le json de cette classe vous pouvez creer un instance et afficher myObj.toJSON()

Accès des listes

Langage
array_name[index]
AST

Voir la classe ArrayElement.java. Si vous voulez voir le json de cette classe vous pouvez creer un instance et afficher myObj.toJSON()

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

Voir les classe BinaryExpression.java et UnaryExpression.java. Si vous voulez voir le json de cette classe vous pouvez creer un instance et afficher myObj.toJSON()

Attribution

Langage

variable = expression;

Exemples

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

AST

Voir la classe Assignment.java. Si vous voulez voir le json de cette classe vous pouvez creer un instance et afficher myObj.toJSON()

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

Voir la classe Definition.java et pour le type la classe Function.java. Si vous voulez voir le json de cette classe vous pouvez creer un instance et afficher myObj.toJSON() Exemple

Le Block du statements a l'intrieur d'un fonction va avoir la ligne egale avec la ligne du token BEGIN

Return

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

Exemple
return x+y;
AST

Voir la classe Return.java. Si vous voulez voir le json de cette classe vous pouvez creer un instance et afficher myObj.toJSON()

Appel de fonction

Langage

exec function_name (parameter1_value, parameter2_value, ...)

Exemples

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

AST

Voir la classe FunctionCall.java. Si vous voulez voir le json de cette classe vous pouvez creer un instance et afficher myObj.toJSON()

Exemple

Branches

Langage

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

AST

Voir la classe IfClause.java. Si vous voulez voir le json de cette classe vous pouvez creer un instance et afficher myObj.toJSON()

Exemple

Pour la branche if, les Blocks du statements a l'interieur de la branche if vont avoir la ligne egale avec le premiere statement. Si on n'a pas la branche else, le block pour else va avoir la ligne egale avec la ligne du token IF.

Boucles

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

while

while expression start
  ...
finish;

repeat

repeat
  ...
while expression

for

for variable_name in variable_name
   ...
end;

AST

Voir la classe Loop.java. Si vous voulez voir le json de cette classe vous pouvez creer un instance et afficher myObj.toJSON()

or

for iteration

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

AST

Voir la classe Iteration.java. Si vous voulez voir le json de cette classe vous pouvez creer un instance et afficher myObj.toJSON()

Exemple

Pour tous le types de boucles, le Block de statements a l'interieur de la boucle va avoir la ligne egale avec la ligne du premiere statement.

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)

AST

Voir les classes Errors.java et Error.java. Si vous voulez voir le json de cette classe vous pouvez creer un instance et afficher myObj.toJSON()

La liste des erreurs doit être inclue dans un noeud de l'AST

CONDITIONS

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

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

  • Main.java
  • Alf.java
  • Alf.g4
  • AlfLexer.java
  • AlfListener.java
  • AlfParser.java
  • AlfVisitor.java
  • 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.

Pour plusieurs de detailles sur l'aspect des JSON pour chaque element, consulter le repository avec les tests: Tests repository

Chaque fichier nom.alf represent un fichier avec le code source qui doit etre teste, et les fichiers equivalent nom.alf.json represent la sortie.

alf/teme/tema2_java.txt · Last modified: 2023/05/04 19:17 by amalia.simion
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