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
Voici quelques conseils pour résoudre le devoir:
Essayez d'exécuter de petits scripts pour tester chaque fonctionnalité.
Tous les nœuds de l'AST ont le meme format.
Voici un example pour le script suivant:
45.5;
{ "@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" } ] ] } }
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.
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.
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.
Le langage Alf est un langage typé défini comme suit:
a=10; b=20; s=55;
Les valeurs sont
7
7.5
"a"
"ceci est un texte"
false
empty
Les commentaires font partie du fichier source et ils sont ignorés. Ils sont encadrés par ”/” et ne sont pas imbriqués.
/* Ceci est un texte pour décrire le script */ declare integer v = 5;
Une variable peut être n'importe quelle valeur qui commence par une lettre ou _ et peut contenir aussi des nombres.
identifier identifier1 _identifier _identifier1
Voir la classe Identifier.java. Si vous voulez voir le json de cette classe vous pouvez creer un instance et afficher myObj.toJSON()
Une valeur est un nombre entier, un nombre reel, une valeur logique ou une chaîne.
3534 45634.423 false "s" "string"
Voir la classe Value.java. Si vous voulez voir le json de cette classe vous pouvez creer un instance et afficher myObj.toJSON()
declare [variable_type] variable_name [ = value ou expression], ...; declare variable_name, variable_name, variable_name ...;
declare integer a = 3; declare b = false; declare integer a = 1, string b = "text", boolean c = true;
Voir la classe VariableDefinition.java. Si vous voulez voir le json de cette classe vous pouvez creer un instance et afficher myObj.toJSON()
class class_name [local property_type property_name [= initial_value]] ... ... end;
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()
object_name.property
Voir la classe StructElement.java. Si vous voulez voir le json de cette classe vous pouvez creer un instance et afficher myObj.toJSON()
array_type array array_name[from:to] <note> [] sont des parenthèses réelles et sont obligatoires </note>
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()
array_name[index]
Voir la classe ArrayElement.java. Si vous voulez voir le json de cette classe vous pouvez creer un instance et afficher myObj.toJSON()
Opérateur | Priorité |
---|---|
if | Low |
= != | |
> >= < ⇐ | |
and or xor | |
not | |
+ - | |
* / mod | High |
2+5; 2*4+5; variable+5; 2+(x+y)*(5+6);
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()
variable = expression;
x = 1000; s = "text" + "s"; y = exec _f(); l[i] = 900; q.e = "this is a text";
Voir la classe Assignment.java. Si vous voulez voir le json de cette classe vous pouvez creer un instance et afficher myObj.toJSON()
function function_name([parameter1_type] parameter1 [= value], ...):return_type [=> expression];
function function_name:return_type [([parameter1_type] parameter1 [= value], ...):return_type] begin // statements end;
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;
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
Ces sont les instructions qui définissent la valeur de retour d'un message.
return x+y;
Voir la classe Return.java. Si vous voulez voir le json de cette classe vous pouvez creer un instance et afficher myObj.toJSON()
exec function_name (parameter1_value, parameter2_value, ...)
exec write ("Text"); s = exec sum (3+1, 5); exec _getdir ();
Voir la classe FunctionCall.java. Si vous voulez voir le json de cette classe vous pouvez creer un instance et afficher myObj.toJSON()
if expression ... end;
if expression ... else ... end;
Voir la classe IfClause.java. Si vous voulez voir le json de cette classe vous pouvez creer un instance et afficher myObj.toJSON()
Il existe trois types de boucles: while, repeat et for.
while expression start ... finish;
repeat ... while expression
for variable_name in variable_name ... end;
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 variable_name from expr to expr start n = n + 1; finish;
Voir la classe Iteration.java. Si vous voulez voir le json de cette classe vous pouvez creer un instance et afficher myObj.toJSON()
Pour 0.5 points supplémentaires, implémentez une fonctionnalité pour le traitement des erreurs.
Si le fichier source a des erreurs, vous devrez générer un JSON avec elles. Il y a deux types d'erreurs:
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()
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.