1 # CONFIGURATION MANAGEMENT OF EDF VERSION
2 # ======================================================================
3 # COPYRIGHT (C) 1991 - 2002 EDF R&D WWW.CODE-ASTER.ORG
4 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
5 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
6 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
7 # (AT YOUR OPTION) ANY LATER VERSION.
9 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
10 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
11 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
12 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.
14 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
15 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
16 # 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
19 # ======================================================================
20 from string import split,strip,lowercase,uppercase
21 import re,string,cPickle,os
23 from Noyau.N_CR import CR
26 __Id__="$Id: analyse_catalogue.py,v 1.1.1.1 2002/03/26 09:08:45 eficas Exp $"
27 __version__="$Name: $"
29 l_noms_commandes = ['OPER','PROC','MACRO','FORM']
30 l_noms_composes=['FACT','BLOC','NUPL','FORM']
31 l_noms_simples=['SIMP',]
32 l_noms=l_noms_composes+l_noms_simples
34 def elimine_commentaires(text):
35 """ Elimine les lignes de commentaires dans text
36 Attention : supprime sauvagement tous les caractères entre # et le retour chariot ..."""
37 comments = re.compile(r'#[^\n]*')
38 return comments.sub('',text)
40 def cherche_nom(text):
41 Whitespace = r'[ \f\t]*'
42 Name = r'[a-zA-Z_]\w*'
43 myexpr = '('+Name+')'+Whitespace+'='+Whitespace+'$'
44 a=re.search(myexpr,text)
47 def cherche_args(text):
54 for i in range(1,longueur) :
64 return 'erreur !','erreur !'
67 return text[1:i],text[i+1:] # on enlève les première et dernière parenthèses
72 def cherche_enfants(self):
74 self.text = strip(self.text)
75 liste = re.split('=',self.text,1)
80 if reste[0:4] in l_noms :
81 nom_mc = cherche_nom(arg1+'=')
82 arg_mc, self.text = cherche_args(reste[4:])
83 self.cree_mc(nom_mc,arg_mc,reste[0:4])
86 self.cherche_enfants()
91 self.cr.fatal("Erreur rencontrée dans recherche_enfants :%s" %str(e))
93 def cree_mc(self,nom_mc,arg_mc,test):
94 if test in l_noms_composes :
95 mc = FACT_CATA(nom_mc,arg_mc,self)
96 self.children.append(mc)
97 elif test in l_noms_simples :
98 mc = SIMP_CATA(nom_mc,self)
99 self.children.append(mc)
101 print 'erreur dans la création du mot-clé :',nom_mc
103 def construit_liste_dico(self):
106 if len(self.children)==0:
111 for child in self.children:
117 print 'erreur :',self.nom,self.__class__
119 class COMMANDE_CATA(ENTITE) :
120 def __init__(self,nom,args,parent):
126 self.cr.debut = "Début commande %s" %self.nom
127 self.cr.fin = "Fin commande %s" %self.nom
128 self.cherche_enfants()
129 self.construit_liste_dico()
130 parent.cr.add(self.cr)
134 texte_cmd = texte_cmd + 'Commande :' + self.nom + '\n'
135 for child in self.children :
136 texte_cmd = texte_cmd + child.affiche(1)
140 def __init__(self,nom,parent):
143 self.cr.debut = "Début mot-clé simple %s" %self.nom
144 self.cr.fin = "Fin mot-clé simple %s" %self.nom
145 parent.cr.add(self.cr)
147 def affiche(self,ind):
149 return sep*ind+self.nom+'\n'
151 class FACT_CATA(ENTITE) :
152 def __init__(self,nom,args,parent):
158 self.cr.debut = "Début mot-clé facteur ou bloc %s" %self.nom
159 self.cr.fin = "Fin mot-clé facteur ou bloc %s" %self.nom
160 self.cherche_enfants()
161 self.construit_liste_dico()
162 parent.cr.add(self.cr)
164 def affiche(self,ind):
167 text = text + sep*ind+self.nom+'\n'
168 for child in self.children :
169 text = text + child.affiche(ind+1)
172 class CATALOGUE_CATA:
173 def __init__(self,parent,fichier):
177 self.cr.debut = "Début compte-rendu catalogue %s" %self.fichier
178 self.cr.fin = "Fin compte-rendu catalogue %s" %self.fichier
179 self.ouvrir_fichier()
180 self.liste_commandes=[]
181 self.liste_textes_commandes=[]
183 def ouvrir_fichier(self):
185 f=open(self.fichier,'r')
186 self.texte_complet=f.read()
189 print "Impossible d'ouvrir le fichier :",self.fichier
191 self.cr.fatal("Impossible d'ouvrir le fichier :%s" %self.fichier)
193 def constr_list_txt_cmd(self,text):
194 text = elimine_commentaires(text)
196 liste=re.split(pattern,text)
197 for i in range(0,len(liste)-1):
198 self.liste_textes_commandes.append(liste[i]+')')
200 def analyse_commande_old(self,text):
201 #if strip(text) == '' or strip(text) ==')': return
202 liste = re.split('OPER *\(',text,1)
204 liste = re.split('PROC *\(',text,1)
206 liste = re.split('MACRO *\(',text,1)
208 print "le texte à analyser n'est pas celui d'une commande ou d'un opérateur",text
209 self.cr.fatal("le texte à analyser n'est pas celui d'une commande ou d'un opérateur :%s" %text)
213 nom_cmd = cherche_nom(debut)
214 if nom_cmd == 'erreur !':
215 print "Erreur dans la recherche du nom de la commande :",debut
216 args_cmd,toto = cherche_args('('+fin)
217 if args_cmd == 'erreur !':
218 print "Erreur dans la recherche des args de la commande :",debut
219 cmd=COMMANDE_CATA(nom_cmd,args_cmd,self)
220 self.liste_commandes.append(cmd)
222 def analyse_commande(self,text):
223 #if strip(text) == '' or strip(text) ==')': return
224 for nom_cmd in l_noms_commandes:
225 liste = re.split(nom_cmd+' *\(',text,1)
226 if len(liste) == 2 : break
228 print "le texte à analyser n'est pas celui d'une commande connue :"+str(l_noms_commandes),text
229 self.cr.fatal("le texte à analyser n'est pas celui d'une commande ou d'un opérateur :%s" %text)
233 nom_cmd = cherche_nom(debut)
234 if nom_cmd == 'erreur !':
235 print "Erreur dans la recherche du nom de la commande :",debut
236 args_cmd,toto = cherche_args('('+fin)
237 if args_cmd == 'erreur !':
238 print "Erreur dans la recherche des args de la commande :",debut
240 cmd=COMMANDE_CATA(nom_cmd,args_cmd,self)
241 self.liste_commandes.append(cmd)
243 def analyse_texte(self,texte):
244 self.constr_list_txt_cmd(texte)
246 self.parent.configure_barre(len(self.liste_textes_commandes))
249 for texte_commande in self.liste_textes_commandes :
251 self.parent.update_barre()
254 self.analyse_commande(texte_commande)
255 self.construit_liste_dico()
257 def ecrit_lcmd(self):
258 f=open('U:\\EFICAS\\Accas\\cata.txt','w')
259 for cmd in self.liste_commandes :
260 f.write(cmd.affiche())
263 def construit_liste_dico(self):
266 for cmd in self.liste_commandes:
273 """ retourne l'objet rapport du catalogue de commande """
276 def analyse_catalogue(parent,nom_cata):
277 cata = CATALOGUE_CATA(parent,nom_cata)
278 cata.analyse_texte(cata.texte_complet)
281 def analyse_catalogue_commande(parent,nom_cata):
282 cata = CATALOGUE_CATA(parent,nom_cata)
283 cata.analyse_commande(cata.texte_complet)
284 cata.construit_liste_dico()
288 def make_cata_pickle(fic_cata):
290 Lance l'analyse de l'ordre des mots-clés dans le catalogue dont le nom
291 est passé en argument et sauvegarde ces infos dans le fichier pickle relu
294 fic_cata_p = os.path.splitext(fic_cata)[0]+'_pickled.py'
295 cata_ordonne = analyse_catalogue(None,fic_cata)
296 f = open(fic_cata_p,'w+')
297 p = cPickle.Pickler(f)
298 p.dump(cata_ordonne.dico)
301 if __name__ == "__main__" :
303 profile.run("analyse_catalogue(None,'U:\\EFICAS\\Cata\\cata_saturne.py')")