Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.
La shoutbox n'est pas chargée par défaut pour des raisons de performances. Cliquez pour charger.

Forum Casio - Projets de programmation


Index du Forum » Projets de programmation » Compylateur
Shadow15510 Hors ligne Administrateur Points: 5503 Défis: 18 Message

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 !


Précédente 1, 2, 3 ··· 10 ··· 17, 18, 19, 20
Lephenixnoir Hors ligne Administrateur Points: 24574 Défis: 170 Message

Citer : Posté le 21/05/2023 21:49 | #


Shadow15510 a écrit :
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.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Shadow15510 Hors ligne Administrateur Points: 5503 Défis: 18 Message

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 :

saisir a
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 :
Block :
    User's request :
        Variable : a
    Statement : if
        Comparison : EGA
            Variable : a
            Number : 0
        Block :
            Display :
                Text : "gagné !"
        Block :
            Display :
                Text : "perdu…"

"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Shadow15510 Hors ligne Administrateur Points: 5503 Défis: 18 Message

Citer : Posté le 01/06/2023 12:05 | #


La fonction d'interprétation de l'AST commence à ressembler à quelque chose !
--- code entré
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.
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Lephenixnoir Hors ligne Administrateur Points: 24574 Défis: 170 Message

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
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Shadow15510 Hors ligne Administrateur Points: 5503 Défis: 18 Message

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…
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Shadow15510 Hors ligne Administrateur Points: 5503 Défis: 18 Message

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 :
demander la valeur de var
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 = input("var ")
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.")

"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Précédente 1, 2, 3 ··· 10 ··· 17, 18, 19, 20

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 141 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd