Salut à tous!

Je suis débutant en Perl et je dois dévelloper un parser de fichiers d'entête en C:
Ce parser devra extraire les constantes d'énumérations déclarées dans des fichiers *.h

exemple:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
typedef enum
{
   constante1 = valeur1,
   constante2
}
Nom_enum;
Pour le moment, j'arrive à extraire ces noms de constante.
Mais le but maintenant est de pouvoir extraire le Nom_enum afin de pouvoir trier (car le fichier d'en tête est rempli d'enum et de constantes :p ) puis enfin incrémenter la valeur1.
Voici mon code (merci à Djibril pour l'aide):

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
 
#!/usr/bin/perl
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 les 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 "Defines: \n\n";
 
foreach my $var ( keys %VariableDefine ) 
{
   print WRITER "$var = $VariableDefine{$var}\n";
}
 
print WRITER "\n============\n\n";
 
#  Bloc typedef
my @typedef = $CodeFichierC =~ m/
   (?:
   enum[^{]+{        # 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
   =*          # Egual ou non
   \s*(\S+)\s*  # valeur (tout sauf un espace)
   }mxig;
 
my $valeur_enum;
my $nom_enum;
 
foreach my $test($CodeFichierC)
{
 
	if($test=~ m/(\s*enum\n{)(.*)(})([\w]+);/)#essais pour choper le nom de l'énum mais ne fonctionne pas
	{
 
	   $nom_enum = ($test =~ m/(\s*enum\n{)(.*)(})([\w]+);/);	
	   print WRITER "\n===\n";
           print WRITER "$4\n";
           print WRITER "\n===\n";
	}
}
 
print WRITER "Constantes definies dans les typedef: \n\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 =";
      print WRITER $valeur_enum++;
      print WRITER "\n"; 
   }
}
 
 
close(WRITER);
Si quelqu'un à des conseils à me donner, je suis preneur

Merci d'avance