Esempio n. 1
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
Esempio n. 2
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
Esempio n. 3
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)
Esempio n. 4
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)
Esempio n. 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)
Esempio n. 6
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
Esempio n. 7
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
Esempio n. 8
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
Esempio n. 9
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}\"")
Esempio n. 10
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)
Esempio n. 11
0
    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}")
Esempio n. 12
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})")
Esempio n. 13
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
Esempio n. 14
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)
Esempio n. 15
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)
Esempio n. 16
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
Esempio n. 17
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}()")
Esempio n. 18
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)
Esempio n. 19
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)
Esempio n. 20
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)
Esempio n. 21
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
Esempio n. 22
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)
Esempio n. 23
0
    def process(self, instrucction):
        typeNew = Type(self._name.alias)
        for valor in self._values:
            typeNew._values.append(valor.alias)

        SymbolTable().add(typeNew._name, str(typeNew._values), 'TYPE', 'DB',
                          None, '0', '0')
        print(typeNew)
        # 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})")
Esempio n. 24
0
    def compile(self, environment):

        lbl_true = ThreeAddressCode().newLabel()
        lbl_false = ThreeAddressCode().newLabel()

        condition = None
        if type(self.condition) is not list:
            condition = self.condition.compile(environment)
        else:
            condition = self.condition[0].compile(environment)

        ThreeAddressCode().addCode(f"if({condition.value}): goto .{lbl_true}")
        ThreeAddressCode().addCode(f"goto .{lbl_false}")

        ThreeAddressCode().addCode(
            f"label .{lbl_true}    # {condition.value} ---- True")
        for instr in self.instructions:
            instr.compile(environment)

        if self._else is not None:

            lbl_exit = ThreeAddressCode().newLabel()
            ThreeAddressCode().addCode(f"goto .{lbl_exit}")
            ThreeAddressCode().addCode(
                f"label .{lbl_false}    # {condition.value} ---- False")

            if isinstance(self._else, If):
                self._else.compile(environment)
            else:
                for instr in self._else:
                    instr.compile(environment)

            ThreeAddressCode().addCode(
                f"label .{lbl_exit}    # {condition.value} ---- Salida")

        else:

            ThreeAddressCode().addCode(
                f"label .{lbl_false}    # {condition.value} ---- False")
Esempio n. 25
0
def hacerUnSoloCambio(func, entry_lower, temps_array, contador_funciones):
    newString = ''  # viendo nada mas como queda armado
    if func in entry_lower:
        type_return = Procedures().getReturnType(func)
        # separando string
        split = entry_lower.split(func, 1)
        # recibiendo retorno de la funcion
        temp = temps_array[contador_funciones]
        newValue = temp
        # aumentando contador para obtener el temporal correspondiente
        contador_funciones += 1
        temp_ant = ''
        for idx, val in enumerate(split):
            # Quitando parametros
            if idx > 0 and "(" in val and ")" in val:
                i = val.index("(")
                j = val.index(")")
                str1 = val[:i]
                str2 = val[j+1:]
                val = str1 + str2
            if (idx < len(split) - 1):
                temp_ant = temp
                temp = ThreeAddressCode().newTemp()
                # newValue = temp
                # METIENDO COMILLAS
                if type_return == ColumnsTypes.TEXT or type_return == ColumnsTypes.VARCHAR:
                    ThreeAddressCode().addCode(
                        f"{temp} = \"{val}\" + \'\\\"\'")
                    temp = ThreeAddressCode().newTemp()
                    ThreeAddressCode().addCode(
                        f"{temp} = str({temp_ant}) + \'\\\"\'")
                else:
                    ThreeAddressCode().addCode(
                        f"{temp} = \"{val}\" + str({temp_ant})")
            newString += f"{val}"
        if len(split) > 1:
            print("val", val)
            contiene_reemplazo = True
            funciones = Procedures().getProceduresIDs()

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

    return contador_funciones
Esempio n. 26
0
    def compile(self, environment):
        params = len(self.params)
        if self.isNew:
            self.environment = environment  # TODO verificar
            if Procedures().saveProcedure(self.id, self, None, 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:

                self.setVariables(fun['variables'], environment)
Esempio n. 27
0
    def compile(self, environment: Ambito):
        var_search = environment.getVar(self.id)

        if isinstance(self.value, Select):
            val = self.value.compile(environment)
            ThreeAddressCode().addCode(f"Stack[{var_search.position}] = {val}")
            return
        else:
            val = self.value.compile(environment)

        if var_search == None:
            print("VARIABLE NO DECLARADA ")
            print(self.id)
            ErrorController().add(33, 'Execution',
                                  f"VARIABLE {id} NO DECLARADA", self.line, self.column)
            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")
                ErrorController().add(33, 'Execution',
                                      f"VARIABLE {id} NO DECLARADA", self.line, self.column)
                return

            position = val.position
            temporal = ThreeAddressCode().newTemp()
            ThreeAddressCode().addCode(f"{temporal} = Stack[{position}]")
            ThreeAddressCode().addCode(
                f"Stack[{var_search.position}] = {temporal}")
        else:
            if isinstance(val, str):
                ThreeAddressCode().addCode(
                    f"Stack[{var_search.position}] = {val}")
            else:
                ThreeAddressCode().addCode(
                    f"Stack[{var_search.position}] = {val.value}")
Esempio n. 28
0
 def compile(self, instrucction):
     temp = ThreeAddressCode().newTemp()
     ThreeAddressCode().addCode(f"{temp} = '{self._tac};'")
Esempio n. 29
0
    def compile(self, expression):
        type_trigo = self.type_trigonometric
        temporal = ThreeAddressCode().newTemp()

        temp1 = self.expression1.compile(expression)
        temp2 = None
        if self.optional_expression2:
            temp2 = self.optional_expression2.compile(expression)

        if type_trigo.lower() == "acos":
            ThreeAddressCode().addCode(f"{temporal} = acos({temp1.value})")

        elif type_trigo.lower() == 'acosd':
            temporal1 = ThreeAddressCode().newTemp()
            ThreeAddressCode().addCode(f"{temporal1} = acos({temp1.value})")

            ThreeAddressCode().addCode(f"{temporal} = degrees({temporal1})")

        elif type_trigo.lower() == 'asin':
            ThreeAddressCode().addCode(f"{temporal} = asin({temp1.value})")

        elif type_trigo.lower() == 'asind':
            temporal1 = ThreeAddressCode().newTemp()
            ThreeAddressCode().addCode(f"{temporal1} = asin({temp1.value})")

            ThreeAddressCode().addCode(f"{temporal} = degrees({temporal1})")

        elif type_trigo.lower() == 'atan':
            ThreeAddressCode().addCode(f"{temporal} = atan({temp1.value})")

        elif type_trigo.lower() == 'atand':
            temporal1 = ThreeAddressCode().newTemp()
            ThreeAddressCode().addCode(f"{temporal1} = atan({temp1.value})")

            ThreeAddressCode().addCode(f"{temporal} = degrees({temporal1})")

        elif type_trigo.lower() == 'atan2':
            ThreeAddressCode().addCode(
                f"{temporal} = atan2({temp1.value}, {temp2.value})")

        elif type_trigo.lower() == 'atan2d':
            temporal1 = ThreeAddressCode().newTemp()
            ThreeAddressCode().addCode(
                f"{temporal1} = atan2({temp1.value}, {temp2.value})")

            ThreeAddressCode().addCode(f"{temporal} = degrees({temporal1})")

        elif type_trigo.lower() == 'cos':
            ThreeAddressCode().addCode(f"{temporal} = cos({temp1.value})")

        elif type_trigo.lower() == 'cosd':
            temporal1 = ThreeAddressCode().newTemp()
            ThreeAddressCode().addCode(f"{temporal1} = cos({temp1.value})")

            ThreeAddressCode().addCode(f"{temporal} = degrees({temporal1})")

        elif type_trigo.lower() == 'cot':
            temporal1 = ThreeAddressCode().newTemp()
            ThreeAddressCode().addCode(f"{temporal1} = tan({temp1.value})")

            ThreeAddressCode().addCode(f"{temporal} = 1 / {temporal1}")

        elif type_trigo.lower() == 'cotd':
            temporal1 = ThreeAddressCode().newTemp()
            ThreeAddressCode().addCode(f"{temporal1} = tan({temp1.value})")

            temporal2 = ThreeAddressCode().newTemp()
            ThreeAddressCode().addCode(f"{temporal2} = 1 / {temporal1}")

            ThreeAddressCode().addCode(f"{temporal} = degrees({temporal2})")

        elif type_trigo.lower() == 'sin':
            ThreeAddressCode().addCode(f"{temporal} = sin({temp1.value})")

        elif type_trigo.lower() == 'sind':
            temporal1 = ThreeAddressCode().newTemp()
            ThreeAddressCode().addCode(f"{temporal1} = sin({temp1.value})")

            ThreeAddressCode().addCode(f"{temporal} = degrees({temporal1})")

        elif type_trigo.lower() == 'tan':
            ThreeAddressCode().addCode(f"{temporal} = tan({temp1.value})")

        elif type_trigo.lower() == 'tand':
            temporal1 = ThreeAddressCode().newTemp()
            ThreeAddressCode().addCode(f"{temporal1} = tan({temp1.value})")

            ThreeAddressCode().addCode(f"{temporal} = degrees({temporal1})")

        elif type_trigo.lower() == 'cosh':
            ThreeAddressCode().addCode(f"{temporal} = cosh({temp1.value})")

        elif type_trigo.lower() == 'sinh':
            ThreeAddressCode().addCode(f"{temporal} = sinh({temp1.value})")

        elif type_trigo.lower() == 'tanh':
            ThreeAddressCode().addCode(f"{temporal} = tanh({temp1.value})")

        elif type_trigo.lower() == 'acosh':
            ThreeAddressCode().addCode(f"{temporal} = acosh({temp1.value})")

        elif type_trigo.lower() == 'asinh':
            ThreeAddressCode().addCode(f"{temporal} = asinh({temp1.value})")

        elif type_trigo.lower() == 'atanh':
            ThreeAddressCode().addCode(f"{temporal} = atanh({temp1.value})")

        return PrimitiveData(DATA_TYPE.NUMBER, temporal, self.line,
                             self.column)
Esempio n. 30
0
 def compile(self, instrucction):
     temp = ThreeAddressCode().newTemp()
     ThreeAddressCode().addCode(f"{temp} = '{self._tac};'")
     SymbolTable().useDatabase = self._dbActual
     temp1 = ThreeAddressCode().newTemp()
     ThreeAddressCode().addCode(f"{temp1} = parse({temp})")