Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.

Forum Casio - Projets de programmation


Index du Forum » Projets de programmation » Pas prêt d'être fini : Bisp, langage de programmation chelou
Kikoodx Hors ligne Labélisateur Points: 2767 Défis: 11 Message

Pas prêt d'être fini : Bisp, langage de programmation chelou

Posté le 24/11/2020 19:24

Basic + Lisp = Bisp (wow name such imagination)

Salut salut. Je veux créer un langage expérimental syntaxe Lisp-like vers Basic Casio.
J'ai pas grand chose à dire dessus. Ce sera compilé sur l'ordi et faudra transférer sur calto et convertir le .TXT en .GXM (depuis PRGM).
Je n'ai pas de grandes ambitions sur ce projet (je veux apprendre à écrire un lexer et éviter l'abandon ⇒ souvenez vous).
Syntaxe :
;; Commentaire
(set a 1) ;; 1 is true
(while a
(locate 1 1 "Meh") ;; locate test
(set b (getkey)) ;; read user input
(when (= b KEY_EXIT) (set a 0))) ;; if exit pressed end the loop

Bon euh voilà un topic, ce projet a 90% de probabilité (environ ) de finir en vaporware.
Le Gitea arrivera quand il y aura quelque chose à voir.
Bonne soirée ?


Lephenixnoir Hors ligne Administrateur Points: 20999 Défis: 143 Message

Citer : Posté le 24/11/2020 20:36 | #


Est-ce que tu distingues une fonction d'un appel de la fonction ? Est-ce que tu as de l'ordre supérieur ? C'est typé comment ?

Je suppose que pour toutes ces questions la réponse est « pose pas de questions », mais on sait jamais je demande.
Kikoodx Hors ligne Labélisateur Points: 2767 Défis: 11 Message

Citer : Posté le 25/11/2020 09:29 | #


Je dois répondre maintenant, tu me forces un peu la main avec ton call
Lephenixnoir a écrit :
Est-ce que tu distingues une fonction d'un appel de la fonction ?

Je pense que c'est possible, mais je ne veux rien garantir là-dessus : je veux finir la base d'abord.

Lephenixnoir a écrit :
Est-ce que tu as de l'ordre supérieur ?

Nope. Ça ne me semble pas très "Basic friendly".

Lephenixnoir a écrit :
C'est typé comment ?

Probablement un système d'alias. Je n'ai pas envie de mettre la gestion de la mémoire dans une boîte noire.
Time is running out
Lephenixnoir Hors ligne Administrateur Points: 20999 Défis: 143 Message

Citer : Posté le 25/11/2020 09:36 | #


Nope. Ça ne me semble pas très "Basic friendly".

Entre nous ne pas avoir d'ordre supérieur ce n'est pas très Lisp-friendly. C'est un peu le base du langage si tu veux

Probablement un système d'alias. Je n'ai pas envie de mettre la gestion de la mémoire dans une boîte noire.

J'ai pas compris ça malheureusement. Tu peux préciser ?
Kikoodx Hors ligne Labélisateur Points: 2767 Défis: 11 Message

Citer : Posté le 25/11/2020 09:52 | #


Quand je dis "syntaxe Lisp" je dis vraiment syntaxe, le but n'est pas de créer un dialecte Lisp qui compile en Basic (ça fait sens ?).

Pour les alias, je veux dire que l'utilisateur pourrait "déclarer" ce genre de choses (juste un exemple) :
(bind continuer l
      touche g
      nom-joueur str-5
      scores-inutiles list-6
      inventaire mat-e
      f fn) ;; en réalité ce serait juste une variable numérique

Je ne suis pas pour un système où le compilateur déduit quelles variables utiliser (en tout cas pas en Basic).
Time is running out
Lephenixnoir Hors ligne Administrateur Points: 20999 Défis: 143 Message

Citer : Posté le 25/11/2020 09:56 | #


Je vois, donc c'est typé sur la syntaxe, comme Basic. Okay nice, c'est clair. Bon courage

Un lexer/parser type STD suffirait à première vue, bon courage
Kikoodx Hors ligne Labélisateur Points: 2767 Défis: 11 Message

Citer : Posté le 25/11/2020 18:42 | #


Salut. Un nouveau jour se lève et... ah mince il est déjà 18:30 ? <_<
Euh bref.
J'avance, mon code utilise ply.lex pour le lexer et je bricole un parser à la main.
Pourquoi donc ?
Cliquez pour recouvrir
Flemme de comprendre ply.yac.

C'est pas trop mal en prenant en compte que c'est moi qui l'ai fait, voici l'entrée de mon programme et la sortie :
//Entrée
((while a
(locate 1 1 "Meh") ;; locate test
(set b (getkey)) ;; read user input
(when (= b KEY_EXIT) (set a 0)))) ;; if exit pressed end the loop

//Sortie, attention les yeux
depth: 0
     depth: 1
     LexToken(LOCATE,'locate',2,12)
     [LexToken(NUMBER,1.0,2,19), LexToken(NUMBER,1.0,2,21), LexToken(STRING,'Meh',2,23)]
     depth: 1
         depth: 2
         LexToken(GETKEY,'getkey',3,55)
         []
     LexToken(SET,'set',3,48)
     [LexToken(ID,'b',3,52), (LexToken(GETKEY,'getkey',3,55), [])]
     depth: 1
         depth: 2
         LexToken(ISEQUAL,'=',4,91)
         [LexToken(ID,'b',4,93), LexToken(ID,'KEY_EXIT',4,95)]
     LexToken(ID,'when',4,85)
     [(LexToken(ISEQUAL,'=',4,91), [LexToken(ID,'b',4,93), LexToken(ID,'KEY_EXIT',4,95)])]
     depth: 1
     LexToken(SET,'set',4,106)
     [LexToken(ID,'a',4,110), LexToken(NUMBER,0.0,4,112)]
None
[LexToken(WHILE,'while',1,2), LexToken(ID,'a',1,8), (LexToken(LOCATE,'locate',2,12), [LexToken(NUMBER,1.0,2,19), LexToken(NUMBER,1.0,2,21), LexToken(STRING,'Meh',2,23)]), (LexToken(SET,'set',3,48), [LexToken(ID,'b',3,52), (LexToken(GETKEY,'getkey',3,55), [])]), LexToken(RPAREN,')',3,62), (LexToken(ID,'when',4,85), [(LexToken(ISEQUAL,'=',4,91), [LexToken(ID,'b',4,93), LexToken(ID,'KEY_EXIT',4,95)])]), (LexToken(SET,'set',4,106), [LexToken(ID,'a',4,110), LexToken(NUMBER,0.0,4,112)]), LexToken(RPAREN,')',4,114), LexToken(RPAREN,')',4,115)]
//J'espère que tous ces square brackets n'ont pas tué le BBCode :p

Je parcours les tokens et PAF récursivité.
Je crois que c'est que j'étais censé faire ? J'en sais rien, ça marche en tout cas
J'espère que ma méthode vous trigger. Je retourne faire des bêtises, de mauvais choix et du code sale
À demain. Ou pas. À bientôt alors.
Time is running out
Lephenixnoir Hors ligne Administrateur Points: 20999 Défis: 143 Message

Citer : Posté le 25/11/2020 20:56 | #


Hmm... spoiler c'est pas tout à fait comme ça que ça doit marcher. C'est pas compliqué, si tu as

• De la récursivité
• Des parenthèses à appairer
• Une construction que tu peux placer dans elle-même
• Des blocs, de l'indentation, etc

... tu dois utiliser un parser (ply.yac - non ça ne fait pas la même chose que ply.lex).

Maintenant les règles syntaxiques de Lisp sont tellement triviales (y'en a qu'une) que tu peux le faire à la main et si t'es dégourdi tu finiras avec le parser LL(1) naturel pour la grammaire qui va bien (juste une fonction récursive de 10 lignes en fait).

Donc... comme tu veux, mais je te conseille au moins de créer un arbre sérieux.
Kikoodx Hors ligne Labélisateur Points: 2767 Défis: 11 Message

Citer : Posté le 26/11/2020 08:47 | #


Lephenixnoir a écrit :
Hmm... spoiler c'est pas tout à fait comme ça que ça doit marcher. [...]

J'en suis conscient, mais je préfère terminer d'une manière que je comprend.
Je sais que ply.yac ne fait pas la même chose que ply.lex. Mon objectif personnel est de créer un "prototype" du langage, principalement pour le fun. Si j'aime comment il fonctionne et s'il a un intérêt (doute ici) je considérerai la "méthode sérieuse"
Je sais que ce n'est pas souhaitable, mais je préfère sortir une mauvaise version qui fonctionne plutôt qu'un joli programme qui ne sera jamais terminé.
Time is running out

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 v42 © créé par Neuronix et Muelsaco 2004 - 2021 | Il y a 68 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