def deleteTable(self, database: Database, name: str, line, column): """ Method to remove a table in database :param database: Table database :param name: The name of table :param line: The instruction line :param column: The instruction column :return: Returns nothing """ dbStatement = jsonMode.dropTable(database.name, name) if dbStatement == 0: table = self.searchTable(database, name) database.tables.remove(table) self.writeFile() print('Table deleted successfully') elif dbStatement == 1: desc = f": Can't drop table {name}" ErrorController().addExecutionError(34, 'Execution', desc, line, column) elif dbStatement == 2: desc = f": Database {database.name} does not exist" ErrorController().addExecutionError(35, 'Execution', desc, line, column) elif dbStatement == 3: desc = f": Table {name} does not exist" ErrorController().addExecutionError(27, 'Execution', desc, line, column)
def process(self, expression): value1 = self.value1.process(expression) value2 = self.value2.process(expression) operador = self.operador try: if value1.data_type != DATA_TYPE.NUMBER and value2.data_type != DATA_TYPE.NUMBER: desc = "FATAL ERROR, ArithmeticBinaryOperation, no acepta ids" ErrorController().add(34, 'Execution', desc, self.line, self.column) value = 0 if operador == SymbolsAritmeticos.PLUS: value = round(value1.value + value2.value, 2) elif operador == SymbolsAritmeticos.MINUS: value = round(value1.value - value2.value, 2) elif operador == SymbolsAritmeticos.TIMES: value = round(value1.value * value2.value, 2) elif operador == SymbolsAritmeticos.DIVISON: value = round(value1.value / value2.value, 2) elif operador == SymbolsAritmeticos.EXPONENT: value = round(value1.value ** value2.value, 2) elif operador == SymbolsAritmeticos.MODULAR: value = round(value1.value % value2.value, 2) elif operador == SymbolsAritmeticos.BITWISE_SHIFT_LEFT: value = round(value1.value << value2.value, 2) elif operador == SymbolsAritmeticos.BITWISE_SHIFT_RIGHT: value = round(value1.value >> value2.value, 2) elif operador == SymbolsAritmeticos.BITWISE_AND: value = round(value1.value & value2.value) elif operador == SymbolsAritmeticos.BITWISE_OR: value = round(value1.value | value2.value) elif operador == SymbolsAritmeticos.BITWISE_XOR: value = round(value1.value ^ value2.value) return PrimitiveData(DATA_TYPE.NUMBER, value, self.line, self.column) except: desc = "FATAL ERROR, ArithmeticBinaryOperation, no acepta ids" ErrorController().add(34, 'Execution', desc, self.line, self.column)
def extractTable(self, name: str, noLine, noColumn) -> list: """ Method to get a list of records from a table :param name: The name of table :param noLine: The instruction line :param noColumn: The instruction column :return: Returns a list of records """ database = SymbolTable().useDatabase if not database: desc = f": Database not selected" ErrorController().add(4, 'Execution', desc, noLine, noColumn) return None if not TypeChecker().searchTable(database, name): desc = f": Table {name} does not exist" ErrorController().add(27, 'Execution', desc, noLine, noColumn) return None data = data_mode.mode(database.mode).extractTable( database.name.lower(), name.lower()) if data == None: ErrorController().add(34, 'Execution', '', noLine, noColumn) return None return data
def extractRow(self, name: str, columns: list, noLine, noColumn) -> list: """ Method to extract a record from a table :param name: The name of table :param columns: List with number of columns of primary keys :param noLine: The instruction line :param noColumn: The instruction column :return: Returns nothing """ database = SymbolTable().useDatabase if not database: desc = f": Database not selected" ErrorController().add(4, 'Execution', desc, noLine, noColumn) return None if not TypeChecker().searchTable(database, name): desc = f": Table {name} does not exist" ErrorController().add(27, 'Execution', desc, noLine, noColumn) return None data = data_mode.mode(database.mode).extractRow( database.name.lower(), name.lower(), columns) if data == None: ErrorController().add(34, 'Execution', '', noLine, noColumn) return None return data
def process(self, expression): value1 = self.value1.process(expression) value2 = self.value2.process(expression) operator = self.operator try: value = 0 if isinstance(value1, PrimitiveData) and isinstance(value2, PrimitiveData): if operator.lower() == "and": value = value1.value and value2.value elif operator.lower() == "or": value = value1.value or value2.value else: print("Operador no valido: " + operator) return return PrimitiveData(DATA_TYPE.BOOLEANO, value, self.line, self.column) else: data = "" if operator.lower() == 'and': data = f'({value1}) and ({value2})' return data elif operator.lower() == 'or': data = f'({value1}) or ({value2})' return data else: print("Operador no valido: " + operator) return except TypeError: desc = "FATAL ERROR --- LogicalOperators" ErrorController().add(34, 'Execution', desc, self.line, self.column) except: desc = "FATAL ERROR --- LogicalOperators" ErrorController().add(34, 'Execution', desc, self.line, self.column)
def createDatabase(self, database: Database, line, column): """ Method to create a database in type checker :param database: Database object :param line: The instruction line :param column: The instruction column :return: Returns nothing """ if self.searchDatabase(database.name): desc = f": Database {database.name} already exists" ErrorController().add(30, 'Execution', desc, line, column) return dbStatement = data_mode.mode(database.mode).createDatabase( database.name.lower()) if dbStatement == 0: self._typeCheckerList.append(database) self.writeFile() SymbolTable().add(database, 'New Database', 'Database', 'Global', None, line, column) DataWindow().consoleText( 'Query returned successfully: Database created') elif dbStatement == 1: desc = f": Can't create database {database.name}" ErrorController().add(34, 'Execution', desc, line, column) elif dbStatement == 2: desc = f": Database {database.name} already exists" ErrorController().add(30, 'Execution', desc, line, column)
def process(self, environment): try: val = None result = 0 lista1 = [] if isinstance(self.value, Identifiers): val = self.value.process(environment) result = [len(columns) for columns in val[0]] lista1.append(result) lista1.append(self.alias) return lista1 else: val = self.value.process(environment).value l = len(val) return PrimitiveData(DATA_TYPE.NUMBER, l, self.line, self.column) except TypeError: desc = "Tipo de dato invalido para Length" ErrorController().add(37, 'Execution', desc, self.line, self.column) return except: desc = "FATAL ERROR --- StringFuncs" ErrorController().add(34, 'Execution', desc, self.line, self.column)
def createDatabase(self, database: str, line, column): """ Method to create a database in type checker :param database: The name of database :param line: The instruction line :param column: The instruction column :return: Returns nothing """ dbStatement = jsonMode.createDatabase(database) if dbStatement == 0: db = Database(database) self._typeCheckerList.append(db) self.writeFile() SymbolTable().add(db, 'New Database', 'Database', 'Global', None, line, column) print('Database created successfully') # Query returned successfully in # secs # msec. elif dbStatement == 1: desc = f": Can't create database {database}" ErrorController().addExecutionError(34, 'Execution', desc, line, column) elif dbStatement == 2: desc = f": Database {database} already exists" ErrorController().addExecutionError(30, 'Execution', desc, line, column)
def process(self, environment): try: index = self.pos.process(environment).value char = self.no_char.process(environment).value if isinstance(self.value, Identifiers): lista1 = [] val = self.value.process(environment) result = [(columns[:index] + chr(char) + columns[index + 1:]) for columns in val[0]] lista1.append(result) lista1.append(self.alias) return lista1 else: cadena = self.value.process(environment).value result = cadena[:index] + chr(char) + cadena[index + 1:] return PrimitiveData(DATA_TYPE.STRING, result, self.line, self.column) except TypeError: desc = "Tipo de dato invalido para SetByte" ErrorController().add(37, 'Execution', desc, self.line, self.column) return except: desc = "FATAL ERROR --- StringFuncs" ErrorController().add(34, 'Execution', desc, self.line, self.column)
def process(self, environment): try: if self.data_type.lower() == "integer": if isinstance(self.value, Identifiers): lista1 = [] val = self.value.process(environment) result = [int(columns) for columns in val[0]] lista1.append(result) lista1.append(self.alias) return lista1 else: cadena = self.value.process(environment).value return PrimitiveData(DATA_TYPE.NUMBER, int(cadena), self.line, self.column) else: if isinstance(self.value, Identifiers): lista1 = [] val = self.value.process(environment) result = [str(columns) for columns in val[0]] lista1.append(result) lista1.append(self.alias) return lista1 else: cadena = self.value.process(environment).value return PrimitiveData(DATA_TYPE.STRING, cadena, self.line, self.column) except TypeError: desc = "Tipo de dato invalido para Convert" ErrorController().add(37, 'Execution', desc, self.line, self.column) return except: desc = "FATAL ERROR --- StringFuncs" ErrorController().add(34, 'Execution', desc, self.line, self.column)
def deleteDatabase(self, name: str, line, column): """ Method to remove a database in type checker :param name: The name of the database :param line: The instruction line :param column: The instruction column :return: Returns nothing """ database = self.searchDatabase(name) if not database: desc = f": Database {name} does not exist" ErrorController().add(35, 'Execution', desc, line, column) return dbStatement = data_mode.mode(database.mode).dropDatabase(name.lower()) if dbStatement == 0: self._typeCheckerList.remove(database) self.writeFile() SymbolTable().delete(database) DataWindow().consoleText( 'Query returned successfully: Database deleted') elif dbStatement == 1: desc = f": Can't drop database {name}" ErrorController().add(34, 'Execution', desc, line, column) elif dbStatement == 2: desc = f": Database {name} does not exist" ErrorController().add(35, 'Execution', desc, line, column)
def addCheck(self, conditionColumn): # L (L|D)* whatColumnIs = re.search('[a-zA-z]([a-zA-z]|[0-9])*', conditionColumn.alias) bandera = False if whatColumnIs != None: whatColumnIs = whatColumnIs.group(0) for columna in self._column_list: if isinstance(columna, CreateCol): if (columna._column_name == whatColumnIs): if columna._properties != None: bandera = True columna._properties[0][ 'check_condition'] = conditionColumn break if not bandera: desc = f": Undefined column in check ()" ErrorController().add(26, 'Execution', desc, 0, 0) self._can_create_flag = False return bandera = False else: desc = f": column not given in check()" ErrorController().add(26, 'Execution', desc, 0, 0) self._can_create_flag = False return
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)
def process(self, instruction): #Jalando Base de Datos print("EJECUTANDO INSERT") database_id = SymbolTable().useDatabase if not database_id: desc = f": Database not selected" ErrorController().addExecutionError(4, 'Execution', desc, 0, 1)#manejar linea y columna return None #Base de datos existe --> Obtener tabla table_tp = TypeChecker().searchTable(database_id, self.table.value) if not table_tp: desc = f": Table does not exists" ErrorController().addExecutionError(4, 'Execution', desc, 0, 1)#manejar linea y columna return None # Obtenida la tabla ---> TODO: VALIDAR TIPOS # for column in table_tp.columns: # if column. if self.arr_columns == None: #Solo nos dieron los valores, tienen que venir todos ---> Espino ya valida longitud? vals_insert = [] for column in self.arr_values: val = column.process(instruction) vals_insert.append(val.value) print(vals_insert) DataController().insert(self.table.value, vals_insert,0,1) else: if len(self.arr_columns) == len(self.arr_values): pass else: print("Error Datos incompletos")
def deleteDatabase(self, name: str, line, column): """ Method to remove a database in type checker :param name: The name of the database :param line: The instruction line :param column: The instruction column :return: Returns nothing """ dbStatement = jsonMode.dropDatabase(name) if dbStatement == 0: database = self.searchDatabase(name) self._typeCheckerList.remove(database) self.writeFile() SymbolTable().delete(database) print('Database deleted successfully') elif dbStatement == 1: desc = f": Can't drop database {name}" ErrorController().addExecutionError(34, 'Execution', desc, line, column) elif dbStatement == 2: desc = f": Database {name} does not exist" ErrorController().addExecutionError(35, 'Execution', desc, line, column)
def createTable(self, database: Database, name: str, columns: int, line, column): """ Method to create a table in database :param database: Table database :param name: The name of table :param columns: Number of columns :param line: The instruction line :param column: The instruction column :return: Returns nothing """ dbStatement = jsonMode.createTable(database.name, name, columns) if dbStatement == 0: table = Table(name) database.tables.append(table) self.writeFile() print('Table created successfully') return table elif dbStatement == 1: desc = f": Can't create table {name}" ErrorController().addExecutionError(34, 'Execution', desc, line, column) elif dbStatement == 2: desc = f": Database {database.name} does not exist" ErrorController().addExecutionError(35, 'Execution', desc, line, column) elif dbStatement == 3: desc = f": Table {name} already exists" ErrorController().addExecutionError(31, 'Execution', desc, line, column)
def updateDatabase(self, databaseOld: str, databaseNew: str, line, column): """ Method to update the name of a database in type checker :param databaseOld: The old name of the database :param databaseNew: The new name of the database :param line: The instruction line :param column: The instruction column :return: Returns nothing """ dbStatement = jsonMode.alterDatabase(databaseOld, databaseNew) if dbStatement == 0: database = self.searchDatabase(databaseOld) database.name = databaseNew self.writeFile() print('Database updated successfully') elif dbStatement == 1: desc = f": Can't update database {databaseOld}" ErrorController().addExecutionError(34, 'Execution', desc, line, column) elif dbStatement == 2: desc = f": Database {databaseOld} does not exist" ErrorController().addExecutionError(35, 'Execution', desc, line, column) elif dbStatement == 3: desc = f": Database {databaseNew} already exists" ErrorController().addExecutionError(30, 'Execution', desc, line, column)
def agregarCheck(self, conditionColumn, tablaId): typeChecker = TypeChecker() bandera = False tableToAlter = typeChecker.searchTable(SymbolTable().useDatabase, tablaId) # L (L|D)* whatColumnIs = re.search('[a-zA-z]([a-zA-z]|[0-9])*', conditionColumn.alias) if whatColumnIs != None: whatColumnIs = whatColumnIs.group(0) for columna in tableToAlter.columns: if (columna._name == whatColumnIs): bandera = True columna._check = conditionColumn.alias break if not bandera: desc = f": Undefined column in alter check ()" ErrorController().add(26, 'Execution', desc, 0, 0) return bandera = False else: desc = f": column not given in check()" ErrorController().add(26, 'Execution', desc, 0, 0) return typeChecker.writeFile()
def process(self, environment): try: val = None result = 0 lista1 = [] i = self.down.process(environment).value j = self.up.process(environment).value if isinstance(self.value, Identifiers): val = self.value.process(environment) result = [columns[i:j] for columns in val[0]] lista1.append(result) lista1.append(self.alias) return lista1 else: cadena = self.value.process(environment).value substr = cadena[i:j] return PrimitiveData(DATA_TYPE.STRING, substr, self.line, self.column) except TypeError: desc = "Tipo de dato invalido para Substring" ErrorController().add(37, 'Execution', desc, self.line, self.column) return except: desc = "FATAL ERROR --- StringFuncs" ErrorController().add(34, 'Execution', desc, self.line, self.column)
def process(self, environment): try: if isinstance(self.value, Identifiers): lista1 = [] val = self.value.process(environment) result = [ hashlib.sha256(columns.encode()).hexdigest() for columns in val[0] ] lista1.append(result) lista1.append(self.alias) return lista1 else: cadena = self.value.process(environment).value result = hashlib.sha256(cadena.encode()) return PrimitiveData(DATA_TYPE.STRING, result.hexdigest(), self.line, self.column) except TypeError: desc = "Tipo de dato invalido para sha256" ErrorController().add(37, 'Execution', desc, self.line, self.column) return except: desc = "FATAL ERROR --- StringFuncs" ErrorController().add(34, 'Execution', desc, self.line, self.column)
def process(self, expression): value1 = self.value1.process(expression) value2 = self.value2.process(expression) operator = self.operator try: value = 0 if isinstance(value1, PrimitiveData) and isinstance( value2, PrimitiveData): if operator.lower() == "and": value = value1.value and value2.value elif operator.lower() == "or": value = value1.value or value2.value else: print("Operador no valido: " + operator) return return PrimitiveData(DATA_TYPE.BOOLEANO, value, self.line, self.column) else: data = "" if isinstance(value1, list) and isinstance(value2, list): if operator.lower() == 'and': lista_temp = [] lista_temp.append(value1[2]) lista_temp.append(value2[2]) lista_temp = self.convert_unic_list2(lista_temp) name_list = self.convert_unic_list( value1[0], value2[0]) data = f'({value1[1]}) and ({value2[1]})' return [name_list, data, lista_temp] elif operator.lower() == 'or': lista_temp = [] lista_temp.append(value1[2]) lista_temp.append(value2[2]) lista_temp = self.convert_unic_list2(lista_temp) name_list = self.convert_unic_list( value1[0], value2[0]) data = f'({value1[1]}) or ({value2[1]})' return [name_list, data, lista_temp] else: print("Operador no valido: " + operator) return else: if operator.lower() == 'and': data = f'({value1}) and ({value2})' return data elif operator.lower() == 'or': data = f'({value1}) or ({value2})' return data else: print("Operador no valido: " + operator) return except TypeError: desc = "FATAL ERROR --- LogicalOperators" ErrorController().add(34, 'Execution', desc, self.line, self.column) except: desc = "FATAL ERROR --- LogicalOperators" ErrorController().add(34, 'Execution', desc, self.line, self.column)
def p_error(p): try: # print(str(p.value)) description = ' or near ' + str(p.value) column = find_column(p) ErrorController().add(33, 'Syntactic', description, p.lineno, column) except AttributeError: # print(number_error, description) ErrorController().add(1, 'Syntactic', '', 'EOF', 'EOF')
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
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)
def agregarNuevoTipo(self, tablaAMod, colAMod, nuevoTipo): typeChecker = TypeChecker() bandera = False tableToAlter = typeChecker.searchTable(SymbolTable().useDatabase, tablaAMod) tipoFinal = { '_tipoColumna': str(nuevoTipo._tipoColumna), '_paramOne': nuevoTipo._paramOne, '_paramTwo': nuevoTipo._paramTwo } for columna in tableToAlter.columns: if (columna._name == colAMod): bandera = True columna._dataType = tipoFinal break if not bandera: desc = f": Undefined column in alter type ()" ErrorController().add(26, 'Execution', desc, 0, 0) return bandera = False typeChecker.writeFile() pass
def report_errors_ubuntu(self): global report_error report = open('./team28/dot.txt', 'w') report.write(report_error.get_report(ErrorController().getList())) report.close() os.system('dot -Tpdf ./team28/dot.txt -o ./team28/error.pdf') os.system('xdg-open ./team28/error.pdf')
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)
def generar_optimization(self): global report_error global report_ast global report_optimization DataWindow().clearConsole() OptimizationController().destroy() texto = self.entrada.get('1.0', END) list_instrucciones = parse_optimizacion(texto) # print(result) # Imprime el AST report_error = ReportError() report_optimization = ReportOfOptimization() if len(ErrorController().getList()) > 0: messagebox.showerror('ERRORES', 'Se encontraron errores') else: for index, inst in enumerate(list_instrucciones): if inst != None: result = inst.process(0) regla1(result, list_instrucciones, index) regla2(result, list_instrucciones, index) regla3(result, list_instrucciones, index) regla4y5(result, list_instrucciones, index) regla6(result, list_instrucciones, index) regla7(result, list_instrucciones, index) DataWindow().consoleText('CD3 RETURNED: Optimization Finished')
def report_errors_windows(self): global report_error report = open('dot.txt', 'w') report.write(report_error.get_report(ErrorController().getList())) report.close() os.system('dot -Tpdf dot.txt -o error.pdf') os.startfile('error.pdf')
def compile(self, environment): try: if self.data_type.lower() == 'integer': 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} = int({temp})") return PrimitiveData(DATA_TYPE.STRING, temporal, self.line, self.column) else: temp = ThreeAddressCode().newTemp() val = self.value.compile(environment).value dataTemp = f"{temp} = '{val}'" ThreeAddressCode().addCode(dataTemp) temporal = ThreeAddressCode().newTemp() ThreeAddressCode().addCode(f"{temporal} = {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)