Salome HOME
PN : pour notation scientifique
[tools/eficas.git] / convert / parseur_python.py
index b5a458973b2590ca6152374dc9a670479a715893..7f4395a43666ca5acc3d24879eae3ee881582242 100644 (file)
@@ -1,3 +1,4 @@
+# -*- coding: utf-8 -*-
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
 # COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
@@ -98,6 +99,12 @@ class AFFECTATION(ENTITE_JDC):
         nom = string.strip(nom)
         if valeur[-1] == '\n': valeur = valeur[:-1]
         valeur = string.strip(valeur)
+       ## traitement des "
+       if valeur[0]=='"':
+          valeur=valeur[1:-1]
+       if valeur[-1]=='"':
+          valeur=valeur[0:-2]
+
         return nom+' = PARAMETRE(nom=\''+nom+'\',valeur="'+valeur+'")\n\n'
 
 class COMMANDE_COMMENTARISEE(ENTITE_JDC):
@@ -141,9 +148,9 @@ class PARSEUR_PYTHON:
     """
     Cette classe sert à générer un objet PARSEUR_PYTHON qui réalise l'analyse d'un texte 
     représentant un JDC Python en distinguant :
-    - les commentaires inter commandes
-    - les affectations
-    - les commandes
+      - les commentaires inter commandes
+      - les affectations
+      - les commandes
     """
     pattern_commande   = re.compile(r'^([A-Z][A-Z0-9_]+)([ \t\r\f\v]*)\(([\w\W]*)')
     pattern_eval       = re.compile(r'^(EVAL)([ \t\r\f\v]*)\(([\w\W]*)')
@@ -152,6 +159,7 @@ class PARSEUR_PYTHON:
     def __init__(self,texte):
         self.texte = texte
         self.l_objets=None
+        self.appli=None
 
     def is_affectation(self,texte):
         """
@@ -207,11 +215,10 @@ class PARSEUR_PYTHON:
 
     def analyse(self):
         """
-        Transforme dans self.fichier les commentaires Python (#...) par un objet
-        commentaire qui pourra donc être interprété par EFICAS.
-        Stocke le résultat dans self.texte
+        Eclate la chaine self.texte en self.l_objets une liste lignes d'instructions
+        et de commentaires (parmi lesquels des instructions "commentarisées").
         """
-        #l_lignes = open(self.fichier,'r').readlines()
+        #AY##l_lignes = open(self.fichier,'r').readlines()
         l_lignes = string.split(self.texte,'\n')
         commentaire_courant             = None
         commande_courante               = None
@@ -245,6 +252,10 @@ class PARSEUR_PYTHON:
                             # on crée un objet commande_commentarisee_courante
                             commande_commentarisee_courante = COMMANDE_COMMENTARISEE(self)
                             commande_commentarisee_courante.append_text(ligne)
+                        # si la ligne courante se termine par un ';', on décide - par hypothèse et peut-être à tort - que
+                        # la commande commentarisée courante est terminée !!
+                        if re.search( '; *$', ligne ) != None :
+                            commande_commentarisee_courante = None
                         continue
                     else:
                         # on a un double commentaire en fin de ligne
@@ -275,6 +286,10 @@ class PARSEUR_PYTHON:
                         commande_courante.append_text(ligne)
                         if commande_courante.get_nb_par() == 0:
                             # la commande courante est terminée (autant de parenthèses fermantes qu'ouvrantes)
+                            try :
+                               self.analyse_reel(commande_courante.texte)
+                            except :
+                               pass
                             commande_courante = None
                     else:
                         # il peut s'agir d'une commande ou d'une affectation ...
@@ -296,15 +311,116 @@ class PARSEUR_PYTHON:
                             affectation_courante = None
                             if commande_courante.get_nb_par() == 0:
                                 # la commande courante est terminée (autant de parenthèses fermantes qu'ouvrantes)
+                                self.analyse_reel(commande_courante.texte)
                                 commande_courante = None
                         else:
                             #--> poursuite d'une affectation
-                            affectation_courante.append_text(ligne)
-                                
-    def get_texte(self):
+                           # PN -- pour Empecher une erreur pas propre
+                           if affectation_courante != None :
+                               affectation_courante.append_text(ligne)
+                            #affectation_courante.append_text(ligne)
+
+
+    def enleve (self,texte) :
+        i=0
+        chaine=""
+        while (i<len(texte)):
+          if (texte[i] == " " or texte[i] == "\n" or texte[i] == "\t") :
+             i=i+1
+          else :
+             chaine=chaine+texte[i]
+             i=i+1
+        return chaine 
+            
+    def construit_genea(self,texte):
+        indiceC=0
+        mot=""
+        dict_reel_concept={}
+
+        # traitement pour chaque caractere
+        while (indiceC < len(texte)): 
+           c=texte[indiceC]
+           if ( c == "," or c == "(" or c == ")"):
+              mot=""
+           elif ( c== "="):
+              valeur=""
+              nouvelindice=indiceC+1
+              if texte[nouvelindice] != "(":
+                 while ( texte[nouvelindice] != "," and texte[nouvelindice] != ")"):
+                    valeur=valeur+texte[nouvelindice]
+                    nouvelindice=nouvelindice+1
+                    if nouvelindice == len(texte) :
+                       nouvelindice=nouvelindice -1
+                        break
+                 if mot in self.appli.liste_simp_reel:
+                    if valeur[0] != "'":
+                       try :
+                         clef=eval(valeur)
+                         if str(clef) != str(valeur) :
+                            dict_reel_concept[clef]=valeur
+                       except :
+                         pass
+                 mot=""
+                 indiceC=nouvelindice
+              else:
+               # s agit -il d un tuple 
+                 if texte[nouvelindice+1] != "(":
+                    tuple=False
+                    while ( texte[nouvelindice] != "="):
+                       if texte[nouvelindice] == ")" :
+                          tuple=True
+                          break
+                       else :
+                          nouvelindice=nouvelindice+1
+                          if nouvelindice == len(texte) :
+                            nouvelindice=nouvelindice -1
+                             break
+                    if tuple :
+                       valeur=texte[indiceC+1:nouvelindice+1]
+                       indiceC=nouvelindice+1 
+                       if mot in self.appli.liste_simp_reel:
+                          valeur=valeur[1:-1]
+                          for val in valeur.split(',') :
+                          # Attention la derniere valeur est""
+                             try :
+                                if val[0] != "'":
+                                  clef=eval(val)
+                                  if str(clef) != str(val) :
+                                     dict_reel_concept[clef]=val
+                             except :
+                                  pass
+                       mot=""
+               # ou de ( imbriqueés
+                 else :
+                    mot=""
+           else :
+              mot=mot+texte[indiceC]
+           indiceC=indiceC+1
+        # traitement du dernier inutile
+        # c est un ; 
+        return dict_reel_concept
+
+    def analyse_reel(self,commande) :
+        nomConcept=None
+        # On verifie qu on a bien un OPER
+        # et pas une MACRO
+        if commande.find("=") > commande.find("(") :
+           return
+        if commande.find("=") > 0:
+           epure1=self.enleve(commande)
+           nomConcept=epure1.split("=")[0]
+           index=epure1.find("=")
+           epure2=epure1[index+1:len(epure1)].replace("_F(","(")
+           dict_reel_concept=self.construit_genea(epure2)
+        if nomConcept !=None :
+           if len(dict_reel_concept) != 0:
+              self.appli.dict_reels[nomConcept]=dict_reel_concept
+
+    def get_texte(self,appli=None):
         """
         Retourne le texte issu de l'analyse
         """
+        self.appli=appli
         if not self.l_objets : self.analyse()
         txt=''
         for obj in self.l_objets: