Compylateur
Posté le 08/05/2020 14:00
Bonjour à tous !
Il y a quelques temps j'ai fait un 'compilateur' qui permet d'exécuter un algorithme en langage naturel en le 'traduisant' en Python. Le code est atroce et repose sur un remplacement entre les commandes en langage naturel et les commandes en Python (à coup de dictionnaires et de tests conditionnels
)… J'aimerais faire de ce projet un 'vrai' compilateur
(on reste sur du Python
). Et j'ai quelques questions :
- La phase d'analyse lexicale repose pour l'instant sur une recherche et un replacement, avec un dictionnaire qui contient en clés les commandes en langage naturel, et en items, les commandes correspondantes en Python… Je me doute que ce n'est pas pertinent…
En fait l'analyse lexicale est mélangée à la phase d'analyse syntaxique.
- Comment faire pour basculer du langage naturel au Python ? Faut-il forcément passer par un hard code, ou est-ce que d'autre technique plus esthétiques existent ?
- L'analyse syntaxique est un bête
replace basé sur un dico… Du coup ça revient à la question précédente : comment éviter le hard code ?
- La phase sémantique… Je ne suis pas sûr d'avoir bien compris toutes les subtilités…
Dans mon cas, après le remplacement bête et méchant, la syntaxe Python n'est pas bonne, du coup je passe à travers différents tests conditionnels pour avoir un 'vrai' script fonctionnel… Encore une fois le hard code à coup de
if me plaît moyen…
- En derniers je refait un passage sur mon code généré et j'ajoute les alinéas. Est-ce que je devrais les gérer plus tôt (je pense à la phase d'analyse syntaxique… mais le placement des alinéas dépend du contexte du code, et sur une ligne donnée je vois pas trop comment faire…
Merci d'avance !
Citer : Posté le 21/05/2023 21:49 | #
Dans l'idée, j'aimerais avoir un fichier *.py en sortie donc si en Python on ne vérifie pas grand chose… L'analyse sémantique va être rapide, non ?
Tu prends la question dans le mauvais sens : la réponse à "que doit faire l'analyse sémantique ?" elle dépend de ce que ton langage il a comme fonctionnalités.
Si ton langage a des variables statiques (ie. fixées à la compilation) comme le C, alors tu dois vérifier que toutes les variables utilisées sont déclarées. Peu importe que tu génères du Python ou de l'assembleur à la fin. Le rôle premier du compilateur avant de générer du code c'est de déterminer si le programme est valide et donc c'est ça que tu dois avoir en tête.
Je n'ai plus trop en tête à quoi ton langage ressemble... si tu as un exemple sous la main et/ou si tu te souviens de ses fonctionnalités ce serait utile.
Citer : Posté le 21/05/2023 21:53 | #
Ok, je vois !
Dans l'idée, je voulais réussir à lui faire manger du pseudo-code français. Par exemple :
si a est égal à 0 alors
afficher "Gagné !"
sinon
afficher "Perdu…"
fin si
Pour l'instant, l'AST peut gérer les assignements, les demandes d'input, les affichages, les conditions logiques (et, ou), les comparaisons, les if, for while.
Edit : ça me génère cet AST :
User's request :
Variable : a
Statement : if
Comparison : EGA
Variable : a
Number : 0
Block :
Display :
Text : "gagné !"
Block :
Display :
Text : "perdu…"
Citer : Posté le 01/06/2023 12:05 | #
La fonction d'interprétation de l'AST commence à ressembler à quelque chose !
afficher "var"
si var égale 2 alors
var prend la valeur var + 1
afficher var / 2
fin si
afficher "fin du programme."
--- code python
print("var")
if var == 2:
var = var + 1
print(f"{var * 1 / 2}")
print("fin du programme.")
Il me manque encore la gestion des boucles et input.
Citer : Posté le 16/06/2023 10:19 | #
Joli, t'es pas loin d'avoir un truc complet à ce stade ! Si tu te donnes une commande pour exécuter le script Python généré à la volée, ça te fera un joli interpréteur
Citer : Posté le 16/06/2023 17:29 | #
Ouaip ! Il faut que j'arrive à motiver pour pousser encore un peu et finir les boucles conditionnelles et les for est c'est bon ! Après je crois que je dois avoir un petit problème avec les inputs qui ne sont pas encore gérés… En partie parce que l'input Python renvoie une chaîne de caractère ce qui n'est pas très pratique. Vu que dans mon prototype, mon typage est plutôt faible et que Python a un typage faible aussi…
Citer : Posté le 07/04/2024 18:37 | #
Coucou par ici !
J'ai un peu continué l'AST, pas de grande nouveauté, mais on se rapproche d'un truc plus ou moins fonctionnel !
Pour l'instant, je n'ai pas trop joué avec des cas extrêmes, mais pour le développement, j'ai un petit programme qui s'aggrandit au fur et à mesure que j'implémente mon interpréteur.
Voici le code d'entrée :
var prend la valeur int(var, 10)
afficher "var : {var}"
si var égale 2 ou var est inférieur ou égal à 10 alors
var prend la valeur var + 1
afficher var / 2
fin si
pour i allant de 0 à 5,
afficher i
fin pour
tant que i est supérieur à 0,
afficher i
i prend la valeur i - 1
fin tant que
afficher "fin du programme."
(nb : l'indentation n'a aucun sens, c'est juste pour la lisibilité )
Et le code Python généré :
var = int(var, 10)
print(f"var : { var }")
if var == 2 or var <= 10:
var = var + 1
print(f"{var * (1 / 2)}")
for i in range(0, 5):
print(f"{i}")
while i > 0:
print(f"{i}")
i = i + (-1)
print("fin du programme.")