Bonjour à tous,
Je suis en train d'apprendre (enfin plutôt "essayer d'apprendre") la théorie de la compilation par moi même
Je souhaite donc m'entrainer sur un petit langage : les expressions mathématiques avec les opérateurs courants +, -, *, /. Peut-être rajouter par la suite le traitement des fonctions (cos, sin...).
Voici mon "problème"
J'ai un programme de ce style :
D'après les cours et les exemples que j'ai pu trouver sur internet, la "compilation" se déroule en plusieurs étapes (n'hésitez pas à me corriger si nécessaire !) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 a = 1; b = 3*(a+4); print b;
- L'analyse lexicale : dans laquelle on "découpe" le programme en lexèmes.
Exemple : "a = 1;" devient IDENTIFICATEUR(a) EGAL NOMBRE(1) FIN_EXPRESSION- L'analyse syntaxique : on vérifie la syntaxe grâce à une grammaire.
Exemple pour les lexèmes précédents : IDENTIFICATEUR peut-être suivi de EGAL qui peut-être suivi de NOMBRE qui peut-être suivi de FIN_EXPRESSION.
Dans mon projet, j'utilise une méthode descendante :
Pour la formule "3+4", j'ai ce fonctionnement :
On se retrouve ensuite dans expression avec le token FIN sur la pile.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 expression(); // appelé par le programme principal |- term(); // analyse le premier token NOMBRE(3) |- factor(); |- retourne 3; // token suivant : PLUS, dans la grammaire on attend un nombre ou un identificateur juste après. |- term(); // analyse le token suivant NOMBRE(4) |- factor(); |- retourne 4;
La grammaire a bien été vérifiée (pour ce projet, j'utilise une méthode descendante vu que construire une méthode ascendante à la main est un peu "ardu").- L'analyse sémantique : on vérifie la portée des variables, etc...
Dans mon cas (pour le moment), il n'y a pas de portée de variable. Je ne pense pas avoir besoin de cette étape. Ou peut-être que j'ai loupé quelque chose ?- Et là, c'est l'étape de la compilation. Mais normalement, je n'en ai pas besoin non plus vu que je fais un "interpréteur".
Voilà ce que j'ai compris...
Je n'ai utilisé que les étapes 1) et 2). Mais vient ensuite le calcul de l'expression...
Et là je ne sais pas trop comment faire
Donc moi en tant que programmeur, je me dis : "Tiens si je faisais un arbre pour évaluer simplement mes expressions ?".
Voici un exemple de ce que je veux faire :
Ou, pour une expression plus complexe "b = 3*(a+4)" :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3= / \ a 1
(Ouaaaaa, l'ascii-art )
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 = / \ b * / \ 3 + / \ a 4
Ensuite après les différentes validations (analyses), je n'ai plus qu'à appeler getValue() sur la racine de l'arbre (ici '='). Cette fonction appelle elle-même getValue() sur ces fils et fait les opérations nécessaires. Lorsqu'on arrive sur une feuille on renvoie juste la valeur du nombre ou de l'identificateur.
Est-ce une bonne manière de procéder de cette façon ?
Existe-t-il une autre méthode pour créer un interpréteur ?
Et voici la question fatidique : Où et comment créer cet arbre ?
Après quelle analyse ? lexicale ? syntaxique ? Où tout à la fin du processus ?
Donc voilà ou j'en suis !
Pour résumer : j'ai extrait les lexèmes et vérifier la grammaire de mon "langage". Mais je ne sais pas comment évaluer (calculer) mon expression.
Merci d'avoir lu jusqu'au bout, je n'ai pas pu faire plus court O_o
Tipoun
Partager