-#@ MODIF parseur_python Parsers DATE 05/09/2001 AUTEUR DURAND C.DURAND
+# -*- coding: utf-8 -*-
# CONFIGURATION MANAGEMENT OF EDF VERSION
# ======================================================================
-# COPYRIGHT (C) 1991 - 2001 EDF R&D WWW.CODE-ASTER.ORG
-# SEE THE FILE "LICENSE.TERMS" FOR INFORMATION ON USAGE AND
-# REDISTRIBUTION OF THIS FILE.
+# COPYRIGHT (C) 1991 - 2002 EDF R&D WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
+# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
+# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+# 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
# ======================================================================
import sys,string,re
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):
"""
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]*)')
def __init__(self,texte):
self.texte = texte
self.l_objets=None
+ self.appli=None
def is_affectation(self,texte):
"""
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
# 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
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 ...
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: