Beispiel #1
0
    def ejecutar_3D(self, Tabla):

        novo = TablaDeSimbolos(Tabla)
        nombre_metodo = str(self.nombre)
        novo.nuevo_codigo_3d(nombre_metodo + ":")
        if self.nombre == "main":
            init = "$s0=array();#pila"
            Tabla.nuevo_codigo_3d(init)
            init = "$s1=array();#retorno"
            Tabla.nuevo_codigo_3d(init)
            init = "$sp=-1;#null ptr"
            Tabla.nuevo_codigo_3d(init)
            init = "$ra=-1;#null ptr"
            Tabla.nuevo_codigo_3d(init)
            init = "$v=0;#Ptr Retornos"
            Tabla.nuevo_codigo_3d(init)
            init = "$s2=array();"
            Tabla.nuevo_codigo_3d(init)
            init = "$sp1=-1;"
            Tabla.nuevo_codigo_3d(init)
            init = "$s3=array();"
            Tabla.nuevo_codigo_3d(init)
        if len(self.param) > 0:
            self.simular_pop(novo)

        self.cuerpo.ejecutar_3D(novo)
        Tabla.ultimo_redundante("goto retornos;")
Beispiel #2
0
    def ejecutar_3D(self, Tabla: TablaDeSimbolos):
        if self.paso_break is None:
            Tabla.nuevo_error("Error Break",
                              "Solo puede usarse en ciclos y switch", 0,
                              self.tupla)
            return

        Tabla.nuevo_codigo_3d("goto " + self.paso_break + ";")

        return "stopu"
Beispiel #3
0
    def ejecutar_3D(self, Tabla):
        temp = self.param.ejecutar_3D(Tabla)
        mi_eti = "out" + str(id(self))
        defa = None

        for cada in self.cuerpo_switch:
            cada.paso_continue = self.paso_continue
            cada.paso_break = mi_eti
            if cada.param is not None:
                novo = TablaDeSimbolos(Tabla)
                cada.ejecutar_3D(novo, temp, mi_eti)

            else:
                defa = cada

        novo = TablaDeSimbolos(Tabla)
        if defa is not None:
            defa.ejecutar_3D(novo, temp, mi_eti)
        Tabla.nuevo_codigo_3d(mi_eti + ":")
Beispiel #4
0
 def ejecutar_3D(self, Tabla:TablaDeSimbolos):
     novo_tempo=Temporal(None,0,Tabla.nuevo_correlativo())
     Tabla.nuevo_codigo_3d(novo_tempo.contenido+" = read();")
     return novo_tempo
Beispiel #5
0
    def ejecutar_3D(self, Tabla):
        novo = TablaDeSimbolos(Tabla)
        valor_exec = self.param.mi_tempo
        if valor_exec is None:
            valor_exec = self.param.ejecutar_3D(novo)
        if valor_exec.tipo != 0:
            novo.nuevo_error(
                "Error De Tipo",
                "solo se aceptan tipos enteros en la condicional del IF", 0,
                self.tupla)

        if self.cuerpo_no is None:
            self.cuerpo_si.paso_continue = self.paso_continue
            self.cuerpo_si.paso_break = self.paso_break
        else:
            self.cuerpo_si.paso_continue = self.paso_continue
            self.cuerpo_si.paso_break = self.paso_break
            self.cuerpo_no.paso_continue = self.paso_continue
            self.cuerpo_no.paso_break = self.paso_break

        if self.nombre_padre is None:
            nombre_if = "label" + str(id(self))

            if self.cuerpo_no is None:
                condicional = "if (!" + valor_exec.temp_str(
                ) + ") goto out" + nombre_if + " ;"
                Tabla.nuevo_codigo_3d(condicional)
                novo = TablaDeSimbolos(Tabla)
                self.cuerpo_si.ejecutar_3D(novo)
                condicional = "out" + nombre_if + ": "
                Tabla.nuevo_codigo_3d(condicional)
            else:
                condicional = "if (!" + valor_exec.temp_str(
                ) + ") goto out" + str(id(self.cuerpo_no)) + " ;"
                Tabla.nuevo_codigo_3d(condicional)
                novo = TablaDeSimbolos(Tabla)
                self.cuerpo_si.ejecutar_3D(novo)
                condicional = "goto out" + nombre_if + "; "
                Tabla.nuevo_codigo_3d(condicional)
                condicional = "out" + str(id(self.cuerpo_no)) + ": "
                Tabla.nuevo_codigo_3d(condicional)
                novo = TablaDeSimbolos(Tabla)
                self.cuerpo_no.nombre_padre = nombre_if
                self.cuerpo_no.ejecutar_3D(novo)
                condicional = "out" + nombre_if + ": "
                Tabla.nuevo_codigo_3d(condicional)
        else:
            nombre_if = "label" + str(id(self))
            if self.cuerpo_no is None:
                condicional = "if (!" + valor_exec.temp_str(
                ) + ") goto out" + self.nombre_padre + " ;"
                Tabla.nuevo_codigo_3d(condicional)
                novo = TablaDeSimbolos(Tabla)
                self.cuerpo_si.ejecutar_3D(novo)
            else:
                condicional = "if (!" + valor_exec.temp_str(
                ) + ") goto out" + str(id(self.cuerpo_no)) + " ;"
                Tabla.nuevo_codigo_3d(condicional)
                novo = TablaDeSimbolos(Tabla)
                self.cuerpo_si.ejecutar_3D(novo)
                condicional = "goto out" + self.nombre_padre + "; "
                Tabla.nuevo_codigo_3d(condicional)
                condicional = "out" + str(id(self.cuerpo_no)) + ": "
                Tabla.nuevo_codigo_3d(condicional)
                novo = TablaDeSimbolos(Tabla)
                self.cuerpo_no.nombre_padre = self.nombre_padre
                self.cuerpo_no.ejecutar_3D(novo)
Beispiel #6
0
 def ejecutar_3D(self, Tabla):
     novo = TablaDeSimbolos(Tabla)
     for each in self.lst_param:
         eti_temp=each.ejecutar_3D(novo).temp_str()
         inst="print( "+eti_temp+" );"
         novo.nuevo_codigo_3d(inst)
Beispiel #7
0
from Contenido.Analizadores.MinorCSintactico import analizar_ascendente
from Contenido.TablaDeSimbolos import TablaDeSimbolos

#cadena="int x=0; int a=0; do { a=a+x; x=x+1;  } while(x<4)"

rst=analizar_ascendente(cadena4)
tab = TablaDeSimbolos(None)
if rst is None :
    print("Error")
    #print(rst.str_arbol());
    rst.ejecutar_3D(tab)
    tab.terminar_codigo_3d()
    from Contenido.Optimo import Optimo
    Optm:Optimo = Optimo(tab.codigo_3d)
    lst_sal = Optm.codigo_optimizado()
    tab.imprimir_codigo_3d(lst_sal)


    #print(tab.codigo_3d)
    #tab.imprimir_temporales()


Beispiel #8
0
    def ejecutar_3D(self, Tabla):
        novo = TablaDeSimbolos(Tabla)
        nombre_ciclo = "label" + str(id(self))
        novo.nuevo_codigo_3d(nombre_ciclo + ":")
        valor_exec = self.param.mi_tempo

        self.cuerpo.paso_continue = nombre_ciclo
        self.cuerpo.paso_break = "out" + nombre_ciclo

        self.cuerpo.ejecutar_3D(novo)
        if valor_exec is None:
            valor_exec = self.param.ejecutar_3D(novo)

        if valor_exec.tipo != 0:
            novo.nuevo_error(
                "Error De Tipo",
                "solo se aceptan tipos enteros en la condicional del Do While",
                0, self.tupla)
        condicional = "if (" + valor_exec.temp_str(
        ) + " != 1) goto out" + nombre_ciclo + " ;"
        novo.nuevo_codigo_3d(condicional)
        novo.nuevo_codigo_3d("goto " + nombre_ciclo + ";")
        novo.nuevo_codigo_3d("out" + nombre_ciclo + ":")
from Contenido.LstInstruccion.Operacion.Logica import Or
from Contenido.LstInstruccion.Operacion.Logica import Xor
from Contenido.LstInstruccion.Operacion.Comparacion import Diferente
from Contenido.LstInstruccion.Operacion.Comparacion import Igual
from Contenido.LstInstruccion.Operacion.Comparacion import Mayor
from Contenido.LstInstruccion.Operacion.Comparacion import MayorIgual
from Contenido.LstInstruccion.Operacion.Comparacion import Menor
from Contenido.LstInstruccion.Operacion.Comparacion import MenorIgual
from Contenido.LstInstruccion.Operacion.ValorOperacion import Abs
from Contenido.LstInstruccion.Operacion.ValorOperacion import Read
from Contenido.LstInstruccion.Operacion.ValorOperacion import Array
from Contenido.LstInstruccion.Operacion.Cast import INT
from Contenido.LstInstruccion.Operacion.Cast import FLOAT
from Contenido.LstInstruccion.Operacion.Cast import CHAR

Ts = TablaDeSimbolos()
print("Nueva Tabla")


class Instruccion(ABC):
    tupla: () = (0, 0)

    def n_t(self, tupla: ()):
        self.tupla = tupla

    def determinar_tipo_funcion(self):
        return None

    def __init__(self, *args):
        pass
Beispiel #10
0
    def ejecutar_3D(self, Tabla):
        novo = TablaDeSimbolos(Tabla)
        lista_temp = []
        for each in self.lst_param:
            tempo: Temporal = each.ejecutar_3D(novo)

            each.pop_retorno(Tabla, tempo.contenido)

            param = Temporal(None, tempo.tipo, novo.nuevo_parametro())
            inst = param.param_str() + " = " + tempo.temp_str() + ";";
            lista_temp.append(inst)
            lista_temp.append("$sp = $sp + 1;")
            lista_temp.append("$s0[$sp] = " + param.param_str() + ";")
            # novo.nuevo_codigo_3d(inst)
            # novo.nuevo_codigo_3d("$sp = $sp + 1;")
            # novo.nuevo_codigo_3d("$s0[$sp] = "+param.param_str()+";")

        # for cada in Tabla.dic_temporales.items():
        # novo.nuevo_codigo_3d("$sp = $sp + 1;")
        # novo.nuevo_codigo_3d("$s0[$sp] = " + str(cada[1].contenido) + ";#push param")
        # novo.nuevo_codigo_3d("$s0[$sp] = $t2;#push param")
        novo.push_mi_alcance()

        for cada in lista_temp:
            novo.nuevo_codigo_3d(cada)

        novo.nuevo_codigo_3d("$ra = $ra + 1;")
        ra = novo.aumentar_retorno()
        novo.nuevo_codigo_3d("$s1[$ra] = " + str(ra) + " ;")

        novo.nuevo_codigo_3d("goto " + self.nombre_func + ";")
        novo.nuevo_codigo_3d("ra" + str(ra) + ":")
        novo.nuevo_codigo_3d("$ra = $ra - 1;")

        # for cada in Tabla.dic_temporales.items():
        # novo.nuevo_codigo_3d(str(cada[1].contenido) +" = $s0[$sp];#pop param")
        # novo.nuevo_codigo_3d("$t2 = $s0[$sp];#pop param")
        # novo.nuevo_codigo_3d("$sp = $sp - 1;")
        novo.pop_mi_alcance()

        corre = Tabla.nuevo_parametro()

        print("Implementar Tipo Del Retorno")

        Te = Temporal(None, 0, "v" + str(corre + 2))
        # Tabla.nuevo_temporal("$v"+str(corre+2),Te)
        return Te
Beispiel #11
0
    def ejecutar_3D(self, Tabla):
        novo = TablaDeSimbolos(Tabla)
        self.inst_inicio.ejecutar_3D(novo)
        nombre_ciclo = "label" + str(id(self))
        novo.nuevo_codigo_3d(nombre_ciclo + ":")
        valor_exec = self.comprobador.ejecutar_3D(novo)
        if valor_exec.tipo != 0:
            novo.nuevo_error(
                "Error De Tipo",
                "solo se aceptan tipos enteros en la condicional del FOR", 0,
                self.tupla)

        condicional = "if (" + valor_exec.temp_str(
        ) + " != 1) goto out" + nombre_ciclo + " ;"
        novo.nuevo_codigo_3d(condicional)

        self.cuerpo.paso_continue = nombre_ciclo
        self.cuerpo.paso_break = "out" + nombre_ciclo

        sal = self.cuerpo.ejecutar_3D(novo)
        if self.inst_cada is not None:
            if sal == "stopc":
                rest = novo.caso_continue()
                self.inst_cada.ejecutar_3D(novo)
                novo.nuevo_codigo_3d(rest)
            else:
                self.inst_cada.ejecutar_3D(novo)
                novo.nuevo_codigo_3d("goto " + nombre_ciclo + ";")

        novo.nuevo_codigo_3d("out" + nombre_ciclo + ":")
Beispiel #12
0
    def ejecutar_3D(self, Tabla: TablaDeSimbolos):
        novo_tempo = Temporal(None, 0, Tabla.nuevo_correlativo())
        rst_condi = self.condicion.ejecutar_3D(Tabla)
        mi_nombre = "label" + str(id(self))
        condicion = "if(!" + str(
            rst_condi.contenido) + ") goto " + mi_nombre + ";"
        if rst_condi.tipo != 0:
            Tabla.nuevo_error("error de tipo",
                              "la condicion debe ser de tipo entero", 0,
                              self.tupla)
        Tabla.nuevo_codigo_3d(condicion)
        tempo_si = self.val_true.ejecutar_3D(Tabla)
        condicion = novo_tempo.contenido + "=" + str(tempo_si.contenido) + ";"
        Tabla.nuevo_codigo_3d(condicion)
        condicion = "goto out" + mi_nombre + ";"
        Tabla.nuevo_codigo_3d(condicion)
        condicion = mi_nombre + ":"
        Tabla.nuevo_codigo_3d(condicion)
        tempo_no = self.val_false.ejecutar_3D(Tabla)
        condicion = novo_tempo.contenido + "=" + str(tempo_no.contenido) + ";"
        Tabla.nuevo_codigo_3d(condicion)
        condicion = "out" + mi_nombre + ":"
        Tabla.nuevo_codigo_3d(condicion)

        return novo_tempo