IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Pascal Discussion :

Supprimer les commentaires d'un fichier source


Sujet :

Langage Pascal

  1. #1
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 069
    Points : 15 451
    Points
    15 451
    Billets dans le blog
    9
    Par défaut Supprimer les commentaires d'un fichier source
    Bonjour !

    J'ai commencé un programme qui supprime les commentaires d'un fichier source.

    Avez-vous déjà écrit quelque chose de ce genre ?

    [edit]

    Voilà, le programme reconnaît maintenant les trois sortes de commentaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    program FormateSource;
     
    { Copie un fichier source en enlevant les commentaires. }
     
    {$APPTYPE CONSOLE}
     
    procedure Formate(const f1, f2: string); // noms des fichiers (original, copie modifiée)
    const
      temp1 = 'temp1.txt'; // copies intermédiaires
      temp2 = 'temp2.txt';
    var
      t1, t2: text;
      s1, s2: string;
      c: boolean; // commentaire
      i: integer;
    begin
    ////////////////////////////////////////////////////////////////////////////////
      Assign(t1, f1);
      Reset(t1);
      Assign(t2, temp1);
      Rewrite(t2);
      c := FALSE;
      while not Eof(t1) do
      begin
        ReadLn(t1, s1);
        s2 := '';
        for i := 1 to Length(s1) do
        begin
          if (s1[i] = '{') and ((i = Length(s1)) or (s1[i+1] <> '$')) then c := TRUE;
          if not c then s2 := s2 + s1[i];
          if c and (s1[i] = '}') then c := FALSE;
        end;
        WriteLn(t2, s2);
      end;
      Close(t1);
      Close(t2);
    ////////////////////////////////////////////////////////////////////////////////
      Assign(t1, temp1);
      Reset(t1);
      Assign(t2, temp2);
      Rewrite(t2);
      c := FALSE;
      while not Eof(t1) do
      begin
        ReadLn(t1, s1);
        s2 := '';
        for i := 1 to Length(s1) do
        begin
          if (s1[i]='(') and (i < Length(s1)) and (s1[i+1]='*') then c := TRUE;
          if not c then s2 := s2 + s1[i];
          if c and (s1[i] = ')') and (i > 1) and (s1[i-1]='*') then c := FALSE;
        end;
        WriteLn(t2, s2);
      end;
      Close(t1);
      Close(t2);
    ////////////////////////////////////////////////////////////////////////////////
      Assign(t1, temp2);
      Reset(t1);
      Assign(t2, f2);
      Rewrite(t2);
      while not Eof(t1) do
      begin
        ReadLn(t1, s1);
        s2 := '';
        c := FALSE;
        for i := 1 to Length(s1) do
        begin
          if (s1[i] = '/') and ((i < Length(s1)) or (s1[i+1] = '/')) then c := TRUE;
          if not c then s2 := s2 + s1[i];
        end;
        WriteLn(t2, s2);
      end;
      Close(t1);
      Close(t2);
    ////////////////////////////////////////////////////////////////////////////////
    end;
     
    begin
      Formate('source.dpr', 'source.txt');
    end.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    program source; {pour essayer un programme qui supprime les commentaires}
     
    {$APPTYPE CONSOLE}
     
    {$R *.res}
     
    begin
      {$IFDEF VER230}Write(''){$ELSE}Write(''){$ENDIF};
      {commentaire}Write('');
      Write('');{commentaire}
      {commentaire
      sur deux lignes}
      ReadLn;// barres obliques
      (* parenthèses et astérisques *)
    end.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  2. #2
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    pour le corps j'aurais plutôt vus quelque chose basé sur ParamCount et ParamStr.

    + une aide si on ne rentre pas de paramètres

    renomer "Formate" en "Uncomment" c'est moins ambigue

    ajouter quelque fonctions utile pour changer les extentions

    se baser sur blockRead et passer par un buffer mémoire

    ne pas oublier de traiter les chaines à part car elle peuvent contenir les caractères de commentaires sans que cela en soit.

    et enfin, de bon vieux while et case of bien conditionnés.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
     
    { Copie un fichier source en enlevant les commentaires. }
     
    {$APPTYPE CONSOLE}
     
    {Outils}
     
    function extractFileExt(const aFileName: string): string;
    var X,P: integer;
    begin
      for X := Length(aFileName) to 1 do
        if aFileName[X] = '.' then
        begin
           P := X;
           Break;
        end;
      result := copy(aFileName, P-1, Length(aFileName)-P);
    end;
     
    function ChangeFileExt(const aFileName, aNewExt: string): string;
    var X,P: integer;
    begin
      for X := Length(aFileName) to 1 do
        if aFileName[X] = '.' then
        begin
           P := X;
           Break;
        end;
      if aNewExt[1] = '.' then
        dec(P);
      ChangeFileExt := copy(aFileName, 1, P)+aNewExt;
    end;
     
    {/Outils}
     
    procedure Uncomment(const aFileNameSrc, aFileNameDest: string);
    var
      tSrc,
      tDst : file;
      SBuffer,SOut : string;
      Sz,N,P1,P2: integer;
    begin
      // Open Src and load in String
      assign(tSrc, aFileNameSrc);
      reset(tSrc);
      Sz  := fileSize(tSrc);
      SetLength(SBuffer, Sz);
      blockRead(tSrc, SBuffer[1], Sz);
      close(tSrc);
     
      SOut := '';
     
      N := 1;
      while N < Sz do
      begin
        case SBuffer[N] of
          '''': // Check strings firs, because JSon := '{"": "", "": ""}'; Smiley := '(*.*)';
                begin
                  SOut := SBuffer[N];
                  inc(N);
                  while (N<Sz) and ((SBuffer[N-1] <> '''') and (SBuffer[N] <> '''')) do // only if not "''" char
                  begin
                    SOut := SOut + SBuffer[N];
                    inc(N);
                  end;
                end;
          '(' : (* *)
                if SBuffer[N+1] = '*' then // not an operation
                begin
                  inc(N);
                  while (N<Sz) and ((SBuffer[N-1]+SBuffer[N]) <> '*)') do // to next "*)"
                     inc(N);
                end
                else
                begin
                  SOut := Sout + SBuffer[N];
                  inc(N);
                end;
          '{' : { }
                if SBuffer[N+1] <> '$' then // not a directive
                begin
                  inc(N);
                  while (N<Sz) and (SBuffer[N] <> '}') do  // to next "}"
                     inc(N);
                end
                else
                begin
                  SOut := SOut + SBuffer[N];
                  inc(N);
                end;
          '/' : //
                if SBuffer[N+1] = '/' then // is a comment
                begin
                  inc(N);
                  while (N<Sz) and not (SBuffer[N] in [#13,#10]) do // to end of line
                    inc(N);
                end
                else
                begin
                  SOut := SOut+SBuffer[N];
                  inc(N);
                end;
          else
          begin
            SOut := SOut+SBuffer[N];
            inc(N);
          end;
        end;
      end;
     
      // Save Dest string in file
      Sz := Length(SOut) * SizeOf(Char);
      assign(tDst, aFileNameDest);
      rewrite(tDst, sZ);
      blockWrite(tDst, SOut[1], sZ);
      close(tDst);
    end;
     
    procedure Help;
    begin
      writeln('Source Uncomment v 0.0.1');
      writeln('=====================================================');
      writeln(' Howto use :');
      writeln('   C:\>Uncomment Source Dest');
      writeln(' or');
      writeln('   C:\>Uncomment Source');
      writeln('   note: in this case "source".wocom."ext" is created');
      writeln('         in the same folder of Source.');
    end;
     
    begin
      case paramCount of
        0 : help;
        1 : Uncomment(paramStr(1), changeFileExt(paramStr(1), '.wocom'+extractFileExt(paramStr(2))));
        2 : Uncomment(paramStr(1), paramStr(2));
      end;
    end.
    J'ai pas testé mais ça devrait fonctionner
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  3. #3
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 069
    Points : 15 451
    Points
    15 451
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Dr.Who Voir le message
    J'ai pas testé mais ça devrait fonctionner
    Merci pour ton code, Dr.Who. Je vais m'en inspirer. Mais il doit y avoir une erreur quelque part parce que le programme ne s'exécute pas correctement, d'après l'essai que j'ai fait.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  4. #4
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 069
    Points : 15 451
    Points
    15 451
    Billets dans le blog
    9
    Par défaut
    J'ai essayé de réécrire l'exemple proposé par Dr.Who afin d'en comprendre le fonctionnement. Mon problème, c'est que sauf étourderie de ma part le code suivant ne fonctionne pas : le fichier créé est vide.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    program essai2b;
     
    {$APPTYPE CONSOLE}
     
    procedure Uncomment(const aFileNameSrc, aFileNameDest: string);
    var
      f1, f2: file;
      s1, s2: string;
      sz: integer;
    begin
      Assign(f1, aFileNameSrc);
      Reset(f1);
      sz := FileSize(f1);
      SetLength(s1, sz);
      BlockRead(f1, s1[1], sz);
      Close(f1);
     
      s2 := s1;
     
      sz := Length(s2) * SizeOf(char);
      Assign(f2, aFileNameDest);
      Rewrite(f2, sz);
      BlockWrite(f2, s2[1], sz);
      Close(f2);
    end;
     
    begin
    { essai procédure }
      Uncomment('sample.dpr', 'result.txt');
      ReadLn;
    end.
    J'ai consulté l'aide de Delphi sur BlockRead : on y parle de nombre d'enregistrements. Je ne vois pas le rapport avec ma chaîne. Quelqu'un pourrait-il m'expliquer ?
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  5. #5
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    Je vais tester j'ai du faire une connerie.
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  6. #6
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    sur des fichiers binaires il faut faire un Reset(f, 1);; 1 étant la taille d'un record, sinon FileSize s'exprime par blocs de 128 octets. Idem pour Rewrite.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  7. #7
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 069
    Points : 15 451
    Points
    15 451
    Billets dans le blog
    9
    Par défaut
    Merci pour vos réponses.

    Citation Envoyé par Paul TOTH Voir le message
    sur des fichiers binaires il faut faire un Reset(f, 1);; 1 étant la taille d'un record, sinon FileSize s'exprime par blocs de 128 octets. Idem pour Rewrite.
    Oui, ça fonctionne.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  8. #8
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    Ha oui j'avais complétement oublié cette particularité. Faut dire que je n'utilise plus reset ou rewrite, préférence les TStream et TStringList pour ce genre d'outils.
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  9. #9
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 069
    Points : 15 451
    Points
    15 451
    Billets dans le blog
    9
    Par défaut
    Merci encore pour ton exemple, Dr.Who. J'ai fini de le réécrire. J'ai bien compris maintenant ta technique et je m'en servirai désormais.

    Voici mon projet complet (Virtual Pascal, Delphi 6).

    Le point qui m'a causé quelque difficulté, c'est la gestion des '' dans les chaînes. Je ne sais pas quel est l'algorithme utilisé par les compilateurs pour détecter sans erreur possible la fin des chaînes. Il m'a semblé que pour traiter correctement tous les cas il fallait faire quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
          '''':
          if (s1[i+1] = '''') and (s1[i+2] <> '''') then
          begin
            s2 := s2 + s1[i] + s1[i+1]; // <=> s2 + ''''''
            Inc(i, 2);
          end else
          begin
            s2 := s2 + s1[i]; // <=> s2 + ''''
            Inc(i);
            while (i < sz) and not(
              (s1[i] = '''') and (s1[i+1] <> '''') and (
                (s1[i-1] <> '''') or (
                  (s1[i-2] = '''') and (s1[i-1] = '''')
                )
              )
            ) do
            begin
              s2 := s2 + s1[i];
              Inc(i);
            end;
            s2 := s2 + s1[i];
            Inc(i);
          end;
    Fichiers attachés Fichiers attachés
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  10. #10
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    Dans FlashPascal c'est fait comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    // read a quoted string
    function TSource.StringConst: string;
    var
      done: Boolean;
    begin
      ReadChar; // ''''
      Result := '';
      repeat
        while NextChar <> '''' do
        begin
          if NextChar = #13 then
            Error('Open string');
          Result := Result + ReadChar;
        end;
        ReadChar; // ''''
        if NextChar = '''' then
        begin
          Result := Result + ReadChar;
          done := False;
        end else begin
          done:=True;
        end;
      until done;
    end;
    dans FlashPascal 2 le premier ReadChar permet de savoir si c'est une chaîne à simple ou double quote

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    // read a quoted string
    function TSource.StringConst: string;
    var
      quote: Char;
      done : Boolean;
    begin
      quote := ReadChar; // ''''
      Result := '';
      repeat
        while NextChar <> quote do
        begin
          if NextChar in [#10,#13] then
            Error('Open string');
          Result := Result + ReadChar;
        end;
        ReadChar; // ''''
        if NextChar = quote then
        begin
          Result := Result + ReadChar;
          done := False;
        end else begin
          done := True;
        end;
      until done;
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Supprimer les commentaires d'un code source
    Par Roland Chastain dans le forum Lua
    Réponses: 8
    Dernier message: 24/10/2014, 13h33
  2. Réponses: 1
    Dernier message: 15/10/2012, 14h56
  3. supprimer les commentaires lu sur un fichier?
    Par zemzoum89 dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 05/10/2010, 20h10
  4. Comment supprimer les commentaires d'un document Html?
    Par visteur dans le forum Langage
    Réponses: 2
    Dernier message: 27/03/2006, 11h58
  5. Supprimer les guillemets dans un fichier après écriture
    Par soulryo dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 01/03/2005, 11h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo