Exemple #1
0
 def addIF(self, op1, gt, line, tab=True):
     new = Quadruple()
     elem1 = Element()
     elem1.constructor1(op1, Element.E_SCALAR)
     elem2 = Element()
     elem2.constructor1(gt, Element.E_GOTO)
     new.constructor_1(elem1, None, elem2, None, Quadruple.T_IF, line, tab)
     self.fuente.append(new)
Exemple #2
0
 def addGoto_CASE(self, cadena, line, tab=True):
     new = Quadruple()
     elem1 = Element()
     elem1.constructor1(cadena, Element.E_GOTO)
     new.constructor_1(None, None, elem1, -1, Quadruple.T_GOTO_CASE, line,
                       tab)
     self.fuente.append(new)
     return len(self.fuente)
Exemple #3
0
 def addScalarAsig(self, dest, src, line, tab):
     new = Quadruple()
     elem1 = Element()
     elem1.constructor1(src, Element.E_SCALAR)
     elem2 = Element()
     elem2.constructor1(dest, Element.E_SCALAR)
     new.constructor_1(elem1, None, elem2, -1, Quadruple.T_ASIG, line, tab)
     self.fuente.append(new)
Exemple #4
0
 def optimization_by_jump_goto(self):
     actual = Quadruple()
     pivote = Quadruple()
     i = 0
     j = 0
     while i < len(self.fuente):
         pivote = self.fuente[i]
         if pivote.type == Quadruple.T_GOTO:
             j = i + 1
             while j < len(self.fuente):
                 actual = self.fuente[j]
                 # goto .label
                 # codigo inalcanzable
                 # label .label -> label .label
                 if actual.type == Quadruple.T_LABEL:
                     if pivote.resultado.id == actual.resultado.id:
                         self.registro.append(
                             "---------------------------------------------"
                         )
                         self.registro.append("Regla 2")
                         p = i
                         while p < j:
                             self.registro.append(str(self.fuente[i]))
                             del self.fuente[i]
                             p += 1
                         self.registro.append(
                             str(actual) + "-> " + str(actual))
                         j = len(self.fuente)
                     else:
                         j = len(self.fuente)
                 elif actual.type == Quadruple.T_LABEL_CASE:
                     j = len(self.fuente)
                 elif actual.type == Quadruple.T_GOTO:
                     # goto .label
                     # goto .label -> goto.label
                     if pivote.resultado.id == actual.resultado.id:
                         self.registro.append(
                             "---------------------------------------------"
                         )
                         self.registro.append(str(pivote))
                         self.registro.append(str(actual))
                         self.registro.append("-> " + str(actual))
                         del self.fuente[i]
                         i += 1
                     # goto .label1
                     # goto .label -> goto.label1
                     else:
                         self.registro.append(
                             "---------------------------------------------"
                         )
                         self.registro.append(str(pivote))
                         self.registro.append(str(actual))
                         self.registro.append("-> " + str(pivote))
                         del self.fuente[j]
                 j += 1
         i += 1
Exemple #5
0
 def addAritOp(self, dest, op1, op2, op, line):
     new = Quadruple()
     elem1 = Element()
     elem1.constructor1(op1, Element.E_SCALAR)
     elem2 = Element()
     elem2.constructor1(op2, Element.E_GOTO)
     elem3 = Element()
     elem3.constructor1(dest, Element.E_SCALAR)
     new.constructor_1(elem1, elem2, elem3, op, Quadruple.T_ARITOP, line)
     self.fuente.append(new)
Exemple #6
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
Exemple #7
0
 def optimization_by_jump_label(self):
     actual = Quadruple()
     pivote = Quadruple()
     i = 0
     while i < len(self.fuente):
         pivote = self.fuente[i]
         # label .label
         # goto .label -> goto.label
         if pivote.type == Quadruple.T_LABEL:
             if i + 1 < len(self.fuente):
                 actual = self.fuente[i + 1]
                 if actual.type == Quadruple.T_GOTO:
                     del self.fuente[i]
         i += 1
Exemple #8
0
    def optimization_if_jump(self):
        pivote = Quadruple()
        i = 0
        while i < len(self.fuente):
            pivote = self.fuente[i]
            # if expBoll goto .label1          if !expBoll goto .label2
            # goto .label2                       instrucciones
            # label .label1                      label .label2
            # instrucciones
            # label .label2
            if pivote.type == Quadruple.T_IF:
                pivote.Elem1.id = "not " + pivote.Elem1.id
                pivote.resultado = self.fuente[i + 1].resultado
                del self.fuente[i + 1]
                del self.fuente[i + 1]

            i += 1
Exemple #9
0
 def optimization_elimination_of_redundant(self):
     actual = Quadruple()
     i = 0
     while i < len(self.fuente):
         actual = self.fuente[i]
         # t = t -> eliminacion
         if actual.type == Quadruple.T_ASIG:
             if actual.resultado.id == actual.Elem1.id:
                 del self.fuente[i]
         i += 1
Exemple #10
0
 def generatedOutput(self):
     iterator = iter(self.fuente)
     actual = Quadruple()
     cod = ""
     while True:
         try:
             actual = next(iterator)
             cod += (str(actual)) + "\n"
         except StopIteration:
             break
     return cod
Exemple #11
0
 def optimization_by_jump_label(self):
     actual = Quadruple()
     pivote = Quadruple()
     i = 0
     while i < len(self.fuente):
         pivote = self.fuente[i]
         # label .label
         # goto .label -> goto.label
         if pivote.type == Quadruple.T_LABEL:
             if i + 1 < len(self.fuente):
                 actual = self.fuente[i + 1]
                 if actual.type == Quadruple.T_GOTO:
                     self.registro.append("Linea: " + str(actual.line))
                     self.registro.append("Regla 7")
                     self.registro.append(str(pivote))
                     self.registro.append(str(actual))
                     self.registro.append("-> " + str(actual))
                     del self.fuente[i]
                     i -= 1
         i += 1
Exemple #12
0
 def optimization_if_jump(self):
     pivote = Quadruple()
     i = 0
     while i < len(self.fuente):
         pivote = self.fuente[i]
         # if expBoll goto .label1          if !expBoll goto .label2
         # goto .label2                       instrucciones
         # label .label1                      label .label2
         # instrucciones
         # label .label2
         if pivote.type == Quadruple.T_IF:
             self.registro.append("Linea: " + str(pivote.line))
             self.registro.append("Regla 3")
             self.registro.append(str(pivote))
             self.registro.append(str(self.fuente[i + 1]))
             self.registro.append(str(self.fuente[i + 2]))
             pivote.Elem1.id = "not " + pivote.Elem1.id
             pivote.resultado = self.fuente[i + 1].resultado
             self.registro.append("->" + str(pivote))
             del self.fuente[i + 1]
             del self.fuente[i + 1]
         i += 2
Exemple #13
0
 def optimization_elimination_of_redundant(self):
     actual = Quadruple()
     i = 0
     while i < len(self.fuente):
         actual = self.fuente[i]
         # t = t -> eliminacion
         if actual.type == Quadruple.T_ASIG:
             if actual.resultado.id == actual.Elem1.id:
                 self.registro.append("Linea: " + str(actual.line))
                 self.registro.append("Regla 8 - 11")
                 self.registro.append(actual.resultado.id + "=" +
                                      actual.Elem1.id + " -> Eliminacion")
                 del self.fuente[i]
                 i -= 1
         i += 1
Exemple #14
0
 def addGoto_IF(self, cadena, line, index, tab=True):
     new = Quadruple()
     elem1 = Element()
     elem1.constructor1(cadena, Element.E_GOTO)
     new.constructor_1(None, None, elem1, -1, Quadruple.T_GOTO, line, tab)
     self.fuente[index] = new
Exemple #15
0
 def addLabel(self, cadena, line, tab=True):
     new = Quadruple()
     elem1 = Element()
     elem1.constructor1(cadena, Element.E_LABEL)
     new.constructor_1(None, None, elem1, -1, Quadruple.T_LABEL, line, tab)
     self.fuente.append(new)
Exemple #16
0
 def addIgnoreString(self, cadena, line, tab):
     new = Quadruple()
     elem1 = Element()
     elem1.constructor1(cadena, -1)
     new.constructor_1(elem1, None, None, -1, Quadruple.T_IGNORE, line, tab)
     self.fuente.append(new)
Exemple #17
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
Exemple #18
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