def generarIf(self,cuadruplo, goto_end): op = cuadruplo.op change = False if op == '>': op = '<=' change = True elif op == '<': op= '>=' change = True elif op == '>=': op = '<' change = True elif op == '<=': op = '>' change = True elif op == '==': op = '!=' change = True elif op =='!=': op = '==' change = True if change: return Cuadruplo("if", "{0}{1}{2}".format( cuadruplo.arg1, op, cuadruplo.arg2),"goto" ,goto_end) elif cuadruplo.op == '=': return Cuadruplo("if","!"+cuadruplo.result,"goto",goto_end) else: return None
def traducir(self, tabla, arbol): super().traducir(tabla, arbol) res = '' indTemp1 = arbol.getLast() heapResultado = self.OperacionLogica.traducir(tabla, arbol) etiResultado1 = arbol.generarEtiqueta() indTemp2 = arbol.getLast() res = 'if {0} : goto .{1} \n'.format(heapResultado, etiResultado1) # if tn : goto Ln arbol.add3D([res]) arbol.agregarGeneral(0, 'if', heapResultado, etiResultado1) cuad = Cuadruplo('if', heapResultado, 'goto', etiResultado1) arbol.agregarCuadruplo(cuad) if indTemp1 == indTemp2: #Es un ID o un num arbol.agregarTripleta(0, 'if', heapResultado, indTemp1 + 3) else: indiceTemp = arbol.getLast() arbol.agregarTripleta( 0, 'if', indiceTemp, indiceTemp + 3 ) #obtener el Indice donde se debe de guarda el label de etiresultado1 #Procesar otras Operaciones etiResultado2 = arbol.generarEtiqueta() res = 'goto .{0}\n'.format( etiResultado2) # goto Ln+1--------> if tn: goto Ln \n goto Ln+1 arbol.agregarGeneral(0, 'label', etiResultado2, '') arbol.agregarTripleta(0, 'label', etiResultado2, '') arbol.add3D([res]) new_if = arbol.generarIF() cuad = Cuadruplo('goto', etiResultado2, '', '') arbol.agregarDicEtiqueta(cuad, new_if) res = 'label .{0}'.format(etiResultado1) arbol.add3D([res]) arbol.agregarGeneral(0, 'label', etiResultado1, '') cuad = Cuadruplo('.', etiResultado1, '', 'label') #arbol.agregarCuadruplo(cuad) varexp = self.InstruccionesPL if type(self.InstruccionesPL) == list: for ins in self.InstruccionesPL: res += ins.traducir(tabla, arbol) else: res += ins.traducir(tabla, arbol) res = 'label .{0}'.format(etiResultado2) arbol.add3D([res]) arbol.agregarGeneral(0, 'label', etiResultado2, '') cuad = Cuadruplo('.', etiResultado1, '', 'label') arbol.agregarCuadruplo(cuad) temp2 = arbol.getLast() + 1 arbol.modificarTripleta(0, 'label', etiResultado2, '', temp2) return res
def traducir(self, tabla, arbol): super().traducir(tabla, arbol) indTemp = arbol.getLast( ) #sabiendo el numero de elementos dentro de la lista hop1 = self.opIzq.traducir( tabla, arbol) # ---> Id, numero, .... Terminal --->si se creo etiquita indTemp2 = arbol.getLast( ) # si ese numero cambio quiere decir que se genero una etiqueta o una tripleta indTri = False if indTemp != indTemp2: indTri = True #OperadorIzq es una etiqueta hop2 = self.opDer.traducir(tabla, arbol) indTemp3 = arbol.getLast() indTri2 = False if indTemp2 != indTemp3: indTri2 = True h1 = arbol.generarHeap() ret2 = '{0} = {1} {2} {3}'.format(h1, hop1, self.operador, hop2) arbol.add3D([ret2]) arbol.agregarGeneral(0, self.operador, hop1, hop2) cuad = Cuadruplo(self.operador, hop1, hop2, h1) arbol.agregarCuadruplo(cuad) if indTri2 and indTri: arbol.agregarTripleta(0, self.operador, indTemp2, indTemp3) elif indTri: arbol.agregarTripleta(0, self.operador, indTemp2, hop2) elif indTri2: arbol.agregarTripleta(0, self.operador, hop1, indTemp3) else: arbol.agregarTripleta(0, self.operador, hop1, hop2) return h1
def regla5(self): etiquetas = {} for etiqueta in self.etiquetas: etiquetas[etiqueta] = [] for i in range(len(self.etiquetas[etiqueta])): '' if self.etiquetas[etiqueta][i].op == "if": '' if self.etiquetas[etiqueta][i].arg1 == "1==0": '' if i + 1 < len(self.etiquetas[etiqueta]): '' if self.etiquetas[etiqueta][i+1].op == "goto": '' new_cuadruplo = Cuadruplo("goto", self.etiquetas[etiqueta][i+1].arg1,"","") etiquetas[etiqueta].append(new_cuadruplo) self.add(self.etiquetas[etiqueta][i], 4) continue else: '' else: '' else: '' etiquetas[etiqueta].append(self.etiquetas[etiqueta][i]) return etiquetas
def regla1(self): etiquetas = {} cambios = {} for etiqueta in self.etiquetas: etiquetas[etiqueta] = [] for cuadruplo in self.etiquetas[etiqueta]: ''#debemos ir buscando op con = pattern = r'(\$t[0-9]+)' match1 = re.match(pattern,str(cuadruplo.arg1)) if cuadruplo.op == "=" and match1: if len(etiquetas[etiqueta])!=0: ant = etiquetas[etiqueta].pop() if ant.result == cuadruplo.arg1 and (not '[' in cuadruplo.result) and (cuadruplo.arg2 !=" "): self.add(ant,1) cambios[ant.result] = cuadruplo.result new = Cuadruplo(ant.op,ant.arg1,ant.arg2,cuadruplo.result) etiquetas[etiqueta].append(new) continue else: etiquetas[etiqueta].append(ant) etiquetas[etiqueta].append(cuadruplo) return etiquetas
def traducir(self, tabla, arbol): super().traducir(tabla, arbol) vars = self.tipo.getTipo().value #print(vars.value) if vars < 9: res = '{0} = {1} \n'.format(self.id, '0') arbol.agregarTripleta(0, '=', self.id, '0') arbol.agregarGeneral(0, 'asig', self.id, '0') arbol.add3D([res]) cuad = Cuadruplo('=', '0', '', self.id) arbol.agregarCuadruplo(cuad) elif vars > 8 and vars < 14: res = '{0} = {1} \n'.format(self.id, '""') arbol.agregarTripleta(0, '=', self.id, '""') arbol.agregarGeneral(0, 'asig', self.id, '0') arbol.add3D([res]) cuad = Cuadruplo('=', '0', '""', self.id) arbol.agregarCuadruplo(cuad) elif vars == 18: res = '{0} = {1} \n'.format(self.id, 'False') arbol.agregarTripleta(0, '=', self.id, 'False') arbol.agregarGeneral(0, 'asig', self.id, 'False') arbol.add3D([res]) cuad = Cuadruplo('=', '0', 'False', self.id) arbol.agregarCuadruplo(cuad) elif vars == 19: res = '{0} = {1} \n'.format(self.id, '0') arbol.agregarTripleta(0, '=', self.id, '0') arbol.agregarGeneral(0, 'asig', self.id, '0') arbol.add3D([res]) cuad = Cuadruplo('=', '0', '0', self.id) arbol.agregarCuadruplo(cuad) else: arbol.agregarTripleta(0, '=', self.id, ' ') arbol.agregarGeneral(0, 'asig', self.id, ' ') res = '{0} = {1} \n'.format(self.id, ' ') arbol.add3D([res]) cuad = Cuadruplo('=', '0', ' ', self.id) arbol.agregarCuadruplo(cuad) return res
def regla17(self): '' etiquetas = {} for etiqueta in self.etiquetas: etiquetas[etiqueta] = [] for cuadruplo in self.etiquetas[etiqueta]: '' if cuadruplo.op =="*": if str(cuadruplo.arg1) == "0": self.add(cuadruplo,17) etiquetas[etiqueta].append(Cuadruplo("=","0","", cuadruplo.result)) continue if str(cuadruplo.arg2) == "0": self.add(cuadruplo,17) etiquetas[etiqueta].append(Cuadruplo("=","0", "", cuadruplo.result)) continue etiquetas[etiqueta].append(cuadruplo) return etiquetas
def traducir(self, tabla, arbol): super().traducir(tabla, arbol) res = ' ' if self.Valores != None: ret = self.Valores.traducir(tabla, arbol) res += '{0} = {1} \n'.format(self.id, ret) cuad = Cuadruplo('=', ret, '', self.id) arbol.agregarCuadruplo(cuad) else: res = self.id cuad = Cuadruplo('=', '', '', self.id) arbol.agregarCuadruplo(cuad) arbol.add3D([res]) arbol.agregarTripleta(0, '=', self.id, ret) arbol.agregarGeneral(0, '=', self.id, ret) return res
def traducir(self, tabla, arbol): super().traducir(tabla, arbol) res = '' indTemp1 = arbol.getLast() heapResultado = self.OperacionLogica.traducir( tabla, arbol) # operacion_logica de la condicion del case indTemp2 = arbol.getLast() #Se verifica si en la condicion del when viene un terminal o una etiqueta if indTemp1 == indTemp2: # When es terminal #arbol.modificarTripletaCase(None,heapResultado,None,None) etiResultado1 = arbol.generarEtiqueta() res = 'if {0} : goto {1}'.format( heapResultado, etiResultado1) # tn = opCase == heapResultado arbol.add3D([res]) arbol.agregarTripleta(0, 'if', heapResultado, indTemp1 + 3) arbol.agregarGeneral(0, 'if', heapResultado, etiResultado1) cuad = Cuadruplo('if', heapResultado, 'goto', etiResultado1) arbol.agregarCuadruplo(cuad) else: # When trae una etiqueta #arbol.modificarTripletaCase(None,heapResultado,indTemp2,None) etiResultado1 = arbol.generarEtiqueta() res = 'if {0} : goto {1}'.format( heapResultado, etiResultado1) # tn = opCase == heapResultado arbol.add3D([res]) arbol.agregarTripleta(0, 'if', arbol.getLast(), indTemp2 + 4) arbol.agregarGeneral(0, 'if', heapResultado, etiResultado1) cuad = Cuadruplo('if', heapResultado, 'goto', etiResultado1) arbol.agregarCuadruplo(cuad) if self.ResultException != None: for resultExcs in self.ResultException: if type(resultExcs) == list: for resultExc in resultExcs: resultExc.traducir(tabla, arbol) else: resultExcs.traducir(tabla, arbol)
def regla7(self): '' etiquetas = {} eliminadas = {} for etiqueta in self.etiquetas: etiquetas[etiqueta] = [] for cuadruplo in self.etiquetas[etiqueta]: if cuadruplo.op == "if": '' etiqueta_goto = cuadruplo.result etiqueta_got = etiqueta_goto.replace('L', 'if') try: if 1 == len(self.etiquetas[etiqueta_goto]): '' goto_temp = self.etiquetas[etiqueta_goto][0] if goto_temp.op == "goto": '' self.add(cuadruplo,7) new_salto = Cuadruplo("if",cuadruplo.arg1,cuadruplo.arg2,goto_temp.arg1) etiquetas[etiqueta].append(new_salto) eliminadas[etiqueta_goto] = goto_temp.arg1 continue except KeyError: pass etiquetas[etiqueta].append(cuadruplo) #una vez terminado el proceso seguimos a eliminar las etiquetas que cambiaron for etiqueta in self.eliminadas: self.add(etiqueta + ":",6) del etiquetas[etiqueta] for etiqueta in eliminadas: if etiqueta in etiquetas: self.add(etiqueta + ":",7) del etiquetas[etiqueta] #recorremos la lista de nuevo en busca de if y goto que puedan tener las etiquetas indice = 0 for salto in eliminadas: for etiqueta in etiquetas: indice = 0 for cuadruplo in etiquetas[etiqueta]: if cuadruplo.op == "if": if cuadruplo.result == salto: etiquetas[etiqueta][indice].result = eliminadas[salto] elif cuadruplo.op == "goto": if cuadruplo.arg1 == salto: etiquetas[etiqueta][indice].arg1 = eliminadas[salto] indice +=1 return etiquetas
def traducir(self, tabla, arbol): super().traducir(tabla, arbol) ret= ' ' if self.Valores != None: ret =self.Valores.traducir(tabla, arbol) res = '{0} = {1} \n'.format(self.id, ret) arbol.add3D([res]) cuad = Cuadruplo('=', self.id, '', ret) arbol.agregarCuadruplo(cuad) return res
def regla4(self): etiquetas = {} for etiqueta in self.etiquetas: etiquetas[etiqueta] = [] for cuadruplo in self.etiquetas[etiqueta]: '' if cuadruplo.op == "if": '' if cuadruplo.arg1 == "1==1": '' new_cuadruplo = Cuadruplo("goto", cuadruplo.result,"","") etiquetas[etiqueta].append(new_cuadruplo) self.add(cuadruplo, 4) continue etiquetas[etiqueta].append(cuadruplo) return etiquetas
def regla6(self): '' etiquetas = {} eliminadas = {} for etiqueta in self.etiquetas: etiquetas[etiqueta] = [] for cuadruplo in self.etiquetas[etiqueta]: if cuadruplo.op == "goto": '' etiqueta_goto = cuadruplo.arg1 etiqueta_goto = etiqueta_goto.replace('L', 'if') try: if 1 == len(self.etiquetas[etiqueta_goto]): '' goto_temp = self.etiquetas[etiqueta_goto][0] if goto_temp.op == "goto": '' self.add(cuadruplo,6) new_salto = Cuadruplo("goto",goto_temp.arg1, "","") etiquetas[etiqueta].append(new_salto) eliminadas[etiqueta_goto] = goto_temp.arg1 continue except KeyError: pass etiquetas[etiqueta].append(cuadruplo) self.eliminadas = eliminadas indice = 0 for salto in eliminadas: for etiqueta in etiquetas: indice = 0 for cuadruplo in etiquetas[etiqueta]: if cuadruplo.op == "if": if cuadruplo.result == salto: etiquetas[etiqueta][indice].result = eliminadas[salto] elif cuadruplo.op == "goto": if cuadruplo.arg1 == salto: etiquetas[etiqueta][indice].arg1 = eliminadas[salto] indice +=1 return etiquetas
def traducir(self, tabla, arbol): super().traducir(tabla, arbol) vars1 = arbol.getTripletaCase() #arbol.eliminarTripleta() indTemp1 = arbol.getLast() if self.ListOP != None: for listopp in self.ListOP: heapResultado = listopp.traducir(tabla, arbol) indTemp2 = arbol.getLast() if vars1.verficar( None, None, None, None): #quiere decir que el case no tiene ID o Expresion if indTemp1 == indTemp2: etiResultado1 = arbol.generarEtiqueta() res = 'if {0} : goto {1}'.format( heapResultado, etiResultado1) # tn = opCase == heapResultado arbol.add3D([res]) arbol.agregarTripleta(0, 'if', heapResultado, indTemp1 + 3) arbol.agregarGeneral(0, 'if', heapResultado, etiResultado1) cuad = Cuadruplo('if', heapResultado, 'goto', etiResultado1) arbol.agregarCuadruplo(cuad) else: etiResultado1 = arbol.generarEtiqueta() res = 'if {} : goto {}'.format(heapResultado, etiResultado1) arbol.agregarTripleta( 0, 'if', indTemp2, indTemp2 + 3 ) #obtener el Indice donde se debe de guarda el label de etiresultado1 cuad = Cuadruplo('if', heapResultado, 'goto', etiResultado1) arbol.agregarCuadruplo(cuad) else: #quiere decir que el case cuenta con una condicion debemos generar una nueva etiqueta si no es un ID o un num. if indTemp1 == indTemp2: #when es un terminal if vars1.getOp1() == None: #case es un terminal etiResultado1 = arbol.generarEtiqueta() heapResultado2 = arbol.generarHeap() #tn.... res = '{0}={1}=={2}'.format(heapResultado2, vars1.getOper(), heapResultado) #t1 = id==id2 arbol.add3D([res]) arbol.agregarTripleta(0, '==', vars1.getOper(), heapResultado) arbol.agregarGeneral( 0, '==', vars1.getOper(), heapResultado) #ingresamos operacion de igualacion cuad = Cuadruplo('==', vars1.getOper(), heapResultado, heapResultado2) arbol.agregarCuadruplo(cuad) res = 'if {0} : goto {1}'.format( heapResultado2, etiResultado1) # tn = opCase == heapResultado arbol.add3D([res]) arbol.agregarTripleta(0, 'if', heapResultado, indTemp1 + 4) arbol.agregarGeneral(0, 'if', heapResultado, etiResultado1) cuad = Cuadruplo('if', heapResultado2, 'goto', etiResultado1) arbol.agregarCuadruplo(cuad) else: #el case tiene una condicion con etiqueta y el when es un terminal etiResultado1 = arbol.generarEtiqueta() heapResultado2 = arbol.generarHeap() #tn.... res = '{0}={1}=={2}'.format(heapResultado2, vars1.getOper(), heapResultado) arbol.add3D([res]) arbol.agregarTripleta(0, '==', vars1.getOp1(), heapResultado) arbol.agregarGeneral( 0, '==', vars1.getOper(), heapResultado) #ingresamos operacion de igualacion cuad = Cuadruplo('==', vars1.getOper(), heapResultado, heapResultado2) arbol.agregarCuadruplo(cuad) res = 'if {0} : goto {1}'.format( heapResultado2, etiResultado1) # tn = opCase == heapResultado arbol.add3D([res]) arbol.agregarTripleta(0, 'if', arbol.getLast(), indTemp2 + 4) arbol.agregarGeneral(0, 'if', heapResultado, etiResultado1) cuad = Cuadruplo('if', heapResultado2, 'goto', etiResultado1) arbol.agregarCuadruplo(cuad) else: #el case tiene una condicion con etiqueta y el when es una etiqueta etiResultado1 = arbol.generarEtiqueta() heapResultado2 = arbol.generarHeap() #tn.... res = '{0}={1}=={2}'.format(heapResultado2, vars1.getOper(), heapResultado) arbol.add3D([res]) arbol.agregarTripleta(0, '==', vars1.getOp1(), arbol.getLast()) arbol.agregarGeneral( 0, '==', vars1.getOper(), heapResultado) #ingresamos operacion de igualacion cuad = Cuadruplo('==', vars1.getOper(), heapResultado, heapResultado2) arbol.agregarCuadruplo(cuad) res = 'if {0} : goto {1}'.format( heapResultado2, etiResultado1) # tn = opCase == heapResultado arbol.add3D([res]) arbol.agregarTripleta(0, 'if', arbol.getLast(), indTemp2 + 4) arbol.agregarGeneral(0, 'if', heapResultado, etiResultado1) cuad = Cuadruplo('if', heapResultado2, 'goto', etiResultado1) arbol.agregarCuadruplo(cuad) etiResultado2 = arbol.generarEtiqueta() new_end = arbol.generarEND() res = 'goto .{0}\n'.format( etiResultado2) # goto Ln+1--------> if tn: goto Ln \n goto Ln+1 arbol.agregarGeneral(0, 'label', etiResultado2, '') arbol.agregarTripleta(0, 'label', etiResultado2, '') arbol.add3D([res]) cuad = Cuadruplo('goto', etiResultado2, '', '') new_if = arbol.generarIF() arbol.agregarDicEtiqueta(cuad, new_if) res = 'label .{0}'.format(etiResultado1) arbol.add3D([res]) arbol.agregarGeneral(0, 'label', etiResultado1, '') cuad = Cuadruplo('.', etiResultado1, '', 'label') #new_if = arbol.generarIF() #arbol.agregarCuadruplo(cuad) #varexp = self.InstruccionesPL12 if type(self.InstruccionPL12) == list: for ins in self.InstruccionPL12: res += ins.traducir(tabla, arbol) else: res += ins.traducir(tabla, arbol) res = 'label .{0}'.format(etiResultado2) arbol.add3D([res]) arbol.agregarGeneral(0, 'label', etiResultado2, '') temp2 = arbol.getLast() + 1 arbol.modificarTripleta(0, 'label', etiResultado2, '', temp2) new_end = arbol.generarEND() cuad = Cuadruplo('.', etiResultado1, '', 'label') #new_if = arbol.generarIF() arbol.agregarCuadruplo(cuad) return res
def regla3(self, pasada = 0): etiquetas = {} eliminadas = {} flag = False for etiqueta in self.etiquetas: if not etiqueta in eliminadas: etiquetas[etiqueta] = [] for i in range(len(self.etiquetas[etiqueta])): if flag: flag = False else: if self.etiquetas[etiqueta][i].op == "if": if 0 != len(etiquetas[etiqueta]): if i+1 < len(self.etiquetas[etiqueta]): if self.etiquetas[etiqueta][i+1].op == "goto": cuadruplo = etiquetas[etiqueta].pop() _if = self.etiquetas[etiqueta][i].result _if = _if.replace('L', 'if') goto_end = self.etiquetas[etiqueta][i+1] #generamos el nuevo if (negacion ) goto end new = self.generarIf(cuadruplo, goto_end.arg1) if not self.canChange(cuadruplo): etiquetas[etiqueta].append(cuadruplo) else: self.add(cuadruplo,3) if new: etiquetas[etiqueta].append(new) eliminadas[_if]=goto_end.arg1 #obtendria todas las instrucciones del if for item in self.etiquetas[_if]: etiquetas[etiqueta].append(item) flag = True continue elif pasada == 0: cuadruplo = etiquetas[etiqueta].pop() self.add(cuadruplo,3) new = Cuadruplo("if", "{0}{1}{2}".format( cuadruplo.arg1, cuadruplo.op, cuadruplo.arg2),"goto" ,self.etiquetas[etiqueta][i].result) etiquetas[etiqueta].append(new) continue etiquetas[etiqueta].append(self.etiquetas[etiqueta][i]) else: etiquetas[etiqueta] = [] #for cuadruplo in self.etiquetas[etiqueta]: #self.add(cuadruplo,3) #una vez terminado el proceso seguimos a eliminar las etiquetas que cambiaron for etiqueta in eliminadas: self.add(etiqueta + ":",3) try: etiqueta = etiqueta.replace('L', 'if') del etiquetas[etiqueta] except KeyError: pass #recorremos la lista de nuevo en busca de if y goto que puedan tener las etiquetas for salto in eliminadas: for etiqueta in etiquetas: for cuadruplo in etiquetas[etiqueta]: if cuadruplo.op == "if": if cuadruplo.result == salto: cuadruplo.result = eliminadas[salto] elif cuadruplo.op == "goto": if cuadruplo.arg1 == salto: cuadruplo.arg1 = eliminadas[salto] return etiquetas