Langage interprété, les bases.

Programmation d'applications complexes
Anonyme

Langage interprété, les bases.

Message par Anonyme »

Salut à tous, suite à la demande d'un membre, je post ma façon d'interprété un langage préalablement créé.

Tout dabord nous allons voir le "Parsing" , le parsing , c'est l'analyse du code, Il faut se mettre à la place d'un compilo, comment fait t'il pour séparer les commentaires du code , comment sait il qu'il y a plusieurs commande sur une seule ligne, etc... , en fait le compilo ne fait rien à part compilé, on lui file du code épurer c'est tout, c'est à dire que le code viens d'être "parser" , il n'y a plus de commentaires, ni d'espace inutile, etc...

C'est ce que nous allons faire ici , nous allons ensemble creer notre langage !
Commencons par le parser.

Voila un langage factice, notre but va être donc d'épurer le code
sans meme connaitre d'avance la syntaxe de mot clé, tel "repete" ou "infini" , nous allons donc isolé le code du reste, c'est à dire que l'on va virer les commentaires. les espaces inutiles , etc...

Voici une rapide description du langage :
  • /* Commentaires */
    Si Condition Alors Action , similaire a If - Then
    Repete infini Boucle infinie
/* Code D'exemple
D'un langage interpreter
tout simple, pas de boucle imbriqué
du style : If If endif if if endif endif endif .....
Pas d'opération mathématique, juste du code bidon ;D
*/


/* D ailleurs je trouve ce type de commentaire très pratique !


LE CODE EST LA SOURCE DU PROGRAMMEUR, L'INTERPRETEUR DOIT LE PARSER AVANT !

Rien ne vous empêche de faire un Editeur de ce fabuleux langage qu'est le votre!
Avec la syntaxe colorisée etc...

*/



/*Boucle principale :

OuvrirEcran() /*Ouverture de l'écran*/

Repete
EffaceEcran /*On efface l'ecran*/


Affiche "Hello World!" /* On affiche hello world!*/


Si Touche(Echap) : Alors : Quitte /* Si echap,alors on quitte*/

Bip() : Dort(100) : Bip() /* 3 commandes sur une seule ligne !!!!!!!! */

Infini

Voici le parser en PB :
Laisser le debugger, Enregistrer le fichier ci dessus au format Txt, une boite de dialogue vous sera alors demandé.

Code : Tout sélectionner

; PARSING PAR CPL.BATOR
; =====================

#EOL = Chr(13)+Chr(10) 



Structure PARSER
  CMD$
  Ligne.l
EndStructure : Global NewList CodeBrut.PARSER()

Structure FINAL_CODE
  CMD$
  FichierLigne.l
  Ligne.l
  JumpTO.l
  LastRepeat.l
EndStructure : Global NewList Code.FINAL_CODE()






Global BufferA$ ;Le buffer va souvent nous servir de Tampon pour les modifs
Global BufferB$ ; et les comparaison
Global Brut$   ;On mettra notre fichier a "parser" dedans. 

FILE_FOR_PARSING$ = OpenFileRequester("Ouvrir","","*.txt",0)

;-PHASE 1 LECTURE DU FICHIER
; ON STOCKE LE FICHIER A PARSER EN MEMOIRE, ON LE MET DANS  : CodeBrute()
OpenFile(0,FILE_FOR_PARSING$)
 While Eof(0)=0
  Brut$ = Brut$ +  ReadString(0) + #EOL           ; On lit la ligne et on la stocke
 Wend
CloseFile(0)



;Une fois notre fichier stocké dans la liste chainée, on peut commencer le traitement
;On va commencer par supprimer tout les commentaires

;-PHASE 2 SUPPRESSION DES COMMENTAIRES
For i = 1 To Len(Brut$)
 
  If Commentaire=0 : BufferA$ = BufferA$ + Mid(Brut$,i,1) : EndIf
  If Commentaire=1 : BufferB$ = BufferB$ + Mid(Brut$,i,1) : EndIf
   
  If FindString(BufferA$,"/*",1) : Commentaire=1 : BufferA$ = RemoveString(BufferA$,"/*") : EndIf
  If FindString(BufferB$,"*/",1) : Commentaire=0 : BufferB$ = RemoveString(BufferB$,"*/") : EndIf
     
Next

Brut$ = BufferA$  ; On passe le Buffer dans le brut, les commentaires sont supprimés ;)
BufferA$ = ""


;-PHASE 3 TROUVER DES COMMANDES QUI SONT SUR UNE SEULE LIGNE

; Il peut y avoir des commandes du style =   Bip():Bip():Bip():end
; il va falloir transformer cela en :

;Bip()
;Bip()
;Bip()
;End

For i = 1 To Len(Brut$)
 BufferA$ = BufferA$ + Mid(Brut$,i,1)

If FindString(BufferA$,":",1)
  BufferA$ = RemoveString(BufferA$,":")
  BufferA$ = BufferA$ + #EOL
EndIf

Next

Brut$ = BufferA$ 
BufferA$ = ""



;-PHASE 4  PREPARATION A L'INTEGRATION DANS UN TABLEAU

;Vu que notre code se trouve dans une variable , il va falloir que l'on sépare les lignes de codes 
;Afin de mettre toutes nos commandes dans un tableau ou une liste chainée de préférence.

; Code(1) = Commande N°1
; Code(2) = Commande N°2
; Code(3) = Commande N°3
; Etc....


 
For i = 1 To Len(Brut$)
  
  BufferA$ = BufferA$ + Mid(Brut$,i,1)
  BufferA$=LTrim(BufferA$) 
  If FindString(BufferA$,#EOL,1)
    AddElement(CodeBrut())
    CodeBrut()\CMD$  = BufferA$
    CodeBrut()\Ligne = ListIndex(CodeBrut())   ; On note la ligne, ca peut servir pour gerer avec précision des erreurs d'interprétation.
    BufferA$=""
  EndIf
Next

;{ 
; Notre code est à present nettoyer de tous les commentaires...
; A present il sera plus facile pour nous , de programmer l'interpreteur en lui meme.
; Comme vous avez pu voir en phase 4, on stocke nos commandes dans une liste chainée "Code()"
; Chaque element represente un code qui va être interprété.



; ForEach Code()
   ; 
  ; Debug "Ligne numéro    : " + Str(CodeBrut()\Ligne)
  ; Debug "CMD$            : " + CodeBrut()\CMD$
  ; Debug "----------------------------------------"
  ; 
; Next

; Si vous executez ce code , vous pouvez apercevoir les fin de chaines et des lignes vides
; La prochaine étape consiste a stocker uniquement les chaines non nulle
;} 

;-PHASE 5 FIN DE L'EPURATION DES CHAINES DE CARACTERERES

; On supprime les charactères de fin de chaines (#EOL) 
ForEach CodeBrut() : CodeBrut()\CMD$ = RemoveString(CodeBrut()\CMD$,#EOL) : Next

ForEach CodeBrut()   ; On Stocke les chaines non nulle , dans une autre liste qui va nous servir de "main courante" pour l'execution du code.
  If CodeBrut()\CMD$<>""
    AddElement(Code())
    Code()\CMD$         = CodeBrut()\CMD$
    Code()\FichierLigne = CodeBrut()\Ligne 
    Code()\Ligne        = ListIndex(Code())
  EndIf
Next


; Nous avons isolé nos lignes de commandes, Maintenant on va pouvoir commencer à interpreté.
Debug "PHASE 5 - LIGNE 145"
ForEach Code()
 Debug "Commande N°"+ Str(Code()\Ligne) + " = " + Code()\CMD$ + " Ligne n° " +Str( Code()\FichierLigne)          
 Debug "-------------------------------------------------"
Next
La prochaine et dernière étape sera l'execution du code.

@++
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

C'est génial !!! la suite !! la suite !! la suite !!
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

Message par poshu »

#lapinou

J'aime ce forum, rien qu'en s'y promenant de temps en temps on aprend plein de trucs.
Anonyme

Message par Anonyme »

Bon j'ai apporté quelques modification concernant le parser, il y avait un bug au niveau du comptage des lignes pour les erreurs. C'est volontairement non optimiser, de manière à rester "compréhensible" de tous. il faut quand meme etre "calé" en manipulation de chaine de caractères, car on a vite fait une erreur.
Avec ca, vous avez une bonne base pour creer un langage de script, ou un concurent à purebasic :D
A vous de rajouté des commandes et d'améillorer le tout. :wink: car là c'est vraiment le minimum :P
/* Code D'exemple
D'un langage interpreter
tout simple, pas de boucle imbriqué : : : : : : : : :
du style : If If endif if if endif endif endif .....
Pas d'opération mathématique, juste du code bidon :D
*/


/* D ailleurs je trouve ce type de commentaire très pratique !


LE CODE EST LA SOURCE DU PROGRAMMEUR, L'INTERPRETEUR DOIT LE PARSER AVANT !

Rien ne vous empêche de faire un Editeur de ce fabuleux langage qu'est le votre!
Avec la syntaxe colorisée etc...

*/



/*Boucle principale :*/

OuvrirEcran() /*Ouverture de l'écran*/

Repete
EffaceEcran /*On efface l'ecran*/


Affiche "Hello World!" /* On affiche hello world!*/


Si Touche(Echap) Alors Quitte /* Si echap,alors on quitte*/

Si Touche(ALL) Alors Bip()




Infini

Code : Tout sélectionner

; PARSING PAR CPL.BATOR
; =====================

#EOL = Chr(13)+Chr(10) 

Structure PARSER
  CMD$
  Ligne.l
EndStructure : Global NewList CodeBrut.PARSER()

Structure FINAL_CODE
  CMD$            ;Nom de la commande
  CMD_OK.b        ;Va nous servir a reconnaitre ou non une commande
  FichierLigne.l  ;On va stocker le numéro de ligne du fichier 
  Ligne.l         ;position dans la liste chaine.
EndStructure : Global NewList Code.FINAL_CODE()

Global LastRepeat.l  ; Va nous servir pour les boucles Repeat Infini (pas imbriqué)
Global LigneCPT.l    ; Va nous servir a compter les lignes (pour les éventuelles erreurs)



Global BufferA$ ;Le buffer va souvent nous servir de Tampon pour les modifs
Global BufferB$ ; et les comparaison
Global Brut$   ;On mettra notre fichier a "parser" dedans. 

FILE_FOR_PARSING$ = OpenFileRequester("Ouvrir","","*.txt",0)

;-PHASE 1 LECTURE DU FICHIER
; ON STOCKE LE FICHIER A PARSER EN MEMOIRE, ON LE MET DANS  : CodeBrute()
OpenFile(0,FILE_FOR_PARSING$)
 While Eof(0)=0
  Brut$ = Brut$ +  ReadString(0) + #EOL           ; On lit la ligne et on la stocke
 Wend
CloseFile(0)

;-PHASE 2  PREPARATION A L'INTEGRATION DANS UN TABLEAU

;Vu que notre code se trouve dans une variable , il va falloir que l'on sépare les lignes de codes 
;Afin de mettre toutes nos commandes dans un tableau ou une liste chainée de préférence.

; Code(1) = Commande N°1
; Code(2) = Commande N°2
; Code(3) = Commande N°3
; Etc....
 
For i = 1 To Len(Brut$)
  
  BufferA$ = BufferA$ + Mid(Brut$,i,1)
  BufferA$=LTrim(BufferA$) 
  If FindString(BufferA$,#EOL,1)
    LigneCPT+1
    AddElement(CodeBrut())
    CodeBrut()\CMD$  = BufferA$
    CodeBrut()\Ligne = LigneCPT   ; On note la ligne, ca peut servir pour gerer avec précision des erreurs d'interprétation.
    BufferA$=""
    EndIf 
Next

;-PHASE 3 SUPPRESION DES COMMENTAIRES
Brut$=""
ForEach CodeBrut() : Brut$ = Brut$ + CodeBrut()\CMD$ : Next  ; On repasse le Codebrut() dans une variable pour effacer les commentaires

For i = 1 To Len(Brut$)
   
  If Commentaire=0 : BufferA$ = BufferA$ + Mid(Brut$,i,1) : EndIf
  If Commentaire=1 : BufferB$ = BufferB$ + Mid(Brut$,i,1) : EndIf
  If Commentaire=1 And FindString(BufferB$,#EOL,1)<>0 :  BufferB$ = RemoveString(BufferB$,#EOL) : BufferA$ + #EOL : EndIf
  
  
  If FindString(BufferA$,"/*",1) : Commentaire=1 : BufferA$ = RemoveString(BufferA$,"/*") : EndIf
  If FindString(BufferB$,"*/",1) : Commentaire=0 : BufferB$ = RemoveString(BufferB$,"*/") :  EndIf
   
Next
Brut$ = BufferA$
BufferA$ = ""



;-PHASE 4 TROUVER DES COMMANDES QUI SONT SUR UNE SEULE LIGNE

; Il peut y avoir des commandes du style =   Bip():Bip():Bip():end
; il va falloir transformer cela en :

;Bip()
;Bip()
;Bip()
;End

; Le problème est qui faut le faire lors de la suppresion des commentaire
; Car lorsque l'on trouve <:> on décompte une ligne, il ne faut pas décomper ceux qui sont dans les commentaires
; sinon on peut avoir des erreurs de saut ou lors d'une erreur d'interprétation, une mauvaise ligne sera indiquer 

For i = 1 To Len(Brut$)
  BufferA$ = BufferA$ + Mid(Brut$,i,1)
  
  Pos =  FindString(BufferA$,":",1)
  
  If Pos<>0
    BufferA$ = ReplaceString(BufferA$,":",#EOL,1,Pos)
    LigneCPT - 1
    Pos=0
  EndIf
Next

Brut$ = BufferA$ 
BufferA$ = ""

;-PHASE 5  PASSAGE FINAL DE BRUT$ DANS CODEBRUT() 
; Ensuite, lorsque les commentaires sont supprimé de la variable Brut$ alors on reppase le tout dans codebrut()

FirstElement(CodeBrut())
For i = 1 To Len(Brut$)
  BufferA$ = BufferA$ + Mid(Brut$,i,1)
  If FindString(BufferA$,#EOL,1)
    CodeBrut()\CMD$ = BufferA$
    NextElement(CodeBrut()) 
    BufferA$=""
  EndIf
Next

;{ 
; Notre code est à present nettoyer de tous les commentaires...
; A present il sera plus facile pour nous , de programmer l'interpreteur en lui meme.
; Comme vous avez pu voir en phase 4, on stocke nos commandes dans une liste chainée "Code()"
; Chaque element represente un code qui va être interprété.



; ForEach CodeBrut()
   ; 
  ; Debug "Ligne numéro    : " + Str(CodeBrut()\Ligne)
  ; Debug "CMD$            : " + CodeBrut()\CMD$
  ; Debug "----------------------------------------"
  ; 
; Next


; Si vous executez ce code , vous pouvez apercevoir les fin de chaines et des lignes vides
; La prochaine étape consiste a stocker uniquement les chaines non nulle
;} 


;-PHASE 6 FIN DE L'EPURATION DES CHAINES DE CARACTERERES

; On supprime les charactères de fin de chaines (#EOL) 
ForEach CodeBrut() : CodeBrut()\CMD$ = RemoveString(CodeBrut()\CMD$,#EOL) : Next

ForEach CodeBrut()   ; On Stocke les chaines non nulle , dans une autre liste qui va nous servir de "main courante" pour l'execution du code.
  If CodeBrut()\CMD$<>""
    AddElement(Code())
    Code()\CMD$         = CodeBrut()\CMD$
    Code()\FichierLigne = CodeBrut()\Ligne  ; Pk le -2 ??? je ne sais pô , sinon sa bug on tombe 2 ligne en dessous lors d'une erreur 
    Code()\Ligne        = ListIndex(Code())
  EndIf   
Next

; On supprime les charactères de fin de chaines (#EOL) 
 ForEach Code() : 
  
  Code()\CMD$ = RemoveString(Code()\CMD$,#EOL) :
  
  If Code()\CMD$=""
    DeleteElement(Code())
  EndIf
  
Next



;Nous avons isolé nos lignes de commandes, Maintenant on va pouvoir commencer à interpreté.

ForEach Code()
 Debug "Commande N°"+ Str(Code()\Ligne) + " = " + Code()\CMD$ + " Ligne n° " +Str( Code()\FichierLigne)          
 Debug "-------------------------------------------------"
Next



; Il est possible de faire effectuer toutes les actions dans cette procedure
; Ici, on en fera que 2 Quitte & Bip

Procedure Exec_Action(STR$)
 
  Select STR$
  
    Case "QUITTE" : End 
    
    Case "BIP(" : beep_(1000,100)
   
    Default  ; Va nous servir a gerer les erreurs
      
      MessageRequester("Erreur d'interpretation","Commande inconnue : "+STR$+" à la ligne "+Str(Code()\FichierLigne))
         
  EndSelect
   
EndProcedure



;-EXECUTION DU CODE

FirstElement(Code())


For i = 0 To CountList(Code())-1 ; On pourrais faire Exec_Action(Code()\cmd$) puis tout traiter dans cette procedure.
   
  ; On a trouver une commande d'ouverture d'écran, alors on l'ouvre, on pourrais utiliser Exec_Action() si on avait rajouter des case ds select/endselect
  ; Un coup de stringfield ferait l'affaire pour récupérer les paramètres Dans Exec_Action()
  If FindString(UCase(Code()\CMD$), "OUVRIRECRAN()",1)
    InitSprite() : InitKeyboard() : OpenWindow(0,0,0,640,480,"") : OpenWindowedScreen(WindowID(0),0,0,640,480,1,0,0)
  EndIf
  
  ; On tombe sur un REPETE, alors on note l'index courant, de manière lorsque l'on tombe sur un infini, il faut que l'on retourne sur Repete pour ainsi faire la boucle
  If FindString(UCase(Code()\CMD$), "REPETE",1)
    LastRepeat = ListIndex(Code())
    Event=WindowEvent()
  EndIf
  
  ; On efface l'écran
  If FindString(UCase(Code()\CMD$), "EFFACEECRAN",1)
    ClearScreen(0) : ExamineKeyboard()
  EndIf
  
  ; On affiche un texte passé en paramètre  a AFFICHE
  If FindString(UCase(Code()\CMD$), "AFFICHE",1)
    BufferA$ = StringField(Code()\CMD$,2,Chr(34))
    
    StartDrawing(ScreenOutput())
     DrawText(0,0,BufferA$)
      StopDrawing()
     
  EndIf
  
  
  ; Voici une Condition avec une simple Action a effectuer
  ; Pas de : if Condition : Action : Action : Action : Endif
  ; juste  : Si Touche Condition Alors Action
  
  If FindString(UCase(Code()\CMD$), "SI TOUCHE",0)
    
    BufferA$ = StringField(Code()\CMD$,1,")")       ; BufferA va contenir la touche (Condition)
     BufferA$ = StringField(BufferA$,2,"(")
     BufferA$ = UCase(BufferA$)
    
    Select BufferA$
      Case "ECHAP"   : BufferA$ = Str(#PB_Key_Escape)
      Case "ALL"     : BufferA$ = Str(#PB_Key_All)
    EndSelect
    
    BufferB$ = StringField(Code()\CMD$,2,")")     ; BufferB va contenir l'action à effectuer, on va le passez en paramètre
    BufferB$ = RemoveString(BufferB$,"ALORS",1)   ; a exec_action() qui lui doit reconnaitre l'action
    BufferB$ = Trim(BufferB$)
    BufferB$ = UCase(BufferB$)
    
    If KeyboardPushed(Val(BufferA$))
      Exec_Action(BufferB$)
    EndIf
     
  EndIf
  
  
  ; On tombe sur INFINI , comme il y a eu un repete juste avant, alors on saute (change l'élément courant de la liste Code() ) sur repete, etc...
  If FindString(UCase(Code()\CMD$), "INFINI",1)
    SelectElement(Code(),LastRepeat-1)
    i=LastRepeat-1
    FlipBuffers()
  EndIf
  
  
  
  If Event = #PB_Event_CloseWindow : End : EndIf
  NextElement(Code())
Next
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Moi lorsque je m'étais pencher sur le problème j'étais arrivé au même point ou en est ton programme actuellement. là ou j'ai plus de mal c'est lorsqu'il y a des boucles imbriqués ou des calcules. J'éspère que tu vas en parler :P dans tout les cas merci ! j'ai apris quelques trucs que moi j'avais programmé plus salement :lol:
Anonyme

Message par Anonyme »

Pour les calculs dobro avait donné cette soluce :
http://purebasic.forum-gratuit.com/viewtopic.php?t=5261

@++
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Cpl.Bator a écrit :Pour les calculs dobro avait donné cette soluce :
http://purebasic.forum-gratuit.com/viewtopic.php?t=5261

@++
Merci beaucoup :)
Anonyme

Message par Anonyme »

De rien ^^ sinon avec Japbe il y a une commande Eval() qui permet de faire cela.

Pour les boucles imbriquées rien de simple, du liste tout les if trouvé puis dès qui il y a un Endif alors tu saute au dernier if rencontrer, tu le supprime de la liste , ainsi de suite...


@++
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

moi j'attends que tu abordes les variables :D

celles qui se trouve dans le pseudo-code !!
qui peut avoir n'importe quel nom , tu peux pas savoir a l'avance
et n'importe quel affectation de valeur , tu sais pas a l'avance non plus :lol:

(comme dans mon puregolo :D )

en prenant ton exemple comment vas tu gerer la variable Bebert ??
a savoir qu'elle pourrai s'appeler toto :D

c'est une question a 1 centime de dinar :lol:
/* Code D'exemple
D'un langage interpreter
tout simple, pas de boucle imbriqué : : : : : : : : :
du style : If If endif if if endif endif endif .....
Pas d'opération mathématique, juste du code bidon Very Happy
*/


/* D ailleurs je trouve ce type de commentaire très pratique !


LE CODE EST LA SOURCE DU PROGRAMMEUR, L'INTERPRETEUR DOIT LE PARSER AVANT !

Rien ne vous empêche de faire un Editeur de ce fabuleux langage qu'est le votre!
Avec la syntaxe colorisée etc...

*/



/*Boucle principale :*/

OuvrirEcran() /*Ouverture de l'écran*/

Repete
EffaceEcran /*On efface l'ecran*/


Affiche "Hello World!" /* On affiche hello world!*/


Si Touche(Echap) Alors Quitte /* Si echap,alors on quitte*/

Si Touche(ALL) Alors Bip()

bebert=bebert+1



Infini
Dernière modification par Backup le jeu. 21/sept./2006 18:48, modifié 3 fois.
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

je vais donner mon petit grain de sel ^^

@Cpl.Bator
j'aime bien ton exemple, je vais le garder au chaud ^^

@Ceux que ca intéresse
il existe une facon de définir comment analyser un code (sais pas si c'est standard)
on parle de "grammaire e dezcription du langage"
http://fr.wikipedia.org/wiki/Forme_de_Backus-Naur

pour l'évaluation d'une expression, la notation polonaise est semble-t-il idéale
(comme sur les calculettes HP)
http://fr.wikipedia.org/wiki/Notation_polonaise_inverse

je dis pas que le langage doit utiliser cette notation mais qu'il serait peut etre judicieux de transformer les expressions sous cette fome (ne pas oublier de gérer la priorité des opérateurs)

et enfin pour tous les blocs de code imbriqués (conditions, boucles...)
une pile FIFO convient parfaitement ^^

Dri

PS. c'est un truc que je veux bidouiller quand j'aurais du temps...
Anonyme

Message par Anonyme »

@Dobro , un simple mon clé peut sufir pour déclarer une variable.

/* Code D'exemple
D'un langage interpreter
tout simple, pas de boucle imbriqué : : : : : : : : :
du style : If If endif if if endif endif endif .....
Pas d'opération mathématique, juste du code bidon Very Happy
*/


/* D ailleurs je trouve ce type de commentaire très pratique !


LE CODE EST LA SOURCE DU PROGRAMMEUR, L'INTERPRETEUR DOIT LE PARSER AVANT !

Rien ne vous empêche de faire un Editeur de ce fabuleux langage qu'est le votre!
Avec la syntaxe colorisée etc...

*/

Variable bebert as Long

/*Boucle principale :*/

OuvrirEcran() /*Ouverture de l'écran*/

Repete
EffaceEcran /*On efface l'ecran*/


Affiche "Hello World!" /* On affiche hello world!*/


Si Touche(Echap) Alors Quitte /* Si echap,alors on quitte*/

Si Touche(ALL) Alors Bip()

bebert=bebert+1



Infini
Ou sinon , tu fait comme PB, Lorsque qu'il trouve un nom lors du parsing
collé à .l ou .s ou .x alors c'est une variable que l'on est en train de déclarer.
Ou alors, si l'interpreteur tombe sur une commande qui n'est pa une commande mais qu'il y a une valeur d'attribuer a ce nom alors c'est une variable.
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message par flaith »

Un lien bien utile sur les Algorithmes : http://algo.developpez.com/

ce tuto est bien sympa par exemple : http://sjrd.developpez.com/algorithmiqu ... ntaxiques/
Anonyme

Message par Anonyme »

@Dr.Dri

Comment tu gère ca avec une pile FIFO ? :D

Code : Tout sélectionner

If

If : Endif

If : Endif


endif
@Flaith , thx pr les liens
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Cpl.Bator a écrit :@Dr.Dri

Comment tu gère ca avec une pile FIFO ? :D
bah j'y arrive pas vu que c'est avec une pile LIFO :lol:
(j'imagine que t'avais compris mon labsus...)

Dri
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Cpl.Bator a écrit :@Dobro , un simple mon clé peut sufir pour déclarer une variable.
.
ce n'etait pas ma question !
le but n'est pas de savoir si l'on a a faire a une variable , mais de savoir ce que tu fais de cette information :D

toto=toto+1 ?? :D

tout en sachant que tant que le programme n'est pas fini , il faut tenir a jour toto .... :D
Répondre