Aide pour module pour pseudo langage
Publié : mar. 26/avr./2011 13:57
Salut a tous
Je me penche depuis un sérieux moment sur un code
et dans ce code certaine chose sont paramétrable
Bien comme rien ne vaut mieux qu'un exemple:
Bref un véritable casse tête a gérer
comment dois-je procéder, un exemple m'aiderais bien
j'ai fait en sorte de mettre uniquement le code nécessaire
et rien de plus pour mon exemple
Sinon voici la bête mais pas au point encore
je cherche toujours a essayer de crée un pseudo langage
j'en suis loin évidement mais en faisans de petit module
qui pourront resservir plus tard sa ne sert pas a rien
http://www.archive-host.com/files/98168 ... a4e/ici.7z
Je me penche depuis un sérieux moment sur un code
et dans ce code certaine chose sont paramétrable
Bien comme rien ne vaut mieux qu'un exemple:
Code : Tout sélectionner
Global NewList CodeBrut.s()
Global NewList CodeCommentaireTraiter.s()
Global LigneExtraction = 0
Global Code$ = ""
Global NombreCaractereDebutChaine = 0
Global NombreCaractereFinChaine = 0
Global PremierCaractereDebutChaine$ = ""
Global PremierCaractereFinChaine$ = ""
Global DebutChaine$ = Chr(34)
Global FinChaine$ = Chr(34)
Global DebutVariable$ = "["
Global FinVariable$ = "]"
Global CommentaireUnique$ = "//"
Global DebutCommentaire$ = "*/"
Global FinCommentaire$ = "/*"
Global SeparateurDeLigne$ = ":"
Procedure.l LectureFichierCode(Fichier$)
If ReadFile(1, Fichier$) ; Si le fichier peut être lu , on continue...
While Eof(1) = 0 ; Boucle tant que la fin du fichier n'est pas atteinte. (Eof = 'End Of File')
AddElement(CodeBrut())
CodeBrut() = ReadString(1) ; Affiche ligne par ligne le contenu du fichier
Wend
CloseFile(1) ; Ferme le fichier précédemment ouvert
Else ; Sinon ont affiche un message d'avertissement
MessageRequester("Information","Impossible d'ouvrir le fichier !")
EndIf
EndProcedure
Procedure.s TrimComment(CommentaireUnique$, DebutCommentaire$, FinCommentaire$, DebutChaine$, FinChaine$)
FirstElement(CodeBrut())
ClearList(CodeCommentaireTraiter())
ligne = 0
Interupteur$ = "On"
Positionextraction = 0
PremierCaractereCommentaireUnique$ = Mid(CommentaireUnique$, 1, 1)
NombreCaractereCommentaireUnique = Len(CommentaireUnique$)
PremierCaractereDebutCommentaire$ = Mid(DebutCommentaire$, 1, 1)
NombreCaractereDebutCommentaire = Len(DebutCommentaire$)
PremierCaractereFinCommentaire$ = Mid(FinCommentaire$, 1, 1)
NombreCaractereFinCommentaire = Len(FinCommentaire$)
PremierCaractereDebutChaine$ = Mid(DebutChaine$, 1, 1)
NombreCaractereDebutChaine = Len(DebutChaine$)
PremierCaractereFinChaine$ = Mid(FinChaine$, 1, 1)
NombreCaractereFinChaine = Len(FinChaine$)
ForEach CodeBrut()
; on va extraire chaque caractère de la ligne de code jusqu'a rencontrer un caractère bien spécifique
; et sous certaine condition on va les mémoriser de sorte a ne prendre en compte uniquement que
; les ligne de code et non les commentaire qu'il soit sur une ou plusieur ligne
ligne + 1
Positionextraction = 0
autorisation = 1
BufferLigneDeCodeDejaEcrie = 0
If DebutCommentaire = 0
BufferLigneDeCode$ = ""
Interupteur$ = "On"
EndIf
For TraitementCommentaire = 1 To Len(CodeBrut()) ; je commence l'oppération en partent du début jusqu'a la fin de la ligne de code
Positionextraction + 1
Caractere$ = Mid(CodeBrut(), Positionextraction, 1) ; j'éxtrait un par un chaque cacartère de la ligne de code
If Interupteur$ = "On" ; va servire si ya plusieurs commentaire sur la même ligne, ceci est un selecteur
; On = on prend en compte le caractère
; Off on ne prend pas en compte le caractère
; des que on trouvera un commentaire, le comutateur ce metra sur Off
; pour ne pas prendre en compte les commentaires
BufferLigneDeCode$ + Caractere$
If Caractere$ = PremierCaractereCommentaireUnique$ And DebutChaineDeCaractere = 0
If Caractere$ = PremierCaractereFinCommentaire$
; je vais extraire dans la ligne de code le nombre de caractère = à NombreCaractereFinCommentaire
Buffer$ = Mid(CodeBrut(), Positionextraction, NombreCaractereFinCommentaire)
; si tous les caractère extrait sont identique a FinCommentaire$
If Buffer$ = FinCommentaire$ ; il y a une erreur de syntaxe dans la ligne de code car les caractères de fin de commentaire on été trouvé alors qu'il n'y aucun début de commentaire
MessageRequester("Erreur de syntax", " Fin de commentaire non attendue a la ligne " + Str(ligne), 16)
End ; on interon le programme car on ne peut pas continuer puisque il y a une erreur de code
EndIf ; sinon c'est que tous va bien
EndIf
; je vais extraire dans la ligne de code le nombre de caractère = à NombreCaractereCommentaireUnique
Buffer$ = Mid(CodeBrut(), Positionextraction, NombreCaractereCommentaireUnique)
; si tous les caractère extrait sont identique a CommentaireUnique$
If Buffer$ = CommentaireUnique$
; ont as trouvé un commentaire unique
;Debug "à trouvé un commentaire unique a la ligne " + Str(ligne) + ", à la position " +Str(Positionextraction); on met une petite info sur le traitement de la ligne en court, comme sa on s'y retrouvara mieux dans le code
; je met une autorisation car si on as déjà trouvé un commentaire sur la ligne sa change tous
If autorisation = 1
; j'enlève le caractère de debut de commentaire
BufferLigneDeCode$ = Mid(BufferLigneDeCode$, 1, Len(BufferLigneDeCode$) - 1)
EndIf
Break ; on igniore le restant de la ligne et on passe a la suivente
Else ; sinon on continue
Continue
EndIf
ElseIf Caractere$ = PremierCaractereDebutCommentaire$ And DebutChaineDeCaractere = 0
; je vais extraire dans la ligne de code le nombre de caractère = à NombreCaractereDebutCommentaire
Buffer$ = Mid(CodeBrut(), Positionextraction, NombreCaractereDebutCommentaire)
; si tous les caractère extrait sont identique a DebutCommentaire$
If Buffer$ = DebutCommentaire$
; ont as trouvé un debut de commentaire
;Debug "à trouvé un debut de commentaire a la ligne " + Str(ligne) + ", à la position " +Str(Positionextraction) ; on met une petite info sur le traitement de la ligne en court, comme sa on s'y retrouvara mieux dans le code
Interupteur$ = "Off"
; j'enlève le caractère de debut de commentaire
BufferLigneDeCode$ = Mid(BufferLigneDeCode$, 1, Len(BufferLigneDeCode$))
DebutCommentaire = 1
Positionextraction + Len(DebutCommentaire$) - 1
TraitementCommentaire = Positionextraction
EndIf
ElseIf Caractere$ = PremierCaractereDebutChaine$
; je vais extraire dans la ligne de code le nombre de caractère = à NombreCaractereDebutChaine
Buffer$ = Mid(CodeBrut(), Positionextraction, NombreCaractereDebutChaine)
; si tous les caractère extrait sont identique a DebutChaine$
If Buffer$ = DebutChaine$
; ont as trouvé un debut de chaine de caractère
;Debug "à trouvé un debut de chaine de caractère a la ligne " + Str(ligne) + ", à la position " + Str(Positionextraction) ; on met une petite info sur le traitement de la ligne en court, comme sa on s'y retrouvara mieux dans le code
; on ne met pas Interupteur$ à Off car on garde bien la ligne puisque ce n'est pas un commentaire mais une chaine de caractère
If FindString(CodeBrut(), FinChaine$, Positionextraction + Len(DebutChaine$)) ; si on trouve bien sur la ligne de code FinChaine$
; tous va bien, la chaine de caractère est correcte, on est obliger de vérrifier cella ou sinon on s'y perdrait
DebutChaineDeCaractere = 1
AddElement = 1
Else
; il y as une erreur de syntaxe dans la ligne de code, les caractères de fin de chaine sont introuvable
; mais on continue comme si de rien n'étais
EndIf
EndIf
ElseIf Caractere$ = PremierCaractereFinChaine$
; je vais extraire dans la ligne de code le nombre de caractère = à NombreCaractereFinChaine
Buffer$ = Mid(CodeBrut(), Positionextraction, NombreCaractereFinChaine)
; si tous les caractère extrait sont identique a FinChaine$
If Buffer$ = FinChaine$
; ont as trouvé une fin de chaine de caractère
;Debug "à trouvé une fin de chaine de caractère a la ligne " + Str(ligne) + ", à la position " +Str(Positionextraction) ; on met une petite info sur le traitement de la ligne en court, comme sa on s'y retrouvara mieux dans le code
DebutChaineDeCaractere = 0
AddElement = 0
EndIf
ElseIf Caractere$ = PremierCaractereFinCommentaire$ And DebutChaineDeCaractere = 0
; je vais extraire dans la ligne de code le nombre de caractère = à NombreCaractereFinCommentaire
Buffer$ = Mid(CodeBrut(), Positionextraction, NombreCaractereFinCommentaire)
; si tous les caractère extrait sont identique a FinCommentaire$
If Buffer$ = FinCommentaire$ ; il y a une erreur de syntaxe dans la ligne de code car les caractères de fin de commentaire on été trouvé alors qu'il n'y aucun début de commentaire
MessageRequester("Erreur de syntax", " Fin de commentaire non attendue a la ligne " + Str(ligne), 16)
End ; on interon le programme car on ne peut pas continuer puisque il y a une erreur de code
EndIf ; sinon c'est que tous va bien
EndIf
ElseIf Interupteur$ = "Off" ; a partir d'ici, on ne prends plus en compte aucun caractère
If DebutCommentaire = 1 And Positionextraction = Len(CodeBrut()) ; par exemple si il y as un début de commentaire sur la ligne mais que c'elle-ci n'est pas terminer sur cette même ligne
; et que on est a la fin de la ligne, sa veut dire que la suite du commentaire ce trouve sur la ligne suivente, donc on ajoute une ligne vide correspondent a cette prochaine ligne
BufferLigneDeCodeDejaEcrie = 1
AddElement(CodeCommentaireTraiter())
CodeCommentaireTraiter() = Mid(BufferLigneDeCode$, 1, Len(BufferLigneDeCode$) - 1)
BufferLigneDeCode$ = ""
AjoueLignevide = 0
;Debug "a ajouté une ligne vide a la ligne " + Str(ligne)
Continue
EndIf
; ne prend pas en compte le carectère
If Caractere$ = PremierCaractereFinCommentaire$
; je vais extraire dans la ligne de code le nombre de caractère = à NombreCaractereFinCommentaire
Buffer$ = Mid(CodeBrut(), Positionextraction, NombreCaractereFinCommentaire)
; si tous les caractère extrait sont identique a FinCommentaire$
If Buffer$ = FinCommentaire$
; ont as trouvé un commentaire de fin
;Debug "à trouvé une fin de commentaire a la ligne " + Str(ligne) + ", à la position " +Str(Positionextraction); on met une petite info sur le traitement de la ligne en court, comme sa on s'y retrouvara mieux dans le code
Interupteur$ = "On"
autorisation = 0
; j'enlève le caractère de fin de commentaire
BufferLigneDeCode$ = Mid(BufferLigneDeCode$, 1, Len(BufferLigneDeCode$) - 1)
Positionextraction + Len(FinCommentaire$) - 1
TraitementCommentaire = Positionextraction
DebutCommentaire = 0
AddElement = 0
Else ; sinon on continue
Continue
EndIf
ElseIf Caractere$ = PremierCaractereFinChaine$
Else ; sinon on continue
AddElement = 1
Continue
EndIf
EndIf
Next
If AddElement = 0
If autorisation = 0 And FindString(BufferLigneDeCode$, "/", Len(BufferLigneDeCode$) - 1)
; j'enlève le caractère de debut de commentaire
BufferLigneDeCode$ = Mid(BufferLigneDeCode$, 1, Len(BufferLigneDeCode$) - 1)
EndIf
If BufferLigneDeCodeDejaEcrie = 0
AddElement(CodeCommentaireTraiter())
CodeCommentaireTraiter() = BufferLigneDeCode$
EndIf
EndIf
Next CodeBrut()
EndProcedure
LectureFichierCode("Fr.txt")
TrimComment(CommentaireUnique$, DebutCommentaire$, FinCommentaire$, DebutChaine$, FinChaine$)
ForEach CodeCommentaireTraiter()
Debug CodeCommentaireTraiter()
Next CodeCommentaireTraiter()
Bien le problème est que la sa coince car il devrais apparaître
le code sans les commantaires
et de plus ceci:
Global DebutChaine$ = Chr(34)
Global FinChaine$ = Chr(34)
Global DebutVariable$ = "["
Global FinVariable$ = "]"
Global CommentaireUnique$ = "//"
Global DebutCommentaire$ = "*/"
Global FinCommentaire$ = "/*"
Global SeparateurDeLigne$ = ":"
est paramétrable, sa pourrais très bien être:
Global DebutChaine$ = "'"
Global FinChaine$ = "'"
Global DebutVariable$ = "[" + Chr(34)
Global FinVariable$ = Chr(34) + "]"
Global CommentaireUnique$ = "/"
Global DebutCommentaire$ = "*//"
Global FinCommentaire$ = "//*"
Global SeparateurDeLigne$ = ";"
comment dois-je procéder, un exemple m'aiderais bien
j'ai fait en sorte de mettre uniquement le code nécessaire
et rien de plus pour mon exemple
Sinon voici la bête mais pas au point encore
je cherche toujours a essayer de crée un pseudo langage
j'en suis loin évidement mais en faisans de petit module
qui pourront resservir plus tard sa ne sert pas a rien
http://www.archive-host.com/files/98168 ... a4e/ici.7z