Пример #1
0
 def copy_propagation_optimization(self):
     actual = Quadruple()
     pivote = Quadruple()
     updated = False
     i = 0
     j = 0
     while i < len(self.fuente):
         pivote = self.fuente[i]
         updated = False
         if pivote.type == Quadruple.T_ASIG:
             j = i + 1
             while j < len(self.fuente):
                 actual = self.fuente[j]
                 # x = t
                 # t = x -> x = t
                 if actual.type == Quadruple.T_ASIG:
                     if (actual.resultado.id == pivote.Elem1.id
                             and actual.Elem1.id == pivote.resultado.id):
                         actual = pivote
                         updated = True
                         i += 1
                         j = len(self.fuente)
                     elif actual.Elem1.id == pivote.resultado.id:
                         actual.Elem1.id = pivote.Elem1.id
                         actual.operador = -1
                         actual.type = Quadruple.T_ASIG
                         del self.fuente[i]
                     else:
                         j = len(self.fuente)
                 j += 1
             if updated:
                 del self.fuente[i]
                 i -= 1
         i += 1
Пример #2
0
 def optimization_of_common_expressions(self):
     actual = Quadruple()
     pivote = Quadruple()
     i = 0
     j = 0
     while i < len(self.fuente):
         pivote = self.fuente[i]
         if pivote.type == Quadruple.T_ARITOP:
             j = i + 1
             while j < len(self.fuente):
                 actual = self.fuente[j]
                 if actual.type == Quadruple.T_ARITOP:
                     if (not (actual.resultado.id == pivote.resultado.id)
                             and
                             not (actual.resultado.id == pivote.Elem1.id)
                             and
                             not (actual.resultado.id == pivote.Elem2.id)):
                         if actual.operador == pivote.operador:
                             if ((actual.Elem1.id == pivote.Elem1.id) and
                                 (actual.Elem2.id == pivote.Elem2.id)) or (
                                     (actual.Elem1.id == pivote.Elem2.id)
                                     and
                                     (actual.Elem2.id == pivote.Elem1.id)):
                                 actual.Elem1 = pivote.resultado
                                 actual.Elem2 = None
                                 actual.operador = -1
                                 actual.type = Quadruple.T_ASIG
                                 actual.typeOpt = actual.typeOpt
                 else:
                     j = len(self.fuente)
                 j += 1
         i += 1
Пример #3
0
 def arithmetic_optimization(self):
     iterator = iter(self.fuente)
     actual = Quadruple()
     nuevo = Quadruple()
     while True:
         try:
             actual = next(iterator)
             nuevo = copy.deepcopy(actual)
             if actual.type == Quadruple.T_ARITOP:
                 if actual.operador == self.OP_DIVISION:
                     # x = y/1 -> x=y
                     if actual.Elem2.id == "1":
                         nuevo.operador = -1
                         nuevo.type = Quadruple.T_ASIG
                         nuevo.typeOpt = self.TOP_ARIT
                         self.registro.append("Linea: " + str(actual.line))
                         self.registro.append("Regla 15")
                         self.registro.append(actual.resultado.id + "=" +
                                              actual.Elem1.id + "/" +
                                              actual.Elem2.id + " -> " +
                                              nuevo.resultado.id + "=" +
                                              nuevo.Elem1.id)
                         nuevo.Elem2 = None
                     if actual.Elem1.id == "0":
                         nuevo.Elem1.id = "0"
                         nuevo.operador = -1
                         nuevo.type = Quadruple.T_ASIG
                         nuevo.typeOpt = self.TOP_ARIT
                         self.registro.append("Linea: " + str(actual.line))
                         self.registro.append("Regla 18")
                         self.registro.append(actual.resultado.id + "=" +
                                              actual.Elem1.id + "/" +
                                              actual.Elem2.id + " -> " +
                                              nuevo.resultado.id + "=" +
                                              nuevo.Elem1.id)
                         nuevo.Elem2 = None
                 elif actual.operador == self.OP_PRODUCTO:
                     # x=y*1
                     if actual.Elem2.id == "1":
                         nuevo.operador = -1
                         nuevo.type = Quadruple.T_ASIG
                         nuevo.typeOpt = self.TOP_ARIT
                         self.registro.append("Linea: " + str(actual.line))
                         self.registro.append("Regla 14")
                         self.registro.append(actual.resultado.id + "=" +
                                              actual.Elem1.id + "*" +
                                              actual.Elem2.id + " -> " +
                                              nuevo.resultado.id + "=" +
                                              nuevo.Elem1.id)
                         nuevo.Elem2 = None
                         # x=1*y
                     elif actual.Elem1.id == "1":
                         nuevo.Elem1 = nuevo.Elem2
                         nuevo.operador = -1
                         nuevo.type = Quadruple.T_ASIG
                         nuevo.typeOpt = self.TOP_ARIT
                         self.registro.append("Linea: " + str(actual.line))
                         self.registro.append("Regla 14")
                         self.registro.append(actual.resultado.id + "=" +
                                              actual.Elem1.id + "*" +
                                              actual.Elem2.id + " -> " +
                                              nuevo.resultado.id + "=" +
                                              nuevo.Elem1.id)
                         nuevo.Elem2 = None
                     # x=y*0 or 0*y
                     elif actual.Elem1.id == "0" or actual.Elem2.id == "0":
                         nuevo.Elem1.constructor1("0", Element.E_SCALAR)
                         nuevo.operador = -1
                         nuevo.type = Quadruple.T_ASIG
                         nuevo.typeOpt = self.TOP_ARIT
                         self.registro.append("Linea: " + str(actual.line))
                         self.registro.append("Regla 17")
                         self.registro.append(actual.resultado.id + "=" +
                                              actual.Elem1.id + "*" +
                                              actual.Elem2.id + " -> " +
                                              nuevo.resultado.id + "=" +
                                              nuevo.Elem1.id)
                         nuevo.Elem2 = None
                     # x=y*2=y+y or 2*y=y+y
                     elif actual.Elem1.id != actual.Elem2.id:
                         if actual.Elem1.id == "2":
                             if actual.Elem2.id.isalnum():
                                 nuevo.Elem1.constructor1(
                                     actual.Elem2.id, Element.E_SCALAR)
                                 nuevo.Elem2.constructor1(
                                     actual.Elem2.id, Element.E_SCALAR)
                                 nuevo.operador = 11
                                 nuevo.typeOpt = self.TOP_ARIT
                                 self.registro.append("Linea: " +
                                                      str(actual.line))
                                 self.registro.append("Regla 16")
                                 self.registro.append(actual.resultado.id +
                                                      "=" +
                                                      actual.Elem1.id +
                                                      "*" +
                                                      actual.Elem2.id +
                                                      " -> " +
                                                      nuevo.resultado.id +
                                                      "=" + nuevo.Elem1.id +
                                                      "+" + nuevo.Elem2.id)
                         elif actual.Elem2.id == "2":
                             if actual.Elem1.id.isalnum():
                                 nuevo.Elem1.constructor1(
                                     actual.Elem1.id, Element.E_SCALAR)
                                 nuevo.Elem2.constructor1(
                                     actual.Elem1.id, Element.E_SCALAR)
                                 nuevo.operador = 11
                                 nuevo.typeOpt = self.TOP_ARIT
                                 self.registro.append("Linea: " +
                                                      str(actual.line))
                                 self.registro.append("Regla 16")
                                 self.registro.append(actual.resultado.id +
                                                      "=" +
                                                      actual.Elem1.id +
                                                      "*" +
                                                      actual.Elem2.id +
                                                      " -> " +
                                                      nuevo.resultado.id +
                                                      "=" + nuevo.Elem1.id +
                                                      "+" + nuevo.Elem2.id)
                 elif actual.operador == self.OP_RESTA:
                     # x=y-0 -> x=y
                     if actual.Elem2.id == "0":
                         nuevo.operador = -1
                         nuevo.type = Quadruple.T_ASIG
                         nuevo.typeOpt = self.TOP_ARIT
                         self.registro.append("Linea: " + str(actual.line))
                         self.registro.append("Regla 13")
                         self.registro.append(actual.resultado.id + "=" +
                                              actual.Elem1.id + "-" +
                                              actual.Elem2.id + " -> " +
                                              nuevo.resultado.id + "=" +
                                              nuevo.Elem1.id)
                         nuevo.Elem2 = None
                     # x=0-y -> x=-y
                     elif actual.Elem1.id == "0":
                         nuevo.Elem1 = nuevo.Elem2
                         nuevo.Elem1.id = " - " + nuevo.Elem1.id
                         nuevo.operador = -1
                         nuevo.type = Quadruple.T_ASIG
                         nuevo.typeOpt = self.TOP_ARIT
                         self.registro.append("Linea: " + str(actual.line))
                         self.registro.append("Regla 13")
                         self.registro.append(actual.resultado.id + "=" +
                                              actual.Elem1.id + "-" +
                                              actual.Elem2.id + " -> " +
                                              nuevo.resultado.id + "=" +
                                              nuevo.Elem1.id)
                         nuevo.Elem2 = None
                 elif actual.operador == self.OP_SUMA:
                     # x=y+0 -> x=y
                     if actual.Elem2.id == "0":
                         nuevo.operador = -1
                         nuevo.type = Quadruple.T_ASIG
                         nuevo.typeOpt = self.TOP_ARIT
                         self.registro.append("Linea: " + str(actual.line))
                         self.registro.append("Regla 12")
                         self.registro.append(actual.resultado.id + "=" +
                                              actual.Elem1.id + "+" +
                                              actual.Elem2.id + " -> " +
                                              nuevo.resultado.id + "=" +
                                              nuevo.Elem1.id)
                         nuevo.Elem2 = None
                     # x=0+y -> x=y
                     elif actual.Elem1.id == "0":
                         nuevo.Elem1 = nuevo.Elem2
                         nuevo.operador = -1
                         nuevo.type = Quadruple.T_ASIG
                         nuevo.typeOpt = self.TOP_ARIT
                         self.registro.append("Linea: " + str(actual.line))
                         self.registro.append("Regla 12")
                         self.registro.append(actual.resultado.id + "=" +
                                              actual.Elem1.id + "+" +
                                              actual.Elem2.id + " -> " +
                                              nuevo.resultado.id + "=" +
                                              nuevo.Elem1.id)
                         nuevo.Elem2 = None
             self.sumidero.append(nuevo)
         except StopIteration:
             break
     self.fuente = self.sumidero
Пример #4
0
 def arithmetic_optimization(self):
     iterator = iter(self.fuente)
     actual = Quadruple()
     nuevo = Quadruple()
     while True:
         try:
             actual = next(iterator)
             nuevo = actual
             if actual.type == Quadruple.T_ARITOP:
                 if actual.operador == self.OP_DIVISION:
                     # x = y/1 -> x=y
                     if actual.Elem2.id == "1":
                         nuevo.Elem2 = None
                         nuevo.operador = -1
                         nuevo.type = Quadruple.T_ASIG
                         nuevo.typeOpt = self.TOP_ARIT
                     if actual.Elem1.id == "0":
                         nuevo.Elem1.id = "0"
                         nuevo.Elem2 = None
                         nuevo.operador = -1
                         nuevo.type = Quadruple.T_ASIG
                         nuevo.typeOpt = self.TOP_ARIT
                 elif actual.operador == self.OP_PRODUCTO:
                     # x=y*1
                     if actual.Elem2.id == "1":
                         nuevo.Elem2 = None
                         nuevo.operador = -1
                         nuevo.type = Quadruple.T_ASIG
                         nuevo.typeOpt = self.TOP_ARIT
                     # x=1*y
                     elif actual.Elem1.id == "1":
                         nuevo.Elem1 = nuevo.Elem2
                         nuevo.Elem2 = None
                         nuevo.operador = -1
                         nuevo.type = Quadruple.T_ASIG
                         nuevo.typeOpt = self.TOP_ARIT
                     # x=y*0 or 0*y
                     elif actual.Elem1.id == "0" or actual.Elem2.id == "0":
                         nuevo.Elem1.constructor1("0", Element.E_SCALAR)
                         nuevo.Elem2 = None
                         nuevo.operador = -1
                         nuevo.type = Quadruple.T_ASIG
                         nuevo.typeOpt = self.TOP_ARIT
                     # x=y*2=y+y or 2*y=y+y
                     elif actual.Elem1.id != actual.Elem2.id:
                         if actual.Elem1.id == "2":
                             if actual.Elem2.id.isalnum():
                                 nuevo.Elem1.constructor1(
                                     actual.Elem2.id, Element.E_SCALAR)
                                 nuevo.Elem2.constructor1(
                                     actual.Elem2.id, Element.E_SCALAR)
                                 nuevo.operador = 11
                                 nuevo.typeOpt = self.TOP_ARIT
                         elif actual.Elem2.id == "2":
                             if actual.Elem1.id.isalnum():
                                 nuevo.Elem1.constructor1(
                                     actual.Elem1.id, Element.E_SCALAR)
                                 nuevo.Elem2.constructor1(
                                     actual.Elem1.id, Element.E_SCALAR)
                                 nuevo.operador = 11
                                 nuevo.typeOpt = self.TOP_ARIT
                 elif actual.operador == self.OP_RESTA:
                     # x=y-0 -> x=y
                     if actual.Elem2.id == "0":
                         nuevo.Elem2 = None
                         nuevo.operador = -1
                         nuevo.type = Quadruple.T_ASIG
                         nuevo.typeOpt = self.TOP_ARIT
                     # x=0-y -> x=-y
                     elif actual.Elem1.id == "0":
                         nuevo.Elem1 = nuevo.Elem2
                         nuevo.Elem1.id = " - " + nuevo.Elem1.id
                         nuevo.Elem2 = None
                         nuevo.operador = -1
                         nuevo.type = Quadruple.T_ASIG
                         nuevo.typeOpt = self.TOP_ARIT
                 elif actual.operador == self.OP_SUMA:
                     # x=y+0 -> x=y
                     if actual.Elem2.id == "0":
                         nuevo.Elem2 = None
                         nuevo.operador = -1
                         nuevo.type = Quadruple.T_ASIG
                         nuevo.typeOpt = self.TOP_ARIT
                     # x=0+y -> x=y
                     elif actual.Elem1.id == "0":
                         nuevo.Elem1 = nuevo.Elem2
                         nuevo.Elem2 = None
                         nuevo.operador = -1
                         nuevo.type = Quadruple.T_ASIG
                         nuevo.typeOpt = self.TOP_ARIT
             self.sumidero.append(nuevo)
         except StopIteration:
             break
     self.fuente = self.sumidero