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:
La il n'y a pas de soucis mon fichier Txt contient bien la constante et sa valeur (ainsi que le '-').
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 typedef enum test { test = -4, truc };
Mon problème arrive lorsque l'on a ceci dans le fichier.h
A partir de la ca ne fonctionne plus et je ne trouve pas de solution.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 typedef enum test { test = -4, truc };
Voici mes sources:
(Attention les constantes etc... ont des noms bidon :p )
Fichier Perl:
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
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);
Second "Problème":
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, };
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
Partager