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 Perl Discussion :

Analyseur de fichiers


Sujet :

Langage Perl

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    130
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Doubs (Franche Comté)

    Informations forums :
    Inscription : Août 2008
    Messages : 130
    Points : 53
    Points
    53
    Par défaut Analyseur de fichiers
    Bonjour à tous!

    Alors voila ... :p

    Je cherche à faire un analyseur de fichier en Perl.
    Ces fichiers sont plus précisement des *.H contenant des constantes et que j'aimerais extraire via une appli en Perl.
    J'ai déja pas trop mal avancé, mais je me retrouve bloqué.

    Mon programme analyse un fichier.h en lecture et ouvre un fichier TXT en écriture, pour y écrire les les constantes à sortir.
    Mon programme "retire" les commentaires (// ou /* */) il reconnait les #define et les typedef enum.

    Mon problème est:

    Dans mon Fichier.h, si jamais dans une enum j'ai par exemple une constante et une valeur affectée comme ceci:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typedef enum test
    {
       test = -4,
       truc
    };
    La il n'y a pas de soucis mon fichier Txt contient bien la constante et sa valeur (ainsi que le '-').

    Mon problème arrive lorsque l'on a ceci dans le fichier.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    typedef enum test
    {
       test = 
       -4,
       truc
    };
    A partir de la ca ne fonctionne plus et je ne trouve pas de solution.

    Voici mes sources:
    (Attention les constantes etc... ont des noms bidon :p )
    Fichier Perl:
    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
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
     
    #ouverture du fichier *.h en mode Lecture
    open FICHIER,"<josette.h" or die "Le fichier n'existe pas !";
    #ouverture du fichier *.txt en mode Ecriture
    open WRITER,"> decode2.txt" or die "Le fichier ne peut être édité !\n";
     
    my $ligne;
    my $state = "base";
    my $state_end_line = "vide";
     
    while ($ligne = <FICHIER>)
    {
       print "\n$ligne-------------------------- $state";
     
       if($state ne "comment_end")
       {
          if($ligne =~ m/(.*)\/{2,}/)
          {
             $ligne = "$1\n";
          }
     
          if($ligne =~ m/(.*)\/\*/)
          {
             $state_end_line = "comment_end";
             $ligne = "$1\n";
          } 
       }
     
       if($state eq "comment_end")
       {
          if($ligne =~ m/(.*)\*\/(.*)/)
          {
             $ligne = "$1\n";
             $state = "base";
          }
       }
     
       if($state eq "base")
       {
          if($ligne =~ m/#define\s+(\w+)\s+([0-9a-zA-Z-\+]+)(.*)/)
          {
             $libelle = $1;
       	     $valeur = $2;
       	     $hDef{$valeur} = $libelle;
             $valeur_base = $valeur+1;
       	     print WRITER $valeur;
       	     print WRITER " $libelle\n";
       	     $ligne = $3;
          }
       }
     
       if($state eq "base")
       {
          if($ligne =~ m/enum(.*)/)
          {
             $state = "accolade";
       	     print " $state ";
       	     $ligne = $1;
       	     $valeur_base = 0;
    	  }
       }
     
       if($state eq "accolade")
       {
          if($ligne =~ m/\{+(.*)/)
          {
             $state = "libelle";
       	     print " $state ";
       	     $ligne = "$1\n";
          }
       }
     
       if($state eq "libelle")
       {
          if($ligne =~ m/(\w+)(.*)/)
          {
             $state = "suite_libelle";
       	     print " $state ";
       	     $libelle = $1;
       	     $ligne = "$2\n";   	     
          }
       }
     
       if($state eq "suite_libelle")
       {
          if($ligne =~ m/([=,\}]{1})(.*)/) 
       	  {
             $ligne = "$2\n";
       	     $Sep = $1;
     
             if($1 eq "=")
             {
                $state = "valeur_enum";
                print $state;
             }
             else
         	 {
       	        $valeur = $valeur_base;
                $state = "fin_enum";
                print $state;
       	     }
          }
       }
     
       if($state eq "valeur_enum")
       {
          if($ligne =~ m/([-\+\w]+)(.*)/)
          {
             $valeur = $1;
             $ligne = "$2\n";
             $state = "fin_valeur";
          }	
          else	
          {
          	 $state = "base";
          	 print " Anomalie $state\n";
             print WRITER "Anomalie\n";         
          }
       }
     
       if($state eq "fin_valeur")
       {	
          if($ligne =~ m/([,\}]{1})(.*)/)
          {
             $ligne = "$2\n";
             $Sep = $1;
           	 $state = "fin_enum";
          }
       }
     
       if($state eq "fin_enum")
       {
          $hDef{$valeur} = $libelle;
          $valeur_base = $valeur+1;
          print WRITER $valeur;
          print WRITER " $libelle\n";
     
          if($Sep eq ",")
          {
             $state = "libelle";
             print " $state";
          }
          else
          {
             $state = "base";         
          }
          print " $state ";
       }
     
       if($state_end_line ne "vide")
       {
          $state = $state_end_line;
          $state_end_line = "vide";
       }
    }
     
    close(FICHIER);
    close(WRITER);
    Fichier .h:
    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
     
    // banane
     
    #define banane 12
     
    typedef enum grosNland
    {
       igloo =
       -4,
       buse
       ,
       couture = banane
    };
     
    /*
    #define burne molle
     
    typedef enum
    {
       null = 0
    }
    //
    */
    #define burne 56 /*
    #define bouse quipue
    */
     
    typedef enum nouille
    {
       tortellini,
       tagliatelle,
    };
    Second "Problème":

    Dans mon Fichier.h, j'ai un #define banane 12.
    Et dans mon enum, j'ai "couture = banane".
    J'aimerais aussi que dans mon programme, la valeur de couture soit 12 et non pas banance (cf #define pour le 12).

    voila en vous remerciant d'avance pour vos conseils éventuels

    Bonne journée à vous

  2. #2
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Bon, tu nous demandes le plus difficile là .
    Tu souhaites faire un programme pour parser des fichiers d'en-tête en langage de programmation C ou C++.

    En fonction de l'écriture du script, c'est sûr que ce ne sera pas évident.

    Il n'existe pas en C ou C++ un reformatage de code à la Perltidy ?

    Sinon Moi, à ta place, dans je ne lirais pas le fichier ligne à ligne, car ça devient coriace et prise de tête à vouloir chercher des blocs de codes.
    J'engloberais tout le fichier dans une variable (Je sais que c'est horrible, mais je pense pas que tu ne tomberas sur des scripts faisant 1 Go ).
    Puis je jouerais dessus à base de regex.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    130
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Doubs (Franche Comté)

    Informations forums :
    Inscription : Août 2008
    Messages : 130
    Points : 53
    Points
    53
    Par défaut
    Les fichiers d'en têtes sont en C.

    Et je voudrais y arriver de cette façon

    Donc si quelqu'un a des conseils

  4. #4
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Je te coltine un petit script.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    130
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Doubs (Franche Comté)

    Informations forums :
    Inscription : Août 2008
    Messages : 130
    Points : 53
    Points
    53
    Par défaut
    Merci beaucoup pour ton aide

  6. #6
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Voici un début qui te vire les commentaires très proprement et te récupère les variables define dans un hash.
    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
    #!/usr/bin/perl
    use warnings;
    use strict;
     
    use Regexp::Common qw /comment/;
     
    my $Code = <<"CODE";
    // banane
     
    #define banane 12
     
    typedef enum grosNland
    {
       igloo =
       -4,
       buse
       ,
       couture = banane
    };
     
    /*
    #define burne molle
     
    typedef enum
    {
       null = 0
    }
    // ccccc
    */
    #define burne 56 /*
    #define bouse quipue
    */
     
    typedef enum nouille
    {
       tortellini,
       tagliatelle,
    };
    CODE
     
    my %VariableDefine;
     
    # Supprimons les commentaires C
    my $RegexComment = $RE{comment}{'C'};
    $Code =~ s{$RegexComment}{}g;
     
    # Recupération des define
    my @define = $Code =~ m{^\#define\s*([^\n]+)\s*\n}mgix;
    foreach my $Define ( @define ) {
      my ($var, $value ) = split( /\s+/, $Define );
      $VariableDefine{$var} = $value;
      print "$var = $value\n";
    }
    Pour les blocs type, ex :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    typedef enum grosNland
    {
       igloo =
       -4,
       buse
       ,
       couture = banane
    };
    Dans ce cas, igloo = -4 ?
    couture = banane ?
    et buse ???
    , corresponds à quoi, ça fait un baille que j'ai plus fait de C, alors pas envie de chercher

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    130
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Doubs (Franche Comté)

    Informations forums :
    Inscription : Août 2008
    Messages : 130
    Points : 53
    Points
    53
    Par défaut
    Le but de mon appli est juste de récupérer les constantes et leurs valeurs (si il y en a) contenue dans l'énum en l'occurence igloo etc...

    Je vai étudier ton code Merci beaucoup en tout cas du coup de pouce c'est bien aimable

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    130
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Doubs (Franche Comté)

    Informations forums :
    Inscription : Août 2008
    Messages : 130
    Points : 53
    Points
    53
    Par défaut
    Hum... Je ne suis pas très bon en Perl et ne connaissant pas bien ce language, je me retrouve confronté au problème suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Can't locate Regexp/Common.pm in @INC (@INC contains: D:/Documents and Settings/*****/My Documents/Dev/Perl/.metadata/.plugins/org.epic.debug D:/Documents and Settings/*****/My Documents/Dev/Perl/training C:/Perl/site/lib C:/Perl/lib .) at D:/Documents and Settings/*****/My Documents/Dev/Perl/training/essai.pl line 5.
    BEGIN failed--compilation aborted at D:/Documents and Settings/*****/My Documents/Dev/Perl/training/essai.pl line 5.
    Je suis sur eclipse avec EPIC
    Je suis en train de chercher le plugin pour les Regexp car je crois que c'est ce qu'il me manque.

    Sinon pour mon soucis:

    igloo =
    -4

    Aurais tu une idée?

  9. #9
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Voici un code vite fait :
    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
     
    #!/usr/bin/perl
    use warnings;
    use strict;
     
    use Regexp::Common qw /comment/;
     
    my $Code = <<"CODE";
    // banane
     
    #define banane 12
     
    typedef enum grosNland
    {
       igloo =
       -4,
       buse
       ,
       couture = banane
    };
     
    /*
    #define burne molle
     
    typedef enum
    {
       null = 0
    }
    // ccccc
    */
    #define burne 56 /*
    #define bouse quipue
    */
     
    typedef enum nouille
    {
       tortellini,
       tagliatelle,
    };
    CODE
     
    my %VariableDefine;
     
    # Supprimons les commentaires C
    my $RegexComment = $RE{comment}{'C'};
    $Code =~ s{$RegexComment}{}g;
     
    # Recupération des define
    my @define = $Code =~ m{^\#define\s*([^\n]+)\s*\n}mgix;
    foreach my $Define (@define) {
        my ( $var, $value ) = split( /\s+/, $Define );
        $VariableDefine{$var} = $value;
    }
    undef @define;
    print "Voici mes variables define : \n";
    foreach my $var ( keys %VariableDefine ) {
        print "$var = $VariableDefine{$var}\n";
    }
    print "\n============\n";
     
    # Bloc typedef
    my @typedef = $Code =~ m/
      (?:
      ^\s*typedef[^{]+{ # Ligne typedef avec accolade
     
      ([^}]+)           # contenu
     
      };                # accolade fermante
      )
    /mgix;
     
    my $CodeTypedef = join( '', @typedef );
    $CodeTypedef =~ s{\n}{}g;
    my %Constante = $CodeTypedef =~ m{
      (\w+)\s*    # variable
      =
      \s*(\S+)\s*  # valeur (tout sauf un espace)
    }mxg;
     
    print "Voici mes constantes definies dans les typedef : \n";
    foreach my $var ( keys %Constante ) {
        $Constante{$var} =~ s{,}{}g;
        print "$var = $Constante{$var}\n";
    }
    résultat :

    Voici mes variables define :
    banane = 12
    burne = 56

    ============
    Voici mes constantes definies dans les typedef :
    couture = banane
    igloo = -4

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    130
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Doubs (Franche Comté)

    Informations forums :
    Inscription : Août 2008
    Messages : 130
    Points : 53
    Points
    53
    Par défaut
    Oui c'est bien cela

    Mais j'ai des soucis avec le use Regexp::Common je crois : /

  11. #11
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Citation Envoyé par Fabien25C Voir le message
    Oui c'est bien cela

    Mais j'ai des soucis avec le use Regexp::Common je crois : /
    Il faut que tu installes ce module Regexp::Common

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    130
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Doubs (Franche Comté)

    Informations forums :
    Inscription : Août 2008
    Messages : 130
    Points : 53
    Points
    53
    Par défaut
    ok merci je vai chercher ca

  13. #13
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    130
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Doubs (Franche Comté)

    Informations forums :
    Inscription : Août 2008
    Messages : 130
    Points : 53
    Points
    53
    Par défaut
    Voila c'est installé merci beaucoup
    Je vai étudier ton code maintenant

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    130
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Doubs (Franche Comté)

    Informations forums :
    Inscription : Août 2008
    Messages : 130
    Points : 53
    Points
    53
    Par défaut
    J'ai un ptit soucis

    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
     
    #!/usr/bin/perl
    use warnings;
    use strict;
     
    use Regexp::Common qw /comment/;
     
    #ouverture du fichier *.h en mode Lecture
    open FICHIER,"<josette.h" or die "Le fichier n'existe pas !";
    #ouverture du fichier *.txt en mode Ecriture
    open WRITER,"> decode2.txt" or die "Le fichier ne peut être édité !\n";
     
    my $ligne;
    my %VariableDefine;
     
    while ($ligne = <FICHIER>)
    {
       # Supprimons les commentaires C
       my $RegexComment = $RE{comment}{'C'};
       $ligne =~ s{$RegexComment}{}g;
     
       # Recupération des define
       my @define = $ligne =~ m{^\#define\s*([^\n]+)\s*\n}mgix;
       foreach my $Define (@define) 
       {
          my ( $var, $value ) = split( /\s+/, $Define );
          $VariableDefine{$var} = $value;
       }
     
       undef @define;
       print "Voici mes variables define : \n";
       foreach my $var ( keys %VariableDefine ) 
       {
          print "$var = $VariableDefine{$var}\n";
       }
     
       print "\n============\n";
     
       # Bloc typedef
       my @typedef = $ligne =~ m/
       (?:
       ^\s*typedef[^{]+{ # Ligne typedef avec accolade
     
       ([^}]+)           # contenu
     
       };                # accolade fermante
       )
       /mgix;
     
       my $CodeTypedef = join( '', @typedef );
       $CodeTypedef =~ s{\n}{}g;
       my %Constante = $CodeTypedef =~ m{
       (\w+)\s*    # variable
       =
       \s*(\S+)\s*  # valeur (tout sauf un espace)
       }mxg;
     
       print "Voici mes constantes definies dans les typedef : \n";
       foreach my $var ( keys %Constante ) 
       {
          $Constante{$var} =~ s{,}{}g;
          print "$var = $Constante{$var}\n";
       }
     
    }
     
    close(FICHIER);
    close(WRITER);
    J'ai "remanié" le code afin qu'il travaille avec les fichiers et le résultat n'est pas le même qu'avec le code du fichier d'en tête mis en dur (si jpuis dire) dans le script.

    Résultat:
    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
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    Voici mes variables define : 
     
    ============
    Voici mes constantes definies dans les typedef : 
    Voici mes variables define : 
     
    ============
    Voici mes constantes definies dans les typedef : 
    Voici mes variables define : 
    banane = 12
     
    ============
    Voici mes constantes definies dans les typedef : 
    Voici mes variables define : 
    banane = 12
     
    ============
    Voici mes constantes definies dans les typedef : 
    Voici mes variables define : 
    banane = 12
     
    ============
    Voici mes constantes definies dans les typedef : 
    Voici mes variables define : 
    banane = 12
     
    ============
    Voici mes constantes definies dans les typedef : 
    Voici mes variables define : 
    banane = 12
     
    ============
    Voici mes constantes definies dans les typedef : 
    Voici mes variables define : 
    banane = 12
     
    ============
    Voici mes constantes definies dans les typedef : 
    Voici mes variables define : 
    banane = 12
     
    ============
    Voici mes constantes definies dans les typedef : 
    Voici mes variables define : 
    banane = 12
     
    ============
    Voici mes constantes definies dans les typedef : 
    Voici mes variables define : 
    banane = 12
     
    ============
    Voici mes constantes definies dans les typedef : 
    Voici mes variables define : 
    banane = 12
     
    ============
    Voici mes constantes definies dans les typedef : 
    Voici mes variables define : 
    banane = 12
     
    ============
    Voici mes constantes definies dans les typedef : 
    Voici mes variables define : 
    banane = 12
     
    ============
    Voici mes constantes definies dans les typedef : 
    Voici mes variables define : 
    banane = 12
    burne = molle
     
    ============
    Voici mes constantes definies dans les typedef : 
    Voici mes variables define : 
    banane = 12
    burne = molle
     
    ============
    Voici mes constantes definies dans les typedef : 
    Voici mes variables define : 
    banane = 12
    burne = molle
     
    ============
    Voici mes constantes definies dans les typedef : 
    Voici mes variables define : 
    banane = 12
    burne = molle
     
    ============
    Voici mes constantes definies dans les typedef : 
    Voici mes variables define : 
    banane = 12
    burne = molle
     
    ============
    Voici mes constantes definies dans les typedef : 
    Voici mes variables define : 
    banane = 12
    burne = molle
     
    ============
    Voici mes constantes definies dans les typedef : 
    Voici mes variables define : 
    banane = 12
    burne = molle
     
    ============
    Voici mes constantes definies dans les typedef : 
    Voici mes variables define : 
    banane = 12
    burne = molle
     
    ============
    Voici mes constantes definies dans les typedef : 
    Voici mes variables define : 
    banane = 12
    burne = 56
     
    ============
    Voici mes constantes definies dans les typedef : 
    Voici mes variables define : 
    banane = 12
    bouse = quipue
    burne = 56
     
    ============
    Voici mes constantes definies dans les typedef : 
    Voici mes variables define : 
    banane = 12
    bouse = quipue
    burne = 56
     
    ============
    Voici mes constantes definies dans les typedef : 
    Voici mes variables define : 
    banane = 12
    bouse = quipue
    burne = 56
     
    ============
    Voici mes constantes definies dans les typedef : 
    Voici mes variables define : 
    banane = 12
    bouse = quipue
    burne = 56
     
    ============
    Voici mes constantes definies dans les typedef : 
    Voici mes variables define : 
    banane = 12
    bouse = quipue
    burne = 56
     
    ============
    Voici mes constantes definies dans les typedef : 
    Voici mes variables define : 
    banane = 12
    bouse = quipue
    burne = 56
     
    ============
    Voici mes constantes definies dans les typedef : 
    Voici mes variables define : 
    banane = 12
    bouse = quipue
    burne = 56
     
    ============
    Voici mes constantes definies dans les typedef : 
    Voici mes variables define : 
    banane = 12
    bouse = quipue
    burne = 56
     
    ============
    Voici mes constantes definies dans les typedef :
    J'ai du faire une connerie dans les boucles tiens :p je vai rejeter un oeil mais je vois pas trop où est le soucis (je suis mauvais )

  16. #16
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    C'est normal que ça ne fonctionne pas comme tu le souhaites.
    Comme j'avais du te le dire au tout premier post, ma logique consiste à englober tout le fichier dans une seule variable et non de le lire ligne à ligne.
    Ainsi, j'applique plus facilement mes regex sur le contenu entier du fichier.

    C'est exceptionnel, car il est très fortement recommandé de lire les fichiers lignes à lignes, mais dans ton cas, tu n'aura jamais de gros fichiers et parser des blocs de lignes n'est pas évident.

    Donc, pour modifier code, on va procéder proprement via un module

    Installe le module Perl6::Slurp et voici ton code refait. Le résultat sera écrit dans ton fichier decode2.txt

    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
    #!/usr/bin/perl
    use warnings;
    use strict;
     
    use Regexp::Common qw /comment/;
    use Perl6::Slurp;
     
    # On englobe notre fichier .h
    my $CodeFichierC = slurp "josette.h";
     
    #ouverture du fichier *.txt en mode Ecriture
    open WRITER, '>', "decode2.txt" or die "Le fichier ne peut être édité !\n";
     
    # Supprimons les commentaires C
    my $RegexComment = $RE{comment}{'C'};
    $CodeFichierC =~ s{$RegexComment}{}g;
     
    # Recupération des define
    my @define = $CodeFichierC =~ m{^\#define\s*([^\n]+)\s*\n}mgix;
    my %VariableDefine;
    foreach my $Define (@define) {
        my ( $var, $value ) = split( /\s+/, $Define );
        $VariableDefine{$var} = $value;
    }
     
    print WRITER "Voici mes variables define : \n";
    foreach my $var ( keys %VariableDefine ) {
        print WRITER "$var = $VariableDefine{$var}\n";
    }
     
    print WRITER "\n============\n";
     
    # Bloc typedef
    my @typedef = $CodeFichierC =~ m/
       (?:
       ^\s*typedef[^{]+{ # Ligne typedef avec accolade
     
       ([^}]+)           # contenu
     
       };                # accolade fermante
       )
       /mgix;
     
    my $CodeTypedef = join( '', @typedef );
    $CodeTypedef =~ s{\n}{}g;
    my %Constante = $CodeTypedef =~ m{
       (\w+)\s*    # variable
       =
       \s*(\S+)\s*  # valeur (tout sauf un espace)
       }mxg;
     
    print WRITER "Voici mes constantes definies dans les typedef : \n";
    foreach my $var ( keys %Constante ) {
        $Constante{$var} =~ s{,}{}g;
        print WRITER "$var = $Constante{$var}\n";
    }
     
    close(WRITER);

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    130
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Doubs (Franche Comté)

    Informations forums :
    Inscription : Août 2008
    Messages : 130
    Points : 53
    Points
    53
    Par défaut
    Vraiment super ces modules!
    Merci beaucoup à toi.

    Dernière étape ca serait que la valeur de mon define serait remplacée dans le fichier texte:

    car j'ai:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #define banane 12
     
    #Et dans l'enum j'ai une utilisation de banane
     
    typedef enum grosNland
    {
    couture = banane
    };
    Je voudrais que ce soit la valeur de banane et non son libellé. Est ce possible? (désolé je cherche à côté mais je trouve pas grand chose qui m'aide )

    Merci en tout cas déja pour tout ca

  18. #18
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Là tu abuses, tu pourrais faire un effort de chercher. Tout est dans le code.
    J'ai fais exprès d'utiliser des hash pour que tu puisses les manipuler .

    A la place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print WRITER "$var = $Constante{$var}\n";
    Tu peux mettre ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        if ( exists $VariableDefine{ $Constante{$var} } ) {
          print WRITER "$var = $VariableDefine{$Constante{$var}} <===($Constante{$var})\n";
        }
        else {
          print WRITER "$var = $Constante{$var}\n";
        }

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    130
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Doubs (Franche Comté)

    Informations forums :
    Inscription : Août 2008
    Messages : 130
    Points : 53
    Points
    53
    Par défaut
    ouais tu as raison excuse moi, c'est la fin de journée je suis mort :p

    Par contre j'ai testé tout ça sur un autre fichier d'en tête avec plein de #define etc... plein de typedef enum etc... et il marche pas bien.
    Il me reconnait un seul #define (alors qu'il doit bien y en avoir 40)

  20. #20
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Peux tu mettre un exemple de fichier

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Analyseur des fichiers web
    Par roy2work dans le forum Langage
    Réponses: 2
    Dernier message: 28/11/2013, 23h59
  2. Analyseur de Fichier (contenant du VBA)
    Par Smoki28 dans le forum Général VBA
    Réponses: 0
    Dernier message: 22/07/2013, 16h15
  3. Editeur et analyseur de fichiers JAVA "mise à jour"
    Par timboy11 dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 10/04/2008, 13h57
  4. [MySQL] probleme d'analyseur de fichier .log
    Par SUBARUu dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 08/01/2008, 11h17
  5. analyseur fichier .log
    Par shintoisme dans le forum Windows Serveur
    Réponses: 1
    Dernier message: 21/06/2006, 21h27

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