예제 #1
0
    def compile(self, environment):
        database_id = SymbolTable().useDatabase
        #ejecutando si hay llamada a alguna funcion
        temps_array = []
        for value in self.arr_values:
            if isinstance(value, Funcion):
                temps_array.append(value.compile(environment))
        new_val = putVarValues(self._tac, temps_array, environment)

        temp = ''

        if new_val == self._tac: #Es un temporal --- quitar comillas

            temp = ThreeAddressCode().newTemp()

            if database_id is not None:
                ThreeAddressCode().addCode(f"{temp} = \"USE {database_id}; {new_val}\"")
            else:
                ThreeAddressCode().addCode(f"{temp} = \"{new_val}\"")
        else:
            temp = new_val

                    #LLAMANDO A FUNCION PARA ANALIZAR ESTA COCHINADA
        temp1 = ThreeAddressCode().newTemp()
        ThreeAddressCode().addCode(f"{temp1} = parse({temp})")
        return temp1
예제 #2
0
    def compile(self, environment):
        value1 = self.value1.compile(environment)
        value2 = self.value2.compile(environment)
        if isinstance(value1, PrimitiveData):
            if value1.data_type == DATA_TYPE.STRING:
                value1.value = f"\'{value1.value}\'"
        if isinstance(value1, PrimitiveData):
            if value2.data_type == DATA_TYPE.STRING:
                value2.value = f"\'{value2.value}\'"
        try:
            temporal = ThreeAddressCode().newTemp()
            ThreeAddressCode().addCode(
                f"{temporal} = {value1.value} {getOperador(self.operator)} {value2.value}"
            )

            return PrimitiveData(DATA_TYPE.NUMBER, temporal, self.line,
                                 self.column)
        except TypeError:
            desc = "Error de tipo"
            ErrorController().add(34, 'Execution', desc, self.line,
                                  self.column)
        except:
            desc = "FATAL ERROR, Relop, no acepta ids"
            ErrorController().add(34, 'Execution', desc, self.line,
                                  self.column)
예제 #3
0
 def compile(self, enviroment):
     temp = ThreeAddressCode().newTemp()
     ThreeAddressCode().addCode(f"{temp} = '{self._tac}'")
     #LLAMANDO A FUNCION PARA ANALIZAR ESTA COCHINADA
     temp1 = ThreeAddressCode().newTemp()
     ThreeAddressCode().addCode(f"{temp1} = parse({temp})")
     return temp1
예제 #4
0
    def compile(self, environment: Ambito):
        var_search = environment.getVar(self.id)
        val = self.value.compile(environment)

        if var_search == None:
            print("VARIABLE NO DECLARADA " + self.id)
            return

        if isinstance(self.value, ObjectReference):  #Buscar variable
            val = self.value.compile(environment)
            if isinstance(val, PrimitiveData):
                ThreeAddressCode().addCode(
                    f"Stack[{var_search.position}] = {val.alias}")
                return

            val = environment.getVar(val)
            if val is None:
                print("VARIABLE NO DECLARADA")
                return

            position = val.position
            temporal = ThreeAddressCode().newTemp()
            ThreeAddressCode().addCode(f"{temporal} = Stack[{position}]")
            ThreeAddressCode().addCode(
                f"Stack[{var_search.position}] = {temporal}")
        else:
            ThreeAddressCode().addCode(
                f"Stack[{var_search.position}] = {val.value}")
예제 #5
0
    def compile(self, expression):
        expression1 = self.value.compile(expression)
        type_unary_or_other = self.sign
        temporal = ThreeAddressCode().newTemp()

        try:
            if expression1.data_type != DATA_TYPE.NUMBER:
                print('error')
                return
            dataTemp = f"{temporal} = 0"

            if type_unary_or_other == SymbolsUnaryOrOthers.UMINUS or type_unary_or_other == SymbolsUnaryOrOthers.BITWISE_NOT:
                dataTemp = f"{temporal} = -{expression1.value}"

            elif type_unary_or_other == SymbolsUnaryOrOthers.UPLUS:
                dataTemp = f"{temporal} = {expression1.value}"

            elif type_unary_or_other == SymbolsUnaryOrOthers.SQUARE_ROOT:
                dataTemp = f"{temporal} = sqrt({expression1.value})  # |/"

            elif type_unary_or_other == SymbolsUnaryOrOthers.CUBE_ROOT:
                temporal1 = ThreeAddressCode().newTemp()
                ThreeAddressCode().addCode(f"{temporal1} = 1 / 3")
                dataTemp = f"{temporal} = {expression1.value} ** {temporal1} # ||/"

            ThreeAddressCode().addCode(dataTemp)
            return PrimitiveData(DATA_TYPE.NUMBER, temporal, self.line,
                                 self.column)
        except:
            desc = "FATAL ERROR --- UnaryOrSquareExpressions"
            ErrorController().add(34, 'Execution', desc, self.line,
                                  self.column)
예제 #6
0
    def compile(self, environment):
        try:
            temp = ThreeAddressCode().newTemp()
            val = self.value.compile(environment).value
            dataTemp = f"{temp} = '{val}'"

            cambio = False
            if val[0] == 't':
                sub = val[1:]
                if sub.isnumeric():  # ES UN TEMPORAL
                    dataTemp = f"{temp} = {val}"
                    cambio = True
            if cambio is False:
                dataTemp = f"{temp} = '{val}'"

            ThreeAddressCode().addCode(dataTemp)
            temporal = ThreeAddressCode().newTemp()
            ThreeAddressCode().addCode(
                f"{temporal} = sha256({temp}.encode()).hexdigest()")
            return PrimitiveData(DATA_TYPE.STRING, temporal, self.line,
                                 self.column)
        except:
            desc = "FATAL ERROR --- StringFuncs"
            ErrorController().add(34, 'Execution', desc, self.line,
                                  self.column)
예제 #7
0
 def compile(self, instrucction):
     temp = ThreeAddressCode().newTemp()
     ThreeAddressCode().addCode(f"{temp} = '{self._tac}'")
     #LLAMANDO A FUNCION PARA ANALIZAR
     temp1 = ThreeAddressCode().newTemp()
     ThreeAddressCode().addCode(f"{temp1} = parse({temp})")
     return temp1
예제 #8
0
    def setVariables(self, var_array, environment):
        if self.isCall:
            value = 0
            for index, var in enumerate(var_array):
                value = self.params[index].compile(environment)

                if isinstance(value, PrimitiveData):
                    if value.data_type == DATA_TYPE.STRING:
                        if value.value[0] == "'" or value.value[0] == "\"":
                            value.value = f"\"{value.value}\""
                        else:
                            value.value = f"\"\'{value.value}\'\""

                ThreeAddressCode().addCode(
                    f"Stack[{var.position}] = {value.value}")

            temp = ThreeAddressCode().newTemp()

            #Llamando a la funcion
            ThreeAddressCode().addCode(f"{self.id}()")
            #Obteniendo el valor de retorno de la funcion
            ThreeAddressCode().addCode("#Obteniendo valor de retorno--------")
            ThreeAddressCode().addCode(f"{temp} = Stack[P]")
            return temp
        return None
예제 #9
0
    def generar_tac(self):
        global report_error
        global report_ast

        DataWindow().clearConsole()
        SymbolTable().destroy()
        ThreeAddressCode().destroy()

        texto = self.entrada.get('1.0', END)
        result = parse(texto)
        print(result)  # Imprime el AST
        report_error = ReportError()

        if len(ErrorController().getList()) > 0:
            messagebox.showerror('ERRORES', 'Se encontraron errores')
        else:

            ambito = Ambito(None)
            for inst in result:
                inst.compile(ambito)

            DataWindow().consoleText(ThreeAddressCode().getCode())
            ThreeAddressCode().writeFile()

            result2 = parse2(texto)  #AST GRAFICO
            report_ast = result2
예제 #10
0
 def compile(self, instrucction):
     temp = ThreeAddressCode().newTemp()
     database_id = SymbolTable().useDatabase
     if database_id is not None:
         ThreeAddressCode().addCode(
             f"{temp} = \"USE {database_id}; {self._tac}\"")
     else:
         ThreeAddressCode().addCode(f"{temp} = \"{self._tac}\"")
예제 #11
0
 def compile(self, environment):
     val = self.value.compile(environment)
     pos = ThreeAddressCode().stackCounter
     environment.addVar(self.id, self.data_type, val.value, pos, self.line, self.column)
     temp = ThreeAddressCode().newTemp()
     ThreeAddressCode().addCode(f"{temp} = {val.value}")
     ThreeAddressCode().addStack(temp)
     # ThreeAddressCode().addCode(f"print(Stack)")
     print("ANDO POR AQUI")
예제 #12
0
    def compile(self, environment):
        value1 = self.value1.compile(environment)
        value2 = self.value2.compile(environment)
        operator = self.operator

        temporal = ThreeAddressCode().newTemp()
        ThreeAddressCode().addCode(
            f"{temporal} = {value1.value} {operator} {value2.value}")
        return PrimitiveData(DATA_TYPE.BOOLEANO, temporal, self.line,
                             self.column)
예제 #13
0
파일: funcion.py 프로젝트: AllVides/tytus
 def compile(self, environment):
     newAmbito = Ambito(environment)
     pos = 0
     for var in self.params:
         pos = ThreeAddressCode().stackCounter
         newAmbito.addVar(var.id, var.data_type, None, pos, var.line, var.column)
     lbl_exit = ThreeAddressCode().newLabel()
     self.body.compile(newAmbito)
     
     ThreeAddressCode().addCode(f"label .{lbl_exit}") #Agregando etiqueta
     ThreeAddressCode().addCode(f"print(\"GraciasDios, SALI\")")
예제 #14
0
 def compile(self, environment):
     #CREANDO C3D
     temp = ThreeAddressCode().newTemp()
     database_id = SymbolTable().useDatabase
     if database_id is not None:
         ThreeAddressCode().addCode(f"{temp} = \"USE {database_id}; {self._tac}\"")
     else:
         ThreeAddressCode().addCode(f"{temp} = \"{self._tac}\"")
     #LLAMANDO A FUNCION PARA ANALIZAR ESTA COCHINADA
     temp1 = ThreeAddressCode().newTemp()
     ThreeAddressCode().addCode(f"{temp1} = parse({temp})")
예제 #15
0
파일: clases.py 프로젝트: sandymerida/tytus
    def compile(self, environment):
        if self.val_return is not None:
            value = self.val_return.compile(environment)
            pos = ThreeAddressCode().stackCounter
            #Metiendo el valor a retornar al Stack
            ThreeAddressCode().addStack(value.value)
            ThreeAddressCode().addCode(f"P = {pos}")

        #Poniendo salto incondicional
        lbl_return = environment.getReturn()
        ThreeAddressCode().addCode(f"goto .{lbl_return}")
예제 #16
0
 def compile(self, environment):
     try:
         temp = ThreeAddressCode().newTemp()
         val = self.value.compile(environment).value
         dataTemp = f"{temp} = '{val}'"
         ThreeAddressCode().addCode(dataTemp)
         temporal = ThreeAddressCode().newTemp()
         ThreeAddressCode().addCode(f"{temporal} = {temp}.strip()")
         return temporal
     except:
         desc = "FATAL ERROR --- StringFuncs"
         ErrorController().add(34, 'Execution', desc, self.line,
                               self.column)
예제 #17
0
    def compile(self, environment):
        try:
            i = self.down.compile(environment).value
            j = self.up.compile(environment).value
            temp = ThreeAddressCode().newTemp()
            val = self.value.compile(environment).value
            dataTemp = f"{temp} = '{val}'"

            cambio = False
            if val[0] == 't':
                sub = val[1:]
                if sub.isnumeric():  # ES UN TEMPORAL
                    dataTemp = f"{temp} = {val}"
                    cambio = True
            if cambio is False:
                dataTemp = f"{temp} = '{val}'"

            tempi = ThreeAddressCode().newTemp()
            tempj = ThreeAddressCode().newTemp()
            dataTempi = f"{tempi} = {i}"
            dataTempj = f"{tempj} = {j}"
            ThreeAddressCode().addCode(dataTemp)
            ThreeAddressCode().addCode(dataTempi)
            ThreeAddressCode().addCode(dataTempj)
            temporal = ThreeAddressCode().newTemp()
            ThreeAddressCode().addCode(f"{temporal} = {temp}[{tempi}:{tempj}]")
            return PrimitiveData(DATA_TYPE.STRING, temporal, self.line,
                                 self.column)
        except:
            desc = "FATAL ERROR --- StringFuncs"
            ErrorController().add(34, 'Execution', desc, self.line,
                                  self.column)
예제 #18
0
    def compile(self, enviroment):
        temp = ThreeAddressCode().newTemp()
        ThreeAddressCode().addCode(f"{temp} = '{self._tac}'")
        #LLAMANDO A FUNCION PARA ANALIZAR ESTA COCHINADA
        temp1 = ThreeAddressCode().newTemp()
        ThreeAddressCode().addCode(f"{temp1} = parse({temp})")
        return temp1

        try:
            pass
        except:
            desc = f": Name of Index not Exists"
            ErrorController().add(4, 'Execution', desc, self.line,
                                  self.column)  #manejar linea y columna
예제 #19
0
 def compile(self, environment):
     try:
         temp = ThreeAddressCode().newTemp()
         val = self.value.compile(environment).value
         dataTemp = f"{temp} = '{val}'"
         ThreeAddressCode().addCode(dataTemp)
         temporal = ThreeAddressCode().newTemp()
         ThreeAddressCode().addCode(f"{temporal} = len({temp})")
         return PrimitiveData(DATA_TYPE.STRING, temporal, self.line,
                              self.column)
     except:
         desc = "FATAL ERROR --- StringFuncs"
         ErrorController().add(34, 'Execution', desc, self.line,
                               self.column)
예제 #20
0
    def print(self, environment):
        if ThreeAddressCode().searchFunction(self.id):
            return None

        ThreeAddressCode().newFunction(self.id)
        newAmbito = Ambito(environment)
        pos = 0
        var_array = []
        for var in self.params:
            pos = ThreeAddressCode().stackCounter
            var_array.append(newAmbito.addVar(var.id, var.data_type, None,
                                              pos, var.line, var.column))
            ThreeAddressCode().incStackCounter()

        pos = ThreeAddressCode().stackCounter
        #Generando etiqueta de salida para la funcion
        lbl_exit = ThreeAddressCode().newLabel()
        newAmbito.lbl_return = lbl_exit

        #Agregando cuerpo de la funcion
        self.body.compile(newAmbito)
        # Agregando etiqueta de salida
        ThreeAddressCode().addCode(f"label .{lbl_exit}")  
        # Imprime primera variable declarada, NO parametro
        # ThreeAddressCode().addCode(f"print(Stack[{pos}])")

        ThreeAddressCode().createFunction(self.id, self.params, var_array)
        return var_array
예제 #21
0
    def compile(self, environment):
        name_column = self.name_column.compile(environment)
        name_column = name_column.value
        value1 = self.value1.compile(environment).value
        value2 = self.value2.compile(environment).value
        data = ""
        try:
            temporal = ThreeAddressCode().newTemp()
            ThreeAddressCode().addCode(
                f"{temporal} = {str(value1)} <= {name_column}")
            temporal1 = ThreeAddressCode().newTemp()
            ThreeAddressCode().addCode(
                f"{temporal1} = {name_column} <= {str(value2)}")
            temporal2 = ThreeAddressCode().newTemp()
            ThreeAddressCode().addCode(
                f"{temporal2} = {temporal} and {temporal1}")

            if self.opt_not:
                temporal3 = ThreeAddressCode().newTemp()
                ThreeAddressCode().addCode(f"{temporal3} = ~({temporal2})")
                return PrimitiveData(DATA_TYPE.STRING, temporal3, 0, 0)

            return PrimitiveData(DATA_TYPE.STRING, temporal2, 0, 0)
        except:
            desc = "FATAL ERROR, murio en Between, F"
            ErrorController().add(34, 'Execution', desc, self.line,
                                  self.column)
예제 #22
0
파일: shared.py 프로젝트: Sohanyuuu/tytus
    def compile(self, environment):
        val = self.reference_column.compile(environment)
        if isinstance(val, PrimitiveData):
            return val

        val = environment.getVar(val)

        if val is None:
            print("VARIABLE NO DECLARADA")
            return None

        position = val.position
        temporal = ThreeAddressCode().newTemp()
        ThreeAddressCode().addCode(f"{temporal} = Stack[{position}]")
        return PrimitiveData(None, temporal, 0, 0)
예제 #23
0
    def setVariables(self, var_array, environment):
        if self.isCall:
            value = 0
            for index, var in enumerate(var_array):
                value = self.params[index].compile(environment)

                if isinstance(value, PrimitiveData):
                    if value.data_type == DATA_TYPE.STRING:
                        value.value = f"\'{value.value}\'"

                ThreeAddressCode().addCode(f"Stack[{var.position}] = {value.value}")
            
            #Llamando a la funcion
            ThreeAddressCode().addCode(f"{self.id}()")
            #Una procedimiento almacenado NO devuelve nada
예제 #24
0
    def setVariables(self, var_array, environment):
        if self.isCall:
            value = 0
            print(type(self.params[0]))
            for index, var in enumerate(var_array):
                value = self.params[index].compile(environment)
                if isinstance(value, PrimitiveData):
                    if value.data_type == DATA_TYPE.STRING:
                        value.value = f"\'{value.value}\'"
                ThreeAddressCode().addCode(
                    f"Stack[{var.position}] = {value.value}")

                temp = ThreeAddressCode().newTemp()
                ThreeAddressCode().addCode("#Retornando valor --------")
                ThreeAddressCode().addCode(f"{temp} = Stack[P]")
예제 #25
0
    def ejecutar_sql(self):
        global report_error
        global report_ast

        DataWindow().clearConsole()
        SymbolTable().destroy()
        ThreeAddressCode().destroy()

        texto = self.entrada.get('1.0', END)
        result = parse(texto)
        # jsonStr = json.dumps(result, default=lambda o: o.__dict__) #Convierte el AST a formato JSON para poder saber como se esta formando
        # print(result)  # Imprime el AST

        report_error = ReportError()
        if len(ErrorController().getList()) > 0:
            messagebox.showerror('ERRORES', 'Se encontraron errores')
        else:
            result2 = parse2(texto)
            report_ast = result2

            # ---------- TEST ---------
            for inst in result:
                # esto es por los select anidados (subquerys), no encontre otra menera
                # de retornar la tabla dibujada, lo hacia en mi clase
                # pero si lo dejaba ahi me tronaban las subquery,
                # prueben que no les de problema
                if isinstance(inst, Select):
                    result = inst.process(0)
                    if isinstance(result, DataFrame):
                        DataWindow().consoleText(format_df(result))
                    elif isinstance(result, list):
                        DataWindow().consoleText(format_table_list(result))
                else:
                    inst.process(0)
예제 #26
0
    def compile(self, environment):
        val = self.reference_column.compile(environment)
        if isinstance(val, PrimitiveData):
            return val

        temp_val = val
        val = environment.getVar(val)

        if val is None:
            ErrorController().add(33, 'Execution',
                                  f"VARIABLE {temp_val} NO DECLARADA", 0, 0)
            return None

        position = val.position
        temporal = ThreeAddressCode().newTemp()
        ThreeAddressCode().addCode(f"{temporal} = Stack[{position}]")
        return PrimitiveData(None, temporal, 0, 0)
예제 #27
0
 def compile(self, environment):
     val = None
     if self.value is not None:
         val = self.value.compile(environment)
     if isinstance(val, PrimitiveData):
         if val.data_type == DATA_TYPE.STRING:
             val.value = f"'{val.value}'"
     pos = ThreeAddressCode().stackCounter
     if val is not None:
         environment.addVar(self.id, self.data_type, val.value, pos,
                            self.line, self.column)
         temp = ThreeAddressCode().newTemp()
         ThreeAddressCode().addCode(f"{temp} = {val.value}")
         ThreeAddressCode().addStack(temp)
     else:
         environment.addVar(self.id, self.data_type, None, pos, self.line,
                            self.column)
예제 #28
0
    def compile(self, environment):
        params = len(self.params)
        if self.isNew:
            self.environment = environment  # TODO verificar
            if Procedures().saveProcedure(self.id, self, self.line, self.column):
                var_array = self.print(environment)
                self.setVariables(var_array, environment)
        else:
            var_array = Procedures().getProcedure(self.id, params, self.line, self.column)
            if var_array:
                self.setVariables(var_array, environment)

            fun = ThreeAddressCode().searchFunction(self.id)
            if fun:
                if len(self.params) > 0:
                    self.setVariables(fun['variables'], environment)
                #temp = ThreeAddressCode().newTemp()
                ThreeAddressCode().addCode(f"{self.id}()")
예제 #29
0
def cambiarVariable(func, entry_lower, diccionario: dict):
    newString = ''  #viendo nada mas como queda armado
    if func in entry_lower:
        #separando string
        split = entry_lower.split(func, 1)
        temp = None
        try:
            temp = diccionario[func]
            newValue = temp
        except:
            return
        temp_ant = ''
        for idx, val in enumerate(split):
            #Quitando parametros
            if (idx < len(split) - 1):
                temp_ant = temp
                temp = ThreeAddressCode().newTemp()
                keys = diccionario.keys()
                split2 = []
                for key in keys:
                    if key in val:
                        split2 = val.split(key)
                        val = split2[(len(split2) - 1)]
                # newValue = temp
                #METIENDO COMILLAS
                ThreeAddressCode().addCode(
                    f"{temp} = \"{val}\" + str({temp_ant})")

            newString += f"{val}"
        if len(split) > 1:
            print("val", val)
            contiene_reemplazo = True
            funciones = diccionario.keys()

            for func3 in funciones:
                if func3 in val:
                    contiene_reemplazo = False
                    break
            if contiene_reemplazo:
                temp = ThreeAddressCode().newTemp()
                ThreeAddressCode().addCode(f"{temp} = \"{val}\"")
            return cambiarVariable(func, val, diccionario)

    return
예제 #30
0
    def compile(self, environment):
        value1 = self.value1.compile(environment)
        value2 = self.value2.compile(environment)
        try:
            temporal = ThreeAddressCode().newTemp()
            ThreeAddressCode().addCode(
                f"{temporal} = {value1.value} {getOperador(self.operador)} {value2.value}"
            )

            return PrimitiveData(DATA_TYPE.NUMBER, temporal, self.line,
                                 self.column)
        except TypeError:
            desc = "Error de tipo"
            ErrorController().add(34, 'Execution', desc, self.line,
                                  self.column)
        except:
            desc = "FATAL ERROR, ArithmeticBinaryOperation, no acepta ids"
            ErrorController().add(34, 'Execution', desc, self.line,
                                  self.column)