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. #21
    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
    Niveau structure mon fichier est composé comme suit:

    Un gros tas de commentaire pour "l'entete du fichier":

    /***********************************************

    Blablablablablablabla

    ***********************************************/

    les define sont indentés de la facon suivante:

    #define TRUCMACHIN 128
    #define MACHIN 256
    #define CHOSE 255

    Il y a quelques #include mais qu'on ne prend pas pour le fichier donc on s'en fout :p il y a des "extern" on s'en fout aussi :p

    les typedef enum sont indentés de la sorte:
    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
     
    typedef enum
      {
        /*  blablabla */
     
        BLABLABLABLABLABLA = BLABLABLA                       /* G1 */
        BLABLABLA,                                                       /* G2  */
        .......                                                               /* G22 */
     
       /*BLABLABLA*/
        BLABLA = BLALA,                                                /* A1  */
        BLABLA                                                             /*A2 */
        .....                                                                 /*A15*/
     
        BLABLA         = BLABLA,                                      /* I1  */
     
        BLABLA         =  TOP_CAD_INTERNAL_COMMAND,    /* P2  */
        BLABLA         =  BLABLA,                                    /* P1  */
    }
    BLABLA;
    Déja tout à l'heure on avait un typedef du type "typedef enum GrosNland{};"
    Maintenant le typedef est de type "typedef enum {} GrosNland;"

  2. #22
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 818
    Points : 499 183
    Points
    499 183
    Par défaut
    Voilà,
    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
    #!/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{
      ^\s*            # La ligne commence par un espace ou non
      \#define        # suivi de #define
      \s*             # espace ou non
      ([^\n]+)\s*     # contenu define
      \n              # se termine par un retour chariot
    }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;
        if ( exists $VariableDefine{ $Constante{$var} } ) {
          print WRITER "$var = $VariableDefine{$Constante{$var}} <===($Constante{$var})\n";
        }
        else {
          print WRITER "$var = $Constante{$var}\n";
        }
    }
     
    close(WRITER);
    As toi de l'adapter à tes besoins, à regarder les expressions régulière.

    Le plus gros est déjà fait.

  3. #23
    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 mais en fait le post à "bugé" :p
    Les valeures de mes Define sont alignée en colonne donc le nombre d'espace peut varier (je cherche la , c'était juste une rectification )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #define TRUCMACHIN 128
    #define MACHIN        256
    #define CHOSE          255

    EDIT: Je ne comprend pas une partie de ton script pour le define:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ([^\n]+)\s*     # contenu define
    Si j'ai bien compris le ^ signifie que le contenu du define doit commencer par et au moins 1 retour à la ligne ?

  4. #24
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 818
    Points : 499 183
    Points
    499 183
    Par défaut
    Ce serait bien d'avoir un fichier .h propre
    car un coup les accolade fermante sont du type };, un coup, il y a pas de point virgule.
    Je ne maitrise pas tous les rouages et écritures du C.

    Donc pour l'instant, voici mon script final.

    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
    #!/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{
      ^\s*            # La ligne commence par un espace ou non
      \#define        # suivi de #define
      \s*             # 0 ou plusieurs espaces
      ([^\n]+)        # tout sauf un retour chariot
      \s*             # 0 ou plusieurs espaces
      \n              # se termine par un retour chariot
    }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 tout sauf accolade fermante
     
       }                # 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)
       }mxig;
     
    print WRITER "Voici mes constantes definies dans les typedef : \n";
    foreach my $var ( keys %Constante ) {
        $Constante{$var} =~ s{,}{}g;
        if ( exists $VariableDefine{ $Constante{$var} } ) {
          print WRITER "$var = $VariableDefine{$Constante{$var}} <===($Constante{$var})\n";
        }
        else {
          print WRITER "$var = $Constante{$var}\n";
        }
    }
     
    close(WRITER);

  5. #25
    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 excuse moi, le fichier josette.h était juste pour tester mon script.
    Je vai étudier tout ca à tête reposée demain matin.
    Je te remercie pour ton aide Djibril!

    Passe une bonne soirée

  6. #26
    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
    Bonjour,

    Pardon pour cette absence je reste bloqué sur un nouveau problème

    Ca n'a pas l'air compliqué, mais je suis pas encore totalement à l'aise avec le Perl ce qui m'empêche donc d'avancer.

    Je voudrais que ce script récupère le nom des enum (pour pouvoir ranger les constantes correspondantes à chaque enum), puis dans chaque enum, la première constante possède une valeur qui doit être incrémentée pour chaque autre valeur de l'enum.

    Mais je ne comprend pas très bien comment je peux réussir à faire

    Pourrais-je avoir un dernier coup de pouce?

  7. #27
    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
    Arf pas possible d'avoir un dernier coup de pouce?

    Ou alors juste avoir quelques éclaircissements sur le script donné précédemment?


  8. #28
    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

  9. #29
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 818
    Points : 499 183
    Points
    499 183
    Par défaut
    La réponse est ici, cherche un peu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # Bloc typedef
    my @typedef = $CodeFichierC =~ m/
       (?:
       ^\s*typedef[^{]+{ # Ligne typedef avec accolade
     
       ([^}]+)           # contenu tout sauf accolade fermante
     
       }                # accolade fermante
       )
       /mgix;

  10. #30
    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 fait différents essais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    # Bloc typedef
    my @typedef = $CodeFichierC =~ m/
       (?:
       ^\s*typedef[^{]+{ # Ligne typedef avec accolade
     
       ([^}]+)           # contenu tout sauf accolade fermante
     
       }[\w+];                # accolade fermante puis recupère au moins un alphanumérique pour le nom mais ne fonctionne pas
       )
       /mgix;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    # Bloc typedef
    my @typedef = $CodeFichierC =~ m/
       (?:
       enum[^{]+{ # Ligne typedef avec accolade
     
       ([^}]+)           # contenu tout sauf accolade fermante
     
       ([\w+]);                # pour qu'il s'arrete au ";" 
       )
       /mgix;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    # Bloc typedef
    my @typedef = $CodeFichierC =~ m/
       (?:
       enum[^{]+{ # Ligne typedef avec accolade
     
       ([^}]+)           # contenu tout sauf accolade fermante
     
       ([\w+]);                # pour qu'il s'arrete au ";" 
       )
       /mgix;
    Je ne vois pas quoi faire d'autre je suis assez mauvais en Perl

    EDIT:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    # Bloc typedef
    my @typedef = $CodeFichierC =~ m/
       (?:
       enum[^{]+{ # Ligne typedef avec accolade
     
       ([^;]+)           # contenu tout sauf ";" mais ne récupère pas le nom des enum
     
     
       )
       /mgix;

  11. #31
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 818
    Points : 499 183
    Points
    499 183
    Par défaut
    D'après toi ce code sert à quoi ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # Bloc typedef
    my @typedef = $CodeFichierC =~ m/
       (?:
       ^\s*typedef[^{]+{ # Ligne typedef avec accolade
     
       ([^}]+)           # contenu tout sauf accolade fermante
     
       }                # accolade fermante
       )
       /mgix;
    Qu'as tu compris ? Car ça n'a aucun intérêt de t'aider en te donnant des bouts de codes si tu ne comprends pas, car, ça ne t'aidera pas à les modifier si besoin.

  12. #32
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    my @typedef = $CodeFichierC =~ m/
       (?:
       enum[^{]+{        # Ligne typedef avec accolade
       ([\w+]=*}\w+)
       ([;]+)           # contenu tout sauf accolade fermante
     
                 # accolade fermante   
       )
       /mgix;
    J'ai également essayé ca: Il trouve l'énum ensuite l'accolade ouvrante, un alphanumérique pour le nom de la constante, 0 ou 1 egal en cas d'affectation de valeur une accolade fermante un autre alphanumérique pour le nom de l'enum pui le ";" mais ca ne fonctionne toujours pas

  13. #33
    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
    oups je viens de voir le message que tu as laissé :p

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    # Bloc typedef
    my @typedef = $CodeFichierC =~ m/ #On cherche dans le tableau tout les trucs suivants
       (?: #ca je ne sais pas à quoi ca correspond
       ^\s*typedef[^{]+{ # Donc la on recherche le typedef avec une accolade ouvrante
     
       ([^}]+)           # La on "englobe" tout ce que contient l'enum jusqu'a ce qu'on rencontre une accolade fermante
     
       }                # accolade fermante
       )
       /mgix; #=> ca je ne sais pas à quoi cela correspond

  14. #34
    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
    Je suis loin de la vérité?

  15. #35
    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
    Salut!
    J'ai refais un essai mais ca ne fonctionne pas comme je voudrais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    my $valeur_enum;
    foreach my $test($CodeFichierC) #$CodeFichierC contient le fichier...(par slurp)
    {
    	if($test =~ m/[\w]\s=\s([\w])/)
    	{
    	   $valeur_enum = ($test =~ m/[\w]\s=\s(([\w+]+)),/);	
    	}
    }
    J'essaie de récupérer chaque valeure donnée aux constantes des enums exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    enum
    {
       constante1 = valeur1,
       constante2
    }
    nom_Enum;
    chaque enum est composée de constantes dont la première est intialisée et que je dois incrémenter.

    Mon soucis est que la il incrément bien, mais pas comme je veux ( ).
    Il incrémente la valeur sans s'occuper des enum en fait c'est pas facile à expliquer :p

    exemple:
    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
     
    [...]
    CURRENCY_KRW =1
    RESET_HOST =2
    EVENT_CARD_SCANNED =3
    0x00 =4
    CURRENCY_COP =5
    RFU1_HOST_COMMAND =6
    SET_REJECT_TIMEOUT =7
    COMMAND_BAD_PARAMETER =8
    GET_CARD_INFO_GEN = 254 <===(TOP_CAD_PRIVATE_COMMAND)
    MSIO_PORT_ERROR =9
    CURRENCY_XEU =10
    CARD_REMOVED =11
    COMMISIONNING_CARD =12
    [...]
    Le soucis est que les constantes incrémentées ne sont pas toute de la même enum et je trouve pas comment trier chaque constante avec l'enum qui leurs correspondent afin ensuite de récupérer la première valeure initialisée et l'incrémenter.

    J'explique mal je crois... désolé

  16. #36
    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
    Bon bah vous pouvez fermer la discussion
    Merci beaucoup pour votre aide je vai essayer de me démerder pour la suite...

  17. #37
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 818
    Points : 499 183
    Points
    499 183
    Par défaut
    Les gens répondent quand ils ont le temps ou la solution, ce n'est pas une obligation.
    De plus, ton post commence à être long, donc il est difficile aux personnes qui voudraient t'aider de s'immiscer dans ton souci.

    Je t'avais déjà aider à faire le plus difficile, alors, mets ce thread en résolu et ouvre en un nouveau avec une explication clair de ton problème suivi du code complet qui est actuellement à ta disposition avec les modifs que j'y avait apporté.

    Et en titre, ce serait bien de préciser Analyse ou Parsing de fichiers C, par exemple.

    Voilà

  18. #38
    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 pour le conseil, c'était pas un reproche du tout hein...

  19. #39
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 818
    Points : 499 183
    Points
    499 183
    Par défaut
    Bon Voici le script remis à jour.

    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
    #!/usr/bin/perl
    # But : Parsing d'un fichier de type C
    use warnings;
    use strict;
     
    use Regexp::Common qw /comment/;
    use Perl6::Slurp;
     
    # Englobe le fichier .h
    my $CodeFichierC = slurp "pub_serv.h";
     
    #ouverture du fichier *.txt en mode Ecriture
    open WRITER, '>', "decode2.txt" or die "Le fichier ne peut être édité !\n";
     
    # Suppression des commentaires C
    my $RegexComment = $RE{comment}{'C++'};    #C++ pour supprimer /* */ ET //
    $CodeFichierC =~ s{$RegexComment}{}g;
     
    # Recupère tous les define du fichier
    my @define = $CodeFichierC =~ m{
      ^\s*            # La ligne commence par un espace ou non
      \#define        # suivi de #define
      \s*             # espace ou non
      ([^\n]+)\s*     # contenu define
      \n              # se termine par un retour chariot
    }mgix;
     
    # Dans le hash, la cle sera le nom d'un define et la valeur celle du define.
    my %VariableDefine;
    foreach my $Define (@define) {
        my ( $var, $value ) = split( /\s+/, $Define );
        $VariableDefine{$var} = $value || '';
    }
     
    print WRITER "Defines: \n\n";
     
    foreach my $var ( keys %VariableDefine ) {
        print WRITER "$var = $VariableDefine{$var}\n";
    }
     
    print WRITER "\n============\n\n";
     
    # Recupère tous les bloc enum avec le nom de l'enum (le tout dans @typedef)
    # Si le bloc ne match pas avec la regex, il ne sera pas dans @BlocEnum
    my @BlocEnum = $CodeFichierC =~ m/
       (
        enum[^{]+{ # Ligne enum suivi de tous sauf une accolade + accolade
        [^}]+			 # contenu tout sauf accolade fermante
        }	         # accolade fermante         
        [^;]+;     # suivi du nom de l'enum plus virgule
       )
       /mgix;
     
    # On va maintenant traiter chaque bloc enum
    my %EnumData;
    foreach my $DonneeEnum (@BlocEnum) {
        my ( $ContenuBloc, $NomEnum ) = $DonneeEnum =~ m/
        {
        ([^}]+)			 # contenu du bloc (tout sauf accolade)
        }
        ([^;]+);$    # Nom enum
     
      /mgix;
     
        # On enleve les retour chariot et espace
        $NomEnum     =~ s{[\n\s]}{}g;
        $ContenuBloc =~ s{[\n\s]}{}g;
     
        # Recupération des constances dans $ContenuBloc
        my %Constante;
        foreach my $Enumerateur ( split( ',', $ContenuBloc, -1 ) ) {
            my ( $Nomvariable, $Valeur ) = split( '=', $Enumerateur, -1 );
            $Constante{$Nomvariable} = $Valeur || 0;
        }
     
        # A chaque enum, on associ un hash contenant ces constance
        $EnumData{$NomEnum} = \%Constante;
    }
     
    # Affichage des enum avec cnostances
    print WRITER "Constantes definies dans les typedef: \n\n";
    while ( my ( $Enum, $RefConstances ) = each %EnumData ) {
        print WRITER "$Enum\n";
        while ( my ( $constante, $valeur ) = each %{$RefConstances} ) {
            print WRITER "\t- $constante = $valeur \n";
        }
    }
     
    close(WRITER);
    Pour un fichier de type :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    typedef enum
      {
        NO_CARD = 1    ,
        CARD_INSERTED  ,
        CARD_REMOVED   ,
        CARD_DETECTED  ,
        CARD_JAM       ,
        CARD_SCANNED
      }
      CARD_STATUS;
     
    #define TOP_CAD_PRIVATE_COMMAND   254
    #define MAX_COMMAND_NUM           255

    tu as ceci en sorti :
    Defines:

    MAX_COMMAND_NUM = 255
    TOP_CAD_PRIVATE_COMMAND = 254

    ============

    Constantes definies dans les typedef:

    CARD_STATUS
    - CARD_DETECTED = 0
    - CARD_REMOVED = 0
    - CARD_SCANNED = 0
    - CARD_INSERTED = 0
    - CARD_JAM = 0
    - NO_CARD = 1
    Essaye de comprendre le script, si tu as besoin d'explication, n'hésite pas.
    NB: La regex pour récupérer les blocs enum considère que le nom de l'enum est après l'accolade fermante, comme dans ton exemple, s'il ne le trouve pas, il ne récupérera pas le bloc.

    Voilà

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Analyseur des fichiers web
    Par roy2work dans le forum Langage
    Réponses: 2
    Dernier message: 29/11/2013, 00h59
  2. Analyseur de Fichier (contenant du VBA)
    Par Smoki28 dans le forum Général VBA
    Réponses: 0
    Dernier message: 22/07/2013, 17h15
  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, 14h57
  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, 12h17
  5. analyseur fichier .log
    Par shintoisme dans le forum Windows Serveur
    Réponses: 1
    Dernier message: 21/06/2006, 22h27

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