]> SALOME platform Git repositories - tools/eficas.git/blob - Traducteur/removemocle.py
Salome HOME
d90ad636818b211049698c25fde43564f74708d3
[tools/eficas.git] / Traducteur / removemocle.py
1 # -*- coding: utf-8 -*-
2 import logging
3 import regles
4 from parseur import FactNode
5 from dictErreurs import EcritErreur
6 from dictErreurs import jdcSet
7
8 #debug=1
9 debug=0
10 #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)
11 #avant de supprimer un autre mocle, on remet à jour l'arbre syntaxique (lineno,colno,etc.)
12
13
14 #-----------------------------------------------------------------------
15 def removeMotCle(jdc,command,mocle,ensemble=regles.SansRegle,erreur = 0):
16 #-----------------------------------------------------------------------
17     #on itere sur les commandes a l'envers pour ne pas polluer les numeros de ligne avec les modifications
18     if command not in jdcSet : return
19     boolChange=0
20     commands= jdc.root.childNodes[:]
21     commands.reverse()
22     for c in commands:
23         if c.name != command:continue
24         for mc in c.childNodes:
25             if mc.name != mocle:continue
26             if ensemble.verif(c) == 0 : continue
27             if erreur : EcritErreur((command,mocle),c.lineno)
28             boolChange=1
29             removeMC(jdc,c,mc)
30
31     if boolChange : jdc.reset(jdc.getSource())
32
33 #-------------------------------------------------------
34 def removeMotCleSiRegle(jdc,command,mocle,liste_regles) :
35 #-------------------------------------------------------
36     if command not in jdcSet : return
37     mesRegles=regles.ensembleRegles(liste_regles)
38     removeMotCle(jdc,command,mocle,mesRegles,erreur=0)
39
40 #----------------------------------------------------------------
41 def removeMotCleSiRegleAvecErreur(jdc,command,mocle,liste_regles) :
42 #--------------------------------------------------------------
43     if command not in jdcSet : return
44     mesRegles=regles.ensembleRegles(liste_regles)
45     removeMotCle(jdc,command,mocle,mesRegles,erreur=1)
46
47 #----------------------------------------------------------------
48 def removeMotCleAvecErreur(jdc,command,mocle) :
49 #--------------------------------------------------------------
50     if command not in jdcSet : return
51     removeMotCle(jdc,command,mocle,erreur=1)
52       
53
54 #--------------------------------------------------------------------
55 def removeCommande(jdc,command,ensemble=regles.SansRegle,erreur=0):
56 #--------------------------------------------------------------------
57     if command not in jdcSet : return
58     boolChange=0
59     commands= jdc.root.childNodes[:]
60     commands.reverse()
61     for c in commands:
62         if c.name != command:continue
63         if ensemble.verif(c) == 0 : continue
64         boolChange=1
65         if erreur : EcritErreur((command,),c.lineno)
66         jdc.supLignes(c.lineno,c.endline)
67         logging.warning("Suppression de %s ligne %s",c.name,c.lineno)
68     if boolChange : jdc.reset(jdc.getSource())
69
70 #-------------------------------------------------------------
71 def removeCommandeSiRegleAvecErreur(jdc,command,liste_regles):
72 #-------------------------------------------------------------
73     if command not in jdcSet : return
74     mesRegles=regles.ensembleRegles(liste_regles)
75     removeCommande(jdc,command,mesRegles,1)
76                 
77 #---------------------------------
78 def removeMC(jdc,c,mc):
79 #---------------------------------
80     if debug : print "Suppression de:",c.name,mc.name,mc.lineno,mc.colno,mc.endline,mc.endcol
81     logging.info("Suppression de %s dans %s ligne %d",mc.name,c.name,mc.lineno)
82
83     if mc.endline > mc.lineno:
84         if debug:print "mocle sur plusieurs lignes--%s--" % jdc.getLines()[mc.lineno-1][mc.colno:]
85         jdc.getLines()[mc.lineno-1]=jdc.getLines()[mc.lineno-1][:mc.colno]
86         jdc.getLines()[mc.endline-1]=jdc.getLines()[mc.endline-1][mc.endcol:]
87
88         #attention : supprimer les lignes à la fin
89         jdc.getLines()[mc.lineno:mc.endline-1]=[]
90     else:
91         if debug:print "mocle sur une ligne--%s--" % jdc.getLines()[mc.lineno-1][mc.colno:mc.endcol]
92         s=jdc.getLines()[mc.lineno-1]
93         jdc.getLines()[mc.lineno-1]=s[:mc.colno]+s[mc.endcol:]
94         fusionne(jdc,mc.lineno-1)
95
96 #---------------------------------------------------------------------------------
97 def removeMotCleInFact(jdc,command,fact,mocle,ensemble=regles.SansRegle,erreur=0):
98 #----------------------------------------------------------------------------------
99     # on itere sur les commandes a l'envers pour ne pas polluer 
100     # les numeros de ligne avec les modifications
101     if command not in jdcSet : return
102     commands= jdc.root.childNodes[:]
103     commands.reverse()
104     boolChange=0
105     for c in commands:
106         if c.name != command:continue
107         for mc in c.childNodes:
108             if mc.name != fact:continue
109             l=mc.childNodes[:]
110             l.reverse()
111             for ll in l:
112                 for n in ll.childNodes:
113                     if n.name != mocle:continue
114                     if ensemble.verif(c) == 0 : continue
115                     if erreur : EcritErreur((command,fact,mocle),c.lineno)
116                     boolChange=1
117                     removeMC(jdc,c,n)
118
119     if boolChange : jdc.reset(jdc.getSource())
120
121 #------------------------------------------------------------------
122 def removeMotCleInFactSiRegle(jdc,command,fact,mocle,liste_regles):
123 #------------------------------------------------------------------
124     if command not in jdcSet : return
125     erreur=0
126     mesRegles=regles.ensembleRegles(liste_regles)
127     removeMotCleInFact(jdc,command,fact,mocle,mesRegles,erreur)
128
129 #----------------------------------------------------------------------
130 def removeMotCleInFactSiRegleAvecErreur(jdc,command,fact,mocle,liste_regles):
131 #----------------------------------------------------------------------
132     if command not in jdcSet : return
133     erreur=1
134     mesRegles=regles.ensembleRegles(liste_regles)
135     removeMotCleInFact(jdc,command,fact,mocle,mesRegles,erreur)
136
137
138 #----------------------------------------------------------------------
139 def removeMotCleInFactCourantSiRegle(jdc,command,fact,mocle,liste_regles,erreur=0):
140 #----------------------------------------------------------------------
141     if command not in jdcSet : return
142     ensemble=regles.ensembleRegles(liste_regles)
143     commands= jdc.root.childNodes[:]
144     commands.reverse()
145     boolChange=0
146     for c in commands:
147         if c.name != command:continue
148         for mc in c.childNodes:
149             if mc.name != fact:continue
150             l=mc.childNodes[:]
151             l.reverse()
152             for ll in l:
153                 if ensemble.verif(ll) == 0 : continue
154                 for n in ll.childNodes:
155                     if n.name != mocle:continue
156                     if erreur : EcritErreur((command,fact,mocle),c.lineno)
157                     boolChange=1
158                     removeMC(jdc,c,n)
159
160     if boolChange : jdc.reset(jdc.getSource())
161     
162 #------------------------------------------
163 def fusionne(jdc,numLigne):
164 #------------------------------------------
165 #   fusionne la ligne numLigne et numLigne+1
166 #   si la ligne numLigne+1 ne contient que des parentheses
167 #   fermantes
168 #   et si la ligne  numLigne ne contient pas par un "#"
169 #   Attention a la difference de numerotation
170 #        jdc.getLines()[numLigne] donne la ligne numLigne + 1
171 #        alors que joinLineandNext(numLigne) travaille sur le tableau
172     index=0
173     texte=jdc.getLines()[numLigne]
174     fusion=1
175     while (index < len(texte)) :
176       if texte[index] not in (" ",",",")",";","\n") :
177          fusion=0
178          break
179       index=index+1
180        
181     if fusion == 0 : return;
182
183     texte=jdc.getLines()[numLigne -1]
184     if texte.find("#") < 0 :
185        fusion=1
186     else :
187        fusion=0
188  
189     if fusion : 
190        import load 
191        jdc.joinLineandNext(numLigne)