Posté le 24/11/2020 19:24
Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 150 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
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.
Citer : Posté le 25/11/2020 09:29 | #
Je dois répondre maintenant, tu me forces un peu la main avec ton call
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.
Est-ce que tu as de l'ordre supérieur ?
Nope. Ça ne me semble pas très "Basic friendly".
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.
Citer : Posté le 25/11/2020 09:36 | #
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
J'ai pas compris ça malheureusement. Tu peux préciser ?
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) :
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).
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
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.
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 :
((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.
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.
Citer : Posté le 26/11/2020 08:47 | #
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é.