1 #@ MODIF analyse_catalogue Accas DATE 02/07/2001 AUTEUR D6BHHJP J.P.LEFEBVRE
2 # CONFIGURATION MANAGEMENT OF EDF VERSION
3 # ======================================================================
4 # COPYRIGHT (C) 1991 - 2001 EDF R&D WWW.CODE-ASTER.ORG
5 # SEE THE FILE "LICENSE.TERMS" FOR INFORMATION ON USAGE AND
6 # REDISTRIBUTION OF THIS FILE.
7 # ======================================================================
8 from string import split,strip,lowercase,uppercase
9 import re,string,cPickle,os
11 from Noyau.N_CR import CR
14 __Id__="$Id: analyse_catalogue.py,v 1.13.18.3 2001/06/19 12:24:48 iliade Exp $"
15 __version__="$Name: FR_28_06_10_00 $"
17 l_noms_commandes = ['OPER','PROC','MACRO','FORM']
18 l_noms_composes=['FACT','BLOC','NUPL','FORM']
19 l_noms_simples=['SIMP',]
20 l_noms=l_noms_composes+l_noms_simples
22 def elimine_commentaires(text):
23 """ Elimine les lignes de commentaires dans text
24 Attention : supprime sauvagement tous les caractères entre # et le retour chariot ..."""
25 comments = re.compile(r'#[^\n]*')
26 return comments.sub('',text)
28 def cherche_nom(text):
29 Whitespace = r'[ \f\t]*'
30 Name = r'[a-zA-Z_]\w*'
31 myexpr = '('+Name+')'+Whitespace+'='+Whitespace+'$'
32 a=re.search(myexpr,text)
35 def cherche_args(text):
42 for i in range(1,longueur) :
52 return 'erreur !','erreur !'
55 return text[1:i],text[i+1:] # on enlève les première et dernière parenthèses
60 def cherche_enfants(self):
62 self.text = strip(self.text)
63 liste = re.split('=',self.text,1)
68 if reste[0:4] in l_noms :
69 nom_mc = cherche_nom(arg1+'=')
70 arg_mc, self.text = cherche_args(reste[4:])
71 self.cree_mc(nom_mc,arg_mc,reste[0:4])
74 self.cherche_enfants()
79 self.cr.fatal("Erreur rencontrée dans recherche_enfants :%s" %str(e))
81 def cree_mc(self,nom_mc,arg_mc,test):
82 if test in l_noms_composes :
83 mc = FACT_CATA(nom_mc,arg_mc,self)
84 self.children.append(mc)
85 elif test in l_noms_simples :
86 mc = SIMP_CATA(nom_mc,self)
87 self.children.append(mc)
89 print 'erreur dans la création du mot-clé :',nom_mc
91 def construit_liste_dico(self):
94 if len(self.children)==0:
99 for child in self.children:
105 print 'erreur :',self.nom,self.__class__
107 class COMMANDE_CATA(ENTITE) :
108 def __init__(self,nom,args,parent):
114 self.cr.debut = "Début commande %s" %self.nom
115 self.cr.fin = "Fin commande %s" %self.nom
116 self.cherche_enfants()
117 self.construit_liste_dico()
118 parent.cr.add(self.cr)
122 texte_cmd = texte_cmd + 'Commande :' + self.nom + '\n'
123 for child in self.children :
124 texte_cmd = texte_cmd + child.affiche(1)
128 def __init__(self,nom,parent):
131 self.cr.debut = "Début mot-clé simple %s" %self.nom
132 self.cr.fin = "Fin mot-clé simple %s" %self.nom
133 parent.cr.add(self.cr)
135 def affiche(self,ind):
137 return sep*ind+self.nom+'\n'
139 class FACT_CATA(ENTITE) :
140 def __init__(self,nom,args,parent):
146 self.cr.debut = "Début mot-clé facteur ou bloc %s" %self.nom
147 self.cr.fin = "Fin mot-clé facteur ou bloc %s" %self.nom
148 self.cherche_enfants()
149 self.construit_liste_dico()
150 parent.cr.add(self.cr)
152 def affiche(self,ind):
155 text = text + sep*ind+self.nom+'\n'
156 for child in self.children :
157 text = text + child.affiche(ind+1)
160 class CATALOGUE_CATA:
161 def __init__(self,parent,fichier):
165 self.cr.debut = "Début compte-rendu catalogue %s" %self.fichier
166 self.cr.fin = "Fin compte-rendu catalogue %s" %self.fichier
167 self.ouvrir_fichier()
168 self.liste_commandes=[]
169 self.liste_textes_commandes=[]
171 def ouvrir_fichier(self):
173 f=open(self.fichier,'r')
174 self.texte_complet=f.read()
177 print "Impossible d'ouvrir le fichier :",self.fichier
179 self.cr.fatal("Impossible d'ouvrir le fichier :%s" %self.fichier)
181 def constr_list_txt_cmd(self,text):
182 text = elimine_commentaires(text)
184 liste=re.split(pattern,text)
185 for i in range(0,len(liste)-1):
186 self.liste_textes_commandes.append(liste[i]+')')
188 def analyse_commande_old(self,text):
189 #if strip(text) == '' or strip(text) ==')': return
190 liste = re.split('OPER *\(',text,1)
192 liste = re.split('PROC *\(',text,1)
194 liste = re.split('MACRO *\(',text,1)
196 print "le texte à analyser n'est pas celui d'une commande ou d'un opérateur",text
197 self.cr.fatal("le texte à analyser n'est pas celui d'une commande ou d'un opérateur :%s" %text)
201 nom_cmd = cherche_nom(debut)
202 if nom_cmd == 'erreur !':
203 print "Erreur dans la recherche du nom de la commande :",debut
204 args_cmd,toto = cherche_args('('+fin)
205 if args_cmd == 'erreur !':
206 print "Erreur dans la recherche des args de la commande :",debut
207 cmd=COMMANDE_CATA(nom_cmd,args_cmd,self)
208 self.liste_commandes.append(cmd)
210 def analyse_commande(self,text):
211 #if strip(text) == '' or strip(text) ==')': return
212 for nom_cmd in l_noms_commandes:
213 liste = re.split(nom_cmd+' *\(',text,1)
214 if len(liste) == 2 : break
216 print "le texte à analyser n'est pas celui d'une commande connue :"+str(l_noms_commandes),text
217 self.cr.fatal("le texte à analyser n'est pas celui d'une commande ou d'un opérateur :%s" %text)
221 nom_cmd = cherche_nom(debut)
222 if nom_cmd == 'erreur !':
223 print "Erreur dans la recherche du nom de la commande :",debut
224 args_cmd,toto = cherche_args('('+fin)
225 if args_cmd == 'erreur !':
226 print "Erreur dans la recherche des args de la commande :",debut
228 cmd=COMMANDE_CATA(nom_cmd,args_cmd,self)
229 self.liste_commandes.append(cmd)
231 def analyse_texte(self,texte):
232 self.constr_list_txt_cmd(texte)
234 self.parent.configure_barre(len(self.liste_textes_commandes))
237 for texte_commande in self.liste_textes_commandes :
239 self.parent.update_barre()
242 self.analyse_commande(texte_commande)
243 self.construit_liste_dico()
245 def ecrit_lcmd(self):
246 f=open('U:\\EFICAS\\Accas\\cata.txt','w')
247 for cmd in self.liste_commandes :
248 f.write(cmd.affiche())
251 def construit_liste_dico(self):
254 for cmd in self.liste_commandes:
261 """ retourne l'objet rapport du catalogue de commande """
264 def analyse_catalogue(parent,nom_cata):
265 cata = CATALOGUE_CATA(parent,nom_cata)
266 cata.analyse_texte(cata.texte_complet)
269 def analyse_catalogue_commande(parent,nom_cata):
270 cata = CATALOGUE_CATA(parent,nom_cata)
271 cata.analyse_commande(cata.texte_complet)
272 cata.construit_liste_dico()
276 def make_cata_pickle(fic_cata):
278 Lance l'analyse de l'ordre des mots-clés dans le catalogue dont le nom
279 est passé en argument et sauvegarde ces infos dans le fichier pickle relu
282 fic_cata_p = os.path.splitext(fic_cata)[0]+'_pickled.py'
283 cata_ordonne = analyse_catalogue(None,fic_cata)
284 f = open(fic_cata_p,'w+')
285 p = cPickle.Pickler(f)
286 p.dump(cata_ordonne.dico)
289 if __name__ == "__main__" :
291 profile.run("analyse_catalogue(None,'U:\\EFICAS\\Cata\\cata_saturne.py')")