Page 1 sur 1

Aide pour module pour pseudo langage

Publié : mar. 26/avr./2011 13:57
par dayvid
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:

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$ = ";"
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

Re: Aide pour module pour pseudo langage

Publié : mar. 26/avr./2011 14:10
par Patrick88
donnes le fichier "Fr.txt", s'il te plait...

Re: Aide pour module pour pseudo langage

Publié : mar. 26/avr./2011 14:19
par dayvid
Mince j'avais cru que j'avais mis le fichier entier
c'est fait, voici le fichier Fr.txt

Code : Tout sélectionner

      
      
      
      // Un commantaire */Idem:*/ 
      
      */ Un commantaire: */
         Sur plusieur */
         Ligne /*
      
      [ éléphant ] = */Une :oppération/* 10 + [ Le chien ] + {" a b c "} + [ La vache ] + {" d e f "} + [ La poule ] + {" g h i "} */Fin: de l'oppération/*
      
      *// *ceci:* est un / * / :commantaire: * // * sur une ligne /*

      */0/* */1/* */2/* */3/* */4/* */5/* */6/* */7/* */8/* */9/* // rien
      */0/**/1/**/2/**/3/**/4/**/5/**/6/**/7/**/8/**/9/**/10/**/10/*

      ecrire{"*:/*/*:/*/"} */ */ */ */ /* */ */ */ */ /* */ */ */ */ /* */ */ */ */ /* dfg	 	 	 	 

      ecrire{"/* /* /*"} // adc xd9  
  
      ecrire{"*/*/*/*/*/*/*/*/*/*/*/*/"} */blablabla 642
      blablablablablablablablablablablabla/* xdf

Copier tous même les ligne vide !