From a559d16a823d1849d85d5fac9e8003f77353092e Mon Sep 17 00:00:00 2001 From: Pascale Noyret Date: Fri, 26 May 2006 15:11:16 +0000 Subject: [PATCH] PN : pour sauvegarde --- Traducteur/inseremocle.py | 61 +++++++++++++++++++++++++++++++++++++-- Traducteur/jdcparser.py | 19 ++++++++++-- Traducteur/movemocle.py | 47 ++++++++++++++++++++++++++++++ Traducteur/removemocle.py | 4 ++- 4 files changed, 125 insertions(+), 6 deletions(-) diff --git a/Traducteur/inseremocle.py b/Traducteur/inseremocle.py index 62d1dc63..6e23e96f 100644 --- a/Traducteur/inseremocle.py +++ b/Traducteur/inseremocle.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- import logging from parseur import FactNode +import string debug=1 @@ -31,6 +32,46 @@ def inseremotcleincommand(jdc,command,texte): if numcol > 0 : # Les mots clefs etaient sur la même ligne jdc.joinLineandNext(command.lineno) +#--------------------------------------------- +def inseremotcleinfacteur(jdc,facteur,texte): +#------------------------------------------------- + if debug : print "inseremotcle ", texte , " dans ", facteur.name + ancien=jdc.getLine(facteur.endline -1) + # On va chercher la dernier ) pour ajouter avant + # on va verifier s il il y a un , avant + ligne,col,boolvirgule=chercheDerniereParenthese(jdc,facteur) + if col > 0 : + jdc.splitLine(ligne,col) + if boolvirgule == 0 : + jdc.addLine(",\n",ligne) + jdc.joinLineandNext(ligne) + debut=ancien.find("_F") + 3 + aligne=debut*" " + texte=aligne+texte+"\n" + jdc.addLine(texte,ligne) + jdc.joinLineandNext(ligne+1) + +#--------------------------------------- +def chercheDerniereParenthese(jdc,facteur): +#--------------------------------------- + ligne=facteur.endline-1 + col=-1 + boolvirgule=0 + trouveParent=0 + while ( trouveParent == 0) : + texte=jdc.getLine(ligne) + col=texte.rfind(")") + if col < 0 : + ligne=ligne-1 + else : + trouveParent=1 + indice=col -1 + while ( indice > -1 and texte[indice] == " " ): + indice = indice -1 + if texte[indice]=="," : + boolvirgule = 1 + return (ligne,col,boolvirgule) + #----------------------------------- def chercheDebut1mot(jdc,command): #----------------------------------- @@ -40,9 +81,23 @@ def chercheDebut1mot(jdc,command): assert (command.childNodes != []) debut=-1 node1=command.childNodes[0] - if node1.lineno == command.lineno : - debut=node1.colno + if hasattr(node1,"lineno"): + if node1.lineno == command.lineno : + debut=node1.colno + else: + debut=chercheDebutfacteur(jdc,command) + if debut == -1 and debug : print "attention!!! pb pour trouver le debut dans ", command + return debut + +#----------------------------------- +def chercheDebutfacteur(jdc,facteur): +#----------------------------------- + debut=-1 + ligne=jdc.getLines()[facteur.lineno] + debut=ligne.find("_F") + if debut > -1 : debut=debut + 3 return debut + #----------------------------------- @@ -54,3 +109,5 @@ def chercheAlignement(jdc,command): node1=command.childNodes[0] nbBlanc=node1.colno return " "*nbBlanc + + diff --git a/Traducteur/jdcparser.py b/Traducteur/jdcparser.py index 3eeebd5b..a6a81ab3 100644 --- a/Traducteur/jdcparser.py +++ b/Traducteur/jdcparser.py @@ -12,7 +12,7 @@ import movemocle # "AFFE_MATERIAU","DEFI_MATERIAU","STAT_NONLINE", # ) -atraiter=("CALC_FONCTION","IMPR_GENE") +atraiter=("CALC_FONCTION","IMPR_GENE","STAT_NON_LINE") filename="toto.comm" jdc=getJDC(filename,atraiter) root=jdc.root @@ -32,12 +32,25 @@ parseKeywords(root) #removemocle.removemocleinfact(jdc,"STAT_NONLINE","SOLV","METHOD") #removemocle.removemocle(jdc,"STAT_NONLINE","AFFE") -# renamecommande(jdc,ancien-nom-de-commande,nouveau-nom-de-commande) -#renamemocle.renamecommande(jdc,"CALC_FONCTION","INFO_FONCTION") +# les arguments sont jdc,ancien-nom-de-commande,nouveau-nom-de-commande +renamemocle.renamecommande(jdc,"CALC_FONCTION","INFO_FONCTION") +# Les arguments sont - jdc, +# - nom de la procedure (pas teste avec autre chose) +# - nom du mot clef facteur contenant, +# - nom du mot cle simple +# Attention ne fonctionne pas pour l instant avec +sieurs occurences du mot cle à déplacer movemocle.movemoclefromfacttofather(jdc,"IMPR_GENE","GENE","UNITE") movemocle.movemoclefromfacttofather(jdc,"IMPR_GENE","GENE","FORMAT") +# Les arguments sont - jdc +# - nom de l operateur (pas teste avec autre chose) +# - nom du mot clef facteur source, +# - nom du mot cle simple +# - liste de mots clef facteur arrivée possible +# Attention ne fonctionne pas pour l instant avec +sieurs occurences du mot cle à déplacer +movemocle.movemoclefromfacttofactmulti(jdc,"STAT_NON_LINE","CONVERGENCE","RESI_INTE_RELA",("COMP_INCR","COMP_ELAS")) + #renamemocle.renamecommande(jdc,"AFFE_CHAR_MECA","AFFE_CHAR_MECA_PN") #renamemocle.renamecommande(jdc,"DEBUT","DEBUT_PN") diff --git a/Traducteur/movemocle.py b/Traducteur/movemocle.py index 86f2d881..c5a8c242 100644 --- a/Traducteur/movemocle.py +++ b/Traducteur/movemocle.py @@ -7,6 +7,7 @@ from parseur import FactNode debug=1 def movemoclefromfacttofather(jdc,command,fact,mocle): +# exemple type : IMPR_GENE for c in jdc.root.childNodes: if c.name != command:continue for mc in c.childNodes: @@ -22,5 +23,51 @@ def movemoclefromfacttofather(jdc,command,fact,mocle): removemocle.removemocleinfact(jdc,command,fact,mocle) +def movemoclefromfacttofactmulti(jdc,oper,factsource,mocle,liste_factcible): +# exemple type STAT_NON_LINE et RESI_INTER_RELA + for factcible in liste_factcible : + movemoclefromfacttofact(jdc,oper,factsource,mocle,factcible) + removemocle.removemocleinfact(jdc,oper,factsource,mocle) + +def movemoclefromfacttofact(jdc,oper,factsource,mocle,factcible): + if debug : print "movemoclefromfacttofact pour " ,oper,factsource,mocle,factcible + for c in jdc.root.childNodes: + if c.name != oper : continue + cible=None + for mc in c.childNodes: + if mc.name != factcible : + continue + else : + cible=mc + break + if cible==None : + logging.info("Pas de changement pour %s,%s,%s", oper, factsource,mocle) + logging.info("Le mot clef cible %s n est pas présent", factcible) + if debug : print "Pas de changement pour ", oper, " ", factsource, " ",mocle, "cible non trouvée" + continue + + for mc in c.childNodes: + source=None + if mc.name != factsource: + continue + else : + source=mc + break + if source==None : + logging.info("Pas de changement pour %s,%s,%s", oper, factsource,mocle) + logging.info("Le mot clef source %s n est pas présent", factsource) + if debug : print "Pas de changement pour ", oper, " ", factsource, " ",mocle, "source non trouvée" + continue + + if debug : print "Changement pour ", oper, " ", factsource, " ",mocle, "cible et source trouvées" + l=source.childNodes[:] + for ll in l: + for n in ll.childNodes: + if n.name != mocle:continue + MonTexte=n.getText(jdc); + print cible.name + inseremocle.inseremotcleinfacteur(jdc,cible,MonTexte) + logging.info("Changement de place : %s,%s, %s ",n.name, n.lineno, n.colno) + logging.info("vers : %s", cible.name) diff --git a/Traducteur/removemocle.py b/Traducteur/removemocle.py index 66fabd79..96161176 100644 --- a/Traducteur/removemocle.py +++ b/Traducteur/removemocle.py @@ -2,7 +2,8 @@ import logging from parseur import FactNode -debug=1 +#debug=1 +debug=0 #on n'a qu'un mocle par commande. On peut donc supprimer le mocle sans trop de précautions (a part iterer a l'envers sur les commandes) #avant de supprimer un autre mocle, on remet à jour l'arbre syntaxique (lineno,colno,etc.) def removemocle(jdc,command,mocle): @@ -30,6 +31,7 @@ def removemc(jdc,c,mc): if debug:print "mocle sur une ligne--%s--" % jdc.getLines()[mc.lineno-1][mc.colno:mc.endcol] s=jdc.getLines()[mc.lineno-1] jdc.getLines()[mc.lineno-1]=s[:mc.colno]+s[mc.endcol:] + jdc.reset(jdc.getSource()) def removemocleinfact(jdc,command,fact,mocle): #on itere sur les commandes a l'envers pour ne pas polluer les numeros de ligne avec les modifications -- 2.39.2