-
Gérer les variables dans l'interpréteur : Permettre l'affectation, le stockage et la récupération de valeurs pour des variables dans l'interpréteur.
-
Implémenter, parser et évaluer des expressions lambda : Ajouter le support des fonctions anonymes et évaluer dynamiquement les expressions mathématiques contenant des variables.
Objectif :
Étendre l'interpréteur existant pour qu'il prenne en charge l'affectation simple de variables. L'objectif est de permettre l'affectation de valeurs à des variables, tout en respectant certaines contraintes de type et en utilisant l'encodage UTF-8 pour les noms de variables.
- Pas de changement de type : Une fois qu'une variable est affectée à un type (entier, nombre réel ou chaîne de caractères), elle doit conserver ce type. Par exemple, si
x = 12, on ne peut pas réaffecterx = 12.3. - Types autorisés : Seuls trois types sont autorisés pour les variables :
- Entiers (par exemple,
12) - Nombres réels (par exemple,
12.3) - Chaînes de caractères (par exemple,
"hello")
- Entiers (par exemple,
- Noms de variables en UTF-8 : Les noms de variables peuvent contenir des caractères Unicode et doivent être encodés en UTF-8.
- Table de symboles (variables) : Utiliser une table (ou une structure équivalente) pour stocker les noms des variables, leurs valeurs et leur type.
-
Ajouter la gestion des variables dans l'interpréteur :
- Implémenter une table de symboles qui stocke les variables avec leurs valeurs et types respectifs.
-
Reconnaître les affectations de variables :
- Lorsqu'une commande de type
> variable = valeurest saisie, ajouter ou mettre à jour la variable dans la table de symboles, en respectant les contraintes de type.
- Lorsqu'une commande de type
-
Accéder aux valeurs des variables :
- Si l'utilisateur saisit uniquement le nom d'une variable (par exemple,
> x), afficher la valeur actuelle de cette variable. - Si la variable n'est pas définie, afficher un message d'erreur indiquant que la variable n'existe pas.
- Si l'utilisateur saisit uniquement le nom d'une variable (par exemple,
-
Entrée :
> x = 4 -
Sortie :
Variable x définie avec la valeur 4 (entier) -
Entrée :
> z = "Bonjour" -
Sortie :
Variable z définie avec la valeur "Bonjour" (chaîne de caractères) -
Entrée :
> x = 12.3 -
Sortie :
Erreur : changement de type non autorisé pour la variable x -
Entrée :
> π = 3.14 -
Sortie :
Variable π définie avec la valeur 3.14 (nombre réel) -
Entrée :
> y -
Sortie :
Erreur : la variable y n'est pas définie
Objectif :
Étendre l'interpréteur pour qu'il prenne en charge les expressions lambda de la forme (lambda x.une expression mathématique sans/avec parenthèses qui contient x) un nombre/variable. L'objectif est de permettre l'évaluation des expressions lambda où la variable x est remplacée par une valeur numérique ou une variable déjà définie.
- Les expressions lambda doivent suivre la syntaxe :
(lambda x.une expression mathématique)oùune expression mathématiquepeut inclure des opérateurs arithmétiques de base (+, -,...) et des parenthèses. - Lors de l'évaluation, la valeur numérique ou la variable fournie après l'expression lambda doit remplacer toutes les occurrences de
xdans l'expression mathématique. - Si une variable est utilisée comme argument après l'expression lambda, elle doit être définie dans l'interpréteur, sinon une erreur doit être renvoyée.
-
Parsing de l'expression lambda :
- Identifier la structure
(lambda x.une expression mathématique)et extraire la variablexainsi que l'expression mathématique. - Vérifier que l'expression mathématique est bien formée et respecter les règles de priorité des opérateurs.
- Identifier la structure
-
Évaluation de l'expression lambda :
- Remplacer la variable
xpar la valeur fournie (soit un nombre, soit la valeur de la variable déjà définie). - Évaluer l'expression mathématique résultante après substitution.
- Remplacer la variable
-
Gestion des erreurs :
- Si une variable non définie est utilisée comme argument, afficher un message d'erreur approprié.
- Assurer une gestion correcte des types de valeurs (entiers, réels, chaînes de caractères).
-
Entrée :
> (lambda x.x + 2 * x) 3- Étapes :
- Le parseur identifie
lambda xet l'expressionx + 2 * x. - Remplace
xpar3. - Évalue l'expression
3 + 2 * 3 = 9.
- Le parseur identifie
- Sortie :
9
- Étapes :
-
Entrée :
> (lambda x.(x + 2) * x) y- Supposons que la variable
yait été définie précédemment avec la valeur4. - Étapes :
- Le parseur identifie
lambda xet l'expression(x + 2) * x. - Remplace
xpar4. - Évalue l'expression
(4 + 2) * 4 = 24.
- Le parseur identifie
- Sortie :
24
- Supposons que la variable
-
Entrée :
> (lambda x.x + 1) z- Si la variable
zn'est pas définie dans la table de symboles. - Sortie :
Erreur : la variable z n'est pas définie
- Si la variable
- Table de symboles (variables) : Pour récupérer les valeurs des variables déjà définies.
- Parseur d'expressions lambda : Pour analyser et extraire les composants de l'expression lambda.