1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2007-2013 EDF R&D
4 # This library is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU Lesser General Public
6 # License as published by the Free Software Foundation; either
7 # version 2.1 of the License.
9 # This library is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 # Lesser General Public License for more details.
14 # You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 from __future__ import absolute_import
21 from __future__ import print_function
23 from future import standard_library
24 standard_library.install_aliases()
28 from builtins import str
31 from builtins import object
32 import sys,re,tokenize
36 class ENTITE_JDC(object) :
40 def set_text(self,texte):
43 def append_text(self,texte):
46 self.texte = self.texte +texte
48 class COMMENTAIRE(ENTITE_JDC):
52 Retourne une chaine de caracteres representant self
53 sous une forme interpretable par EFICAS
56 return "COMMENTAIRE(u"+t+")\n"
58 def append_text(self,texte):
60 Ajoute texte a self.texte en enlevant le # initial
63 self.texte = self.texte+texte[1:]
65 # le diese n'est pas sur le premier caractere
66 amont,aval = texte.split('#',1) # on decoupe suivant la premiere occurrence de #
67 self.texte = self.texte +amont + aval
69 class AFFECTATION(ENTITE_JDC):
71 def append_text(self,texte):
73 Ajoute texte a self.texte en enlevant tout retour chariot et tout point virgule
75 self.texte = self.texte+texte
79 Retourne une expression de l'affectation comprehensible par ACCAS
80 et exploitable par EFICAS
84 return "PARAMETRE(nom='"+self.name+"',valeur="+t+")"
86 class COMMANDE_COMMENTARISEE(ENTITE_JDC):
88 def append_text(self,texte):
90 Ajoute texte a self.texte en enlevant les doubles commentaires
93 texte = texte[2:].strip()
94 self.texte = self.texte+(len(self.texte)>0)*'\n'+texte
98 Retourne une expression de la commande commentarisee comprehensible par ACCAS
99 et exploitable par EFICAS
101 return "COMMANDE_COMM(texte="+repr(self.texte)+")\n"
105 next['if'] = next['elif'] = 'elif', 'else', 'end'
106 next['while'] = next['for'] = 'else', 'end'
107 next['try'] = 'except', 'finally'
108 next['except'] = 'except', 'else', 'end'
109 next['else'] = next['finally'] = next['def'] = next['class'] = 'end'
111 start = 'if', 'while', 'for', 'try', 'def', 'class'
113 class PARSEUR_PYTHON(object):
115 Cette classe sert a creer un objet PARSEUR_PYTHON qui realise l'analyse d'un texte
116 representant un JDC Python en distinguant :
117 - les commentaires inter commandes
121 # au moins 1 caractere non blanc ou non tabulation
122 #pattern_ligne_non_blanche = re.compile(r'^[\w\t]+')
123 pattern_ligne_non_blanche = re.compile(r'[^ \t]+')
125 r'^\s*(?P<kw>[a-z]+)'
126 r'(\s+(?P<id>[a-zA-Z_]\w*))?'
128 endprog = re.compile(
129 r'^\s*#?\s*end\s+(?P<kw>[a-z]+)'
130 r'(\s+(?P<id>[a-zA-Z_]\w*))?'
132 wsprog = re.compile(r'^[ \t]*')
133 optionprog=re.compile(r'#\s*parse:\s*([^\n\'"]*)$')
135 def __init__(self,texte):
136 # on verifie que le texte fourni se compile correctement
137 compile(texte,"<string>",'exec')
138 self.texte = io.StringIO(texte)
143 self.please_indent = 1
144 self.indent_list = []
148 self.indent_list=[""]
149 self.objet_courant=None
150 self.affectation_flag=1
153 self.buffer_indent=""
155 def getoptions(self):
156 m= self.optionprog.match(self.line)
160 flag=(option[0] == '+')
161 if name == "affectation": self.affectation_flag=flag
162 if name == "comment": self.comment_flag=flag
164 self.comment_flag=flag
165 self.affectation_flag=flag
168 self.line= self.texte.readline()
169 #print "line:",self.line
174 def get_texte(self,appli=None):
176 Retourne le texte issu de l'analyse
178 for tk in tokenize.generate_tokens(self.readline):
179 self.process_token(tk)
182 def process_token(self, tk):
185 ttype, tstring, spos, epos, line = tk
186 thisrow, thiscol = spos
187 #print spos, epos,tokenize.tok_name[ttype],self.lastrow, self.lastcol
189 if thisrow > self.lastrow:
190 # si plusieurs lignes (>1)
191 self.out=self.out+"\n" * (thisrow - self.lastrow - 1)
194 # if thiscol > self.lastcol :
195 # self.out=self.out+ " " * (thiscol - self.lastcol)
196 # self.please_indent = None
199 #self.nextrow, self.nextcol = epos
202 fn = getattr(self, tokenize.tok_name[ttype])
203 except AttributeError:
204 print( "No match!", tokenize.tok_name[ttype], tstring)
207 if ttype != tokenize.DEDENT and ttype != tokenize.INDENT and self.please_indent:
211 self.lastrow, self.lastcol = epos
213 def output(self,tstring):
214 #print "output",tstring
216 if self.thiscol > self.lastcol :
217 #print self.thiscol,self.lastcol
218 self.out=self.out+ " " * (self.thiscol - self.lastcol)
219 self.lastcol=self.thiscol
221 self.out=self.out+tstring
223 def output_com(self,tstring):
224 self.out=self.out+tstring
226 def update_indent(self):
227 #print "update_indent",len(self.indent_list[-1]),len(self.buffer_indent)
228 if len(self.indent_list[-1]) > len(self.buffer_indent):
229 self.out=self.out+(len(self.indent_list[-1]) - len(self.buffer_indent))*" "
230 self.buffer_indent=self.indent_list[-1]
233 #print "indentation dans do_indent",len(self.indent_list)
235 self.out=self.out+self.indent_list[-1]
236 self.buffer_indent=self.indent_list[-1]
237 if self.lastcol+len(self.indent_list[-1]) > self.thiscol:
238 self.lastcol=self.thiscol
240 self.lastcol=self.lastcol+len(self.indent_list[-1])
241 self.please_indent = None
243 def flush_buffer(self):
245 # print len(self.indent_list),self.please_indent
246 for ob in self.buffer:
247 self.out= self.out+ str(ob)
250 self.objet_courant=None
252 def NL(self, tstring):
254 if self.paren_level == 0:
255 # affectation en cours mais complete
256 self.out= self.out+ str(self.affectation_courante)
257 self.affectation_courante=None
261 # affectation en cours, on ajoute
262 if self.thiscol > self.lastcol :self.affectation_courante.append_text((self.thiscol - self.lastcol)*" ")
263 self.affectation_courante.append_text(tstring)
266 if self.objet_courant:
267 self.objet_courant=None
268 self.buffer.append(tstring)
269 # self.please_indent = None
272 self.please_indent = 1
274 def COMMENT(self, tstring):
275 liste= string.split(self.line,"##",1)
277 # On a trouve un double commentaire
280 # affectation en cours, on ignore
282 elif self.paren_level > 0:
284 elif self.comment_flag and not self.pattern_ligne_non_blanche.search(before):
285 # il s'agit d'une commande commentarisee
286 if self.objet_courant == None:
287 if not self.buffer:self.buffer_indent=self.indent_list[-1]
288 self.objet_courant=COMMANDE_COMMENTARISEE()
289 self.buffer.append(self.objet_courant)
290 self.objet_courant.append_text(tstring)
291 self.please_indent = None
292 elif isinstance(self.objet_courant,COMMENTAIRE):
293 self.objet_courant=COMMANDE_COMMENTARISEE()
294 self.buffer.append(self.objet_courant)
295 self.objet_courant.append_text(tstring)
296 self.please_indent = None
298 self.objet_courant.append_text(tstring)
299 self.please_indent = None
303 self.please_indent = 1
307 # On a un commentaire simple
308 new_line = self.line.split('#')[0]
310 # affectation en cours, on ignore
312 elif self.paren_level > 0:
314 elif self.comment_flag and not self.pattern_ligne_non_blanche.search(new_line):
315 # commentaire precede de blancs
316 if self.objet_courant == None:
317 if not self.buffer:self.buffer_indent=self.indent_list[-1]
318 self.objet_courant=COMMENTAIRE()
319 self.buffer.append(self.objet_courant)
320 self.objet_courant.append_text(tstring)
321 self.please_indent = None
322 elif isinstance(self.objet_courant,COMMANDE_COMMENTARISEE):
323 self.objet_courant=COMMENTAIRE()
324 self.buffer.append(self.objet_courant)
325 self.objet_courant.append_text(tstring)
326 self.please_indent = None
328 self.objet_courant.append_text(tstring)
329 self.please_indent = None
333 self.please_indent = 1
336 def ERRORTOKEN(self, tstring):
337 print("ERRORTOKEN", tstring)
339 def NAME(self, tstring):
344 if self.affectation ==1:
345 # on a une expression du type NAME=NAME
346 # on ne veut pas des expressions qui commencent par NAME=NAME(NAME=
347 # on en prend le chemin : on met affectation a 3 pour le signaler
348 # on attend d'en savoir plus
349 if self.thiscol > self.lastcol :self.affectation_courante.append_text((self.thiscol - self.lastcol)*" ")
350 self.affectation_courante.append_text(tstring)
353 elif self.affectation ==4:
354 # on a une expression qui commence par NAME=NAME(NAME
355 # il s'agit tres probablement d'une commande
356 # on annule l'affectation en cours
357 if self.thiscol > self.lastcol :self.affectation_courante.append_text((self.thiscol - self.lastcol)*" ")
358 self.affectation_courante.append_text(tstring)
361 elif self.affectation == 2:
362 # affectation en cours, on ajoute
363 if self.thiscol > self.lastcol :self.affectation_courante.append_text((self.thiscol - self.lastcol)*" ")
364 self.affectation_courante.append_text(tstring)
369 if self.paren_level == 0 and self.affectation_flag:
370 # si on est en dehors de parentheses et en mode transformation d'affectation
371 # on initialise l'attribut name qui indique une affectation en cours
375 def ident(self, tstring):
380 def NUMBER(self, tstring):
382 if self.affectation>=1:
383 # affectation en cours, on ajoute
384 if self.thiscol > self.lastcol :self.affectation_courante.append_text((self.thiscol - self.lastcol)*" ")
385 self.affectation_courante.append_text(tstring)
390 def OP(self,tstring):
392 if tstring in ('(','[','{'): self.paren_level=self.paren_level+1
393 if tstring in (')',']','}'): self.paren_level=self.paren_level-1
395 if tstring == '=' and self.affectation ==5:
396 # on a une expression qui commence par NAME=NAME(NAME=)
397 # il peut s'agir d'une commande
398 # on annule l'affectation en cours
399 self.out= self.out+ self.affectation_courante.texte
400 self.affectation_courante=None
403 elif tstring == ')' and self.affectation ==4:
404 # on a une expression qui commence par NAME=NAME()
405 # il peut s'agir d'une commande
406 # on annule l'affectation en cours
407 self.out= self.out+ self.affectation_courante.texte
408 self.affectation_courante=None
410 elif tstring == '(' and self.affectation == 3:
411 # on a deja trouve NAME=NAME
412 # on passe affectation a 4
413 if self.thiscol > self.lastcol :self.affectation_courante.append_text((self.thiscol - self.lastcol)*" ")
414 self.affectation_courante.append_text(tstring)
417 elif tstring == ';' and self.affectation>=1:
418 # l'affectation est terminee
419 self.out= self.out+ str(self.affectation_courante)
420 self.affectation_courante=None
423 elif self.affectation>=1:
424 # on complete l'affectation
425 if self.thiscol > self.lastcol :self.affectation_courante.append_text((self.thiscol - self.lastcol)*" ")
426 self.affectation_courante.append_text(tstring)
431 if self.name and tstring=='=':
433 self.affectation_courante=AFFECTATION()
434 self.affectation_courante.name=self.name
440 def INDENT(self, tstring):
441 #tstring=str(len(self.indent_list))*len(tstring)
442 self.indent_list.append(tstring)
443 #print "indentation dans INDENT",len(self.indent_list),len(tstring)
449 def DEDENT(self, tstring):
450 #print "DEDENT",tstring,len(tstring)
452 self.out= self.out+ str(self.buffer[0])
453 if len(self.buffer) > 1:
454 for ob in self.buffer[1:]:
456 self.out= self.out+ str(ob)
458 self.objet_courant=None
462 self.indent_list = self.indent_list[:-1]
463 #print "indentation dans DEDENT",len(self.indent_list)
465 def STRING(self, tstring):
467 if self.affectation>=1:
468 # affectation en cours, on ajoute
469 if self.thiscol > self.lastcol :self.affectation_courante.append_text((self.thiscol - self.lastcol)*" ")
470 self.affectation_courante.append_text(tstring)
475 if __name__ == "__main__" :
492 ##toto = FORMULE(REEL='(REEL:A) = A',);
518 #qqqqqqqqqqqqqqqqqqqqqqqq
523 toto = FORMULE(REEL='(REEL:A) = A',);
524 titi = FORMULE(REEL='(REEL:A) = A',) # commentaire inline
525 tutu = FORMULE(REEL='(REEL:A) = A',) ## commentaire inline
527 TEST_TABLE( TABLE=RELV[k],
529 _F( NOM_PARA = 'QUANTITE',
530 VALE_K = 'MAXIMUM'),),
532 NOM_PARA='VMIS', # comm
533 VALE=1.9669824189084E9,
534 REFERENCE='NON_REGRESSION',
549 for k in range(1,10):
551 # Appel a GMSH pour le maillage
553 f=open("coque.geo","w")
582 fmt_raison='-'*80+'''
584 Exception erreur_Fatale interceptee
587 '''+'-'*80+'xxxxxxxxxxxxxxxx'
595 ##toto = FORMULE(REEL='(REEL:A) = A',
619 MA=LIRE_MAILLAGE(#comment
622 MA=LIRE_MAILLAGE(INFO=1)
625 MA=LIRE_MAILLAGE(#comme
628 LIRE_MAILLAGE(INFO=1)
630 TFIN = 1.790 # Temps fin pour le calcul
632 PAS = 0.001 # pas de temps du calcul
633 # parse: -affectation
640 MO=AFFE_MODELE( MAILLAGE=MA,
641 #test de validateur GEOM (typ=grma) avec grma derive de GEOM
642 AFFE=(_F(GROUP_MA = ('LI1'),
643 PHENOMENE = 'MECANIQUE',
644 MODELISATION = 'DIS_TR'),
649 DS1[k] = CREA_CHAMP( OPERATION='EXTR', TYPE_CHAM='NOEU_DEPL_R',
650 RESULTAT= MODESTA1, NUME_ORDRE=k, NOM_CHAM = 'DEPL');
652 # parse: +affectation
653 ff=23 # parametre bidon
658 ##toto = FORMULE(REEL='(REEL:A) = A',
664 ##toto = FORMULE(REEL='(REEL:A) = A',
670 ##toto = FORMULE(REEL='(REEL:A) = A',
676 ##toto = FORMULE(REEL='(REEL:A) = A',
686 sensible=[2.1E11, 0.3, 1.E-6, 1.E-6, ]
689 # parse: -affectation
694 PS[i]=DEFI_PARA_SENSI(VALE=sensible[i])
695 # parse: +affectation
697 TEST_RESU(RESU=(_F(RESULTAT = U3L,
704 REFERENCE = 'AUTRE_ASTER',
713 TEST_RESU(RESU=(_F(RESULTAT = U3L,
720 REFERENCE = 'AUTRE_ASTER',
726 titi = FORMULE(REEL='(REEL:A) = A',
727 ) # commentaire inline
728 titi = FORMULE(REEL='(REEL:A) = A',
729 ) # commentaire inline
735 for i in range(10): s=0
743 for k in range(1,10):
745 # Appel a GMSH pour le maillage
747 f=open("coque.geo","w")
815 for k in range(1,10):
817 # Appel a GMSH pour le maillage
819 f=open("coque.geo","w")
829 for k in range(1,10):
831 # Appel a GMSH pour le maillage
833 f=open("coque.geo","w")
866 SUP_=dict([(grand,0.) for grand in grand_obs])
868 for k in range(1,ns+1):
888 ########################################################################
890 ########################################################################
891 # macro commande de post-traitement (ex POST_GOUJ2E)
892 # calcul des reactions cumulees suivant les filets
894 def POST_GOUJ_ops(self,TABLE):
898 if len(sys.argv)== 2:
899 progname, input = sys.argv
905 txt = PARSEUR_PYTHON(t).get_texte()
907 compile(txt,"<string>",'exec')