def ejecutar(self, tabla, arbol): super().ejecutar(tabla, arbol) resultado = self.valor.ejecutar(tabla, arbol) if self.valor.tipo.tipo != Tipo_Dato.SMALLINT and self.valor.tipo.tipo != Tipo_Dato.INTEGER and self.valor.tipo.tipo != Tipo_Dato.BIGINT and self.valor.tipo.tipo != Tipo_Dato.DECIMAL and self.valor.tipo.tipo != Tipo_Dato.NUMERIC and self.valor.tipo.tipo != Tipo_Dato.REAL and self.valor.tipo.tipo != Tipo_Dato.DOUBLE_PRECISION: error = Excepcion( '42883', "Semántico", "No existe la función exp(" + self.valor.tipo.toString() + ")", self.linea, self.columna) arbol.excepciones.append(error) arbol.consola.append(error.toString()) return error if resultado < 0: error = Excepcion( '2201F', "Semántico", "La función EXP únicamente acepta valores númericos positivos", self.linea, self.columna) arbol.excepciones.append(error) arbol.consola.append(error.toString()) return error if isinstance(resultado, int): self.tipo = Tipo(Tipo_Dato.DOUBLE_PRECISION) return math.exp(resultado) else: self.tipo = Tipo(Tipo_Dato.NUMERIC) return math.exp(resultado)
def ejecutar(self, tabla, arbol): super().ejecutar(tabla, arbol) resultado = self.valor.ejecutar(tabla, arbol) if isinstance(resultado, Excepcion): return resultado if self.valor.tipo.tipo == Tipo_Dato.CHAR or self.valor.tipo.tipo == Tipo_Dato.CHARACTER or self.valor.tipo.tipo == Tipo_Dato.TEXT: if str(self.codificacion.valor) == 'base64': message_bytes = resultado.encode('ascii') base64_bytes = base64.b64decode(message_bytes) base64_message = base64_bytes.decode('ascii') resultado = base64_message self.tipo = Tipo(Tipo_Dato.TEXT) return resultado if str(self.codificacion.valor) == 'hex': self.tipo = Tipo(Tipo_Dato.TEXT) #bytes.fromhex('7061756c').decode('utf-8') return bytearray.fromhex(str(resultado)).decode() error = Excepcion( '22023', "Semántico", f"No se reconoce la codificación{self.valor.tipo.toString()})", self.linea, self.columna) arbol.excepciones.append(error) #arbol.consola.append("HINT: Ninguna función coincide en el nombre y tipos de argumentos. Puede ser necesario agregar conversión explícita de tipos.") arbol.consola.append(error.toString()) return error
def ejecutar(self, tabla, arbol): super().ejecutar(tabla, arbol) resultado = self.valor.ejecutar(tabla, arbol) if isinstance(resultado, Excepcion): return resultado if self.indice < len(resultado): if self.valor.tipo.tipo == Tipo_Dato.CHAR or self.valor.tipo.tipo == Tipo_Dato.VARCHAR or self.valor.tipo.tipo == Tipo_Dato.VARYING or self.valor.tipo.tipo == Tipo_Dato.CHARACTER or self.valor.tipo.tipo == Tipo_Dato.TEXT: self.tipo = Tipo(Tipo_Dato.INTEGER) return ord( str(resultado)[int(self.indice):int(self.indice) + 1]) else: error = Excepcion( '2202E', "Semántico", f"El índice {self.indice} esta fuera de rango [0..{len(self.valor.valor)}]", self.linea, self.columna) arbol.excepciones.append(error) arbol.consola.append(error.toString()) return error error = Excepcion( '42883', "Semántico", f"No existe la función GET_BYTE({self.valor.tipo.toString()})", self.linea, self.columna) arbol.excepciones.append(error) arbol.consola.append( "HINT: Ninguna función coincide en el nombre y tipos de argumentos. Puede ser necesario agregar conversión explícita de tipos." ) arbol.consola.append(error.toString()) return error
def __init__(self, opIzq, opDer, opDer2, operador, strGram, linea, columna): Instruccion.__init__(self, Tipo(Tipo_Dato.BOOLEAN), linea, columna, strGram) self.opIzq = opIzq self.opDer = opDer self.opDer2 = opDer2 self.operador = operador
def ejecutar(self, tabla, arbol): super().ejecutar(tabla, arbol) resultado = self.valor.ejecutar(tabla, arbol) if isinstance(resultado, Excepcion): return resultado if self.valor.tipo.tipo != Tipo_Dato.SMALLINT and self.valor.tipo.tipo != Tipo_Dato.INTEGER and self.valor.tipo.tipo != Tipo_Dato.BIGINT and self.valor.tipo.tipo != Tipo_Dato.DECIMAL and self.valor.tipo.tipo != Tipo_Dato.NUMERIC and self.valor.tipo.tipo != Tipo_Dato.REAL and self.valor.tipo.tipo != Tipo_Dato.DOUBLE_PRECISION: error = Excepcion( '42883', "Semántico", "No existe la función abs(" + self.valor.tipo.toString() + ")", self.linea, self.columna) arbol.excepciones.append(error) arbol.consola.append(error.toString()) return error if isinstance(resultado, int): self.tipo = Tipo(Tipo_Dato.INTEGER) return int(abs(resultado)) else: self.tipo = Tipo(Tipo_Dato.NUMERIC) return abs(resultado)
def __init__(self, dist, lcol, lcol2, linners, where, lrows, strGram, linea, columna): Instruccion.__init__(self, Tipo(Tipo_Dato.QUERY), linea, columna, strGram) self.dist = dist self.lcol = lcol self.lcol2 = lcol2 self.linners = linners self.where = where self.lrows = lrows
def ejecutar(self, tabla, arbol): super().ejecutar(tabla,arbol) resultado = self.valor.ejecutar(tabla,arbol) if isinstance(resultado, Excepcion): return resultado if self.valor.tipo.tipo== Tipo_Dato.CHAR or self.valor.tipo.tipo== Tipo_Dato.VARCHAR or self.valor.tipo.tipo== Tipo_Dato.VARYING or self.valor.tipo.tipo== Tipo_Dato.CHARACTER or self.valor.tipo.tipo== Tipo_Dato.TEXT: self.tipo = Tipo(Tipo_Dato.TEXT) return strip(str(resultado)) error = Excepcion('42883',"Semántico",f"No existe la función TRIM({self.valor.tipo.toString()})",self.linea,self.columna) arbol.excepciones.append(error) arbol.consola.append("HINT: Ninguna función coincide en el nombre y tipos de argumentos. Puede ser necesario agregar conversión explícita de tipos.") arbol.consola.append(error.toString()) return error
def ejecutar(self, tabla, arbol): super().ejecutar(tabla, arbol) # Si existe algún error en el operador izquierdo, retorno el error. resultadoIzq = self.opIzq.ejecutar(tabla, arbol) if isinstance(resultadoIzq, Excepcion): return resultadoIzq # Si existe algún error en el operador derecho, retorno el error. resultadoDer = self.opDer.ejecutar(tabla, arbol) if isinstance(resultadoDer, Excepcion): return resultadoDer if (self.opIzq.tipo.tipo == Tipo_Dato.INTEGER or self.opIzq.tipo.tipo == Tipo_Dato.DOUBLE_PRECISION or self.opIzq.tipo.tipo == Tipo_Dato.NUMERIC) and ( self.opDer.tipo.tipo == Tipo_Dato.INTEGER or self.opDer.tipo.tipo == Tipo_Dato.DOUBLE_PRECISION or self.opDer.tipo.tipo == Tipo_Dato.NUMERIC): if resultadoDer < 0 or resultadoIzq < 0: error = Excepcion( '42883', "Semántico", "La función POWER únicamente acepta valores númericos positivos", self.linea, self.columna) arbol.excepciones.append(error) arbol.consola.append(error.toString()) return error if isinstance(resultadoIzq, int) and isinstance(resultadoDer, int): self.tipo = Tipo(Tipo_Dato.DOUBLE_PRECISION) return int(math.pow(resultadoIzq, resultadoDer)) else: self.tipo = Tipo(Tipo_Dato.NUMERIC) return math.pow(resultadoIzq, resultadoDer) else: error = Excepcion( '42883', "Semántico", "No existe la función power(" + self.opIzq.tipo.toString() + ", " + self.opDer.tipo.toString() + ")", self.linea, self.columna) arbol.excepciones.append(error) arbol.consola.append(error.toString()) return error
def ejecutar(self, tabla, arbol): super().ejecutar(tabla, arbol) resultado = self.valor.ejecutar(tabla, arbol) try: if self.count.tipo.tipo == Tipo_Dato.INTEGER: print(self.count.tipo.toString(), Tipo_Dato.INTEGER) temp = (self.max.valor - self.min.valor) / self.count.valor contador = float(self.min.valor) cubo = 0 if float(resultado) == contador: self.tipo = Tipo(Tipo_Dato.INTEGER) return 1 while contador < float(self.max.valor): if float(resultado) < contador: self.tipo = Tipo(Tipo_Dato.INTEGER) return cubo contador += temp cubo += 1 self.tipo = Tipo(Tipo_Dato.INTEGER) return cubo + 1 else: error = Excepcion( '42883', "Semántico", f"No existe la función width_bucket({self.valor.tipo.toString()},{self.min.tipo.toString()},{self.max.tipo.toString()},{self.count.tipo.toString()})", self.linea, self.columna) arbol.excepciones.append(error) arbol.consola.append(error.toString()) arbol.consola.append("El Cuarto Párametro debe ser Integer.") return error except: error = Excepcion('XX000', "Semántico", f"Error Interno width_bucket", self.linea, self.columna) arbol.excepciones.append(error) arbol.consola.append(error.toString()) return error
def ejecutar(self, tabla, arbol): super().ejecutar(tabla,arbol) resultado = self.valor.ejecutar(tabla,arbol) if isinstance(resultado, Excepcion): return resultado #print("RESULTADO:",resultado) #if isinstance(resultado, Primitivo): if self.valor.tipo.tipo== Tipo_Dato.CHAR or self.valor.tipo.tipo== Tipo_Dato.VARCHAR or self.valor.tipo.tipo== Tipo_Dato.VARYING or self.valor.tipo.tipo== Tipo_Dato.CHARACTER or self.valor.tipo.tipo== Tipo_Dato.TEXT: #if self.valor.tipo.tipo== Tipo_Dato.CHAR or self.valor.tipo.tipo== Tipo_Dato.CHARACTER: self.tipo = Tipo(Tipo_Dato.INTEGER) return len(str(resultado)) #elif isinstance(resultado, Identificador): # print("HAY QUE PROGRAMAR LO DE IDENTIFICADOR LENGTH") error = Excepcion('42883',"Semántico",f"No existe la función LENGTH({self.valor.tipo.toString()})",self.linea,self.columna) arbol.excepciones.append(error) arbol.consola.append("HINT: Ninguna función coincide en el nombre y tipos de argumentos. Puede ser necesario agregar conversión explícita de tipos.") arbol.consola.append(error.toString()) return error
def ejecutar(self, tabla, arbol): super().ejecutar(tabla, arbol) resultado = self.valor.ejecutar(tabla, arbol) if isinstance(resultado, Excepcion): return resultado try: if self.tipo_salida.tipo == Tipo_Dato.INTEGER: int(resultado) self.tipo = Tipo(Tipo_Dato.INTEGER) return resultado elif self.tipo_salida.tipo == Tipo_Dato.SMALLINT: int(resultado) self.tipo = Tipo(Tipo_Dato.SMALLINT) return resultado elif self.tipo_salida.tipo == Tipo_Dato.DECIMAL: float(resultado) self.tipo = Tipo(Tipo_Dato.DECIMAL) return resultado elif self.tipo_salida.tipo == Tipo_Dato.BOOLEAN: if bool(resultado): verdadero = ("true", "t", "1", "yes") false = ("false", "f", "0", "not") if resultado in (verdadero + false): self.tipo = Tipo(Tipo_Dato.BOOLEAN) return str(resultado).lower() in verdadero else: error = Excepcion( '22P02', "Semántico", f"La sintaxis de entrada no es válida para tipo {self.valor.tipo.toString()}: << {resultado} >> a Boolean", self.linea, self.columna) arbol.excepciones.append(error) arbol.consola.append(error.toString()) return error elif self.tipo_salida.tipo == Tipo_Dato.DATE: #formats = ("%d-%m-%Y %I:%M %p", "%d/%m/%Y %I:%M %p") formats = ("%d-%m-%Y", "%Y-%m-%d", "%d-%M-%Y", "%Y-%M-%d", "%Y-%b-%d", "%d-%b-%Y") for fmt in formats: valid_date = "" try: valid_date = time.strptime(resultado, fmt) if isinstance(valid_date, time.struct_time): self.tipo = Tipo(Tipo_Dato.DATE) return time.strftime('%Y-%m-%d', valid_date) except ValueError as e: pass error = Excepcion( '22007', "Semántico", f"la sintaxis de entrada no es válida para tipo date: << {resultado} >>", self.linea, self.columna) arbol.excepciones.append(error) arbol.consola.append(error.toString()) return error except: error = Excepcion( '22P02', "Semántico", f"La sintaxis de entrada no es válida para tipo {self.valor.tipo.toString()}: << {resultado} >>", self.linea, self.columna) arbol.excepciones.append(error) arbol.consola.append(error.toString()) return error '''
def __init__(self, lista, strGram, linea, columna): Instruccion.__init__(self, Tipo(Tipo_Dato.QUERY), linea, columna, strGram) self.lista = lista
def __init__(self, valor, strGram, linea, columna): Instruccion.__init__(self,Tipo(Tipo_Dato.DOUBLE_PRECISION),linea,columna,strGram) self.valor = valor
def __init__(self, opIzq, opDer, strGram, linea, columna): Instruccion.__init__(self, Tipo(Tipo_Dato.DOUBLE_PRECISION), linea, columna, strGram) self.opIzq = opIzq self.opDer = opDer
def analizar(self, tabla, arbol): super().analizar(tabla,arbol) # Operación con dos operadores if(self.opDer != None): # Si existe algún error en el operador izquierdo, retorno el error. resultadoIzq = self.opIzq.analizar(tabla, arbol) if isinstance(resultadoIzq, Excepcion): return resultadoIzq # Si existe algún error en el operador derecho, retorno el error. resultadoDer = self.opDer.analizar(tabla, arbol) if isinstance(resultadoDer, Excepcion): return resultadoDer # Comprobamos el tipo de operador if self.operador == '+': if self.opIzq.tipo.tipo == Tipo_Dato.INTEGER and self.opDer.tipo.tipo == Tipo_Dato.INTEGER: self.tipo = Tipo(Tipo_Dato.INTEGER) return self.tipo elif self.opIzq.tipo.tipo == Tipo_Dato.NUMERIC and self.opDer.tipo.tipo == Tipo_Dato.NUMERIC: self.tipo = Tipo(Tipo_Dato.NUMERIC) return self.tipo elif self.opIzq.tipo.tipo == Tipo_Dato.NUMERIC and self.opDer.tipo.tipo == Tipo_Dato.INTEGER: self.tipo = Tipo(Tipo_Dato.NUMERIC) return self.tipo elif self.opIzq.tipo.tipo == Tipo_Dato.INTEGER and self.opDer.tipo.tipo == Tipo_Dato.NUMERIC: self.tipo = Tipo(Tipo_Dato.NUMERIC) return self.tipo elif self.opIzq.tipo.tipo == Tipo_Dato.DOUBLE_PRECISION and self.opDer.tipo.tipo == Tipo_Dato.DOUBLE_PRECISION: self.tipo = Tipo(Tipo_Dato.DOUBLE_PRECISION) return self.tipo elif self.opIzq.tipo.tipo == Tipo_Dato.DOUBLE_PRECISION and self.opDer.tipo.tipo == Tipo_Dato.INTEGER: self.tipo = Tipo(Tipo_Dato.DOUBLE_PRECISION) return self.tipo elif self.opIzq.tipo.tipo == Tipo_Dato.INTEGER and self.opDer.tipo.tipo == Tipo_Dato.DOUBLE_PRECISION: self.tipo = Tipo(Tipo_Dato.DOUBLE_PRECISION) return self.tipo elif self.opIzq.tipo.tipo == Tipo_Dato.DOUBLE_PRECISION and self.opDer.tipo.tipo == Tipo_Dato.NUMERIC: self.tipo = Tipo(Tipo_Dato.DOUBLE_PRECISION) return self.tipo elif self.opIzq.tipo.tipo == Tipo_Dato.NUMERIC and self.opDer.tipo.tipo == Tipo_Dato.DOUBLE_PRECISION: self.tipo = Tipo(Tipo_Dato.DOUBLE_PRECISION) return self.tipo elif self.opIzq.tipo.tipo == Tipo_Dato.CHAR and self.opDer.tipo.tipo == Tipo_Dato.CHAR: self.tipo = Tipo(Tipo_Dato.CHAR) return self.tipo else: error = Excepcion('42883',"Semántico","el operador no existe: "+self.opIzq.tipo.toString()+" + "+self.opDer.tipo.toString(),self.linea,self.columna) arbol.excepciones.append(error) arbol.consola.append(error.toString()) return error elif self.operador == '-': if self.opIzq.tipo.tipo == Tipo_Dato.INTEGER and self.opDer.tipo.tipo == Tipo_Dato.INTEGER: self.tipo = Tipo(Tipo_Dato.INTEGER) return self.tipo elif self.opIzq.tipo.tipo == Tipo_Dato.NUMERIC and self.opDer.tipo.tipo == Tipo_Dato.NUMERIC: self.tipo = Tipo(Tipo_Dato.NUMERIC) return self.tipo elif self.opIzq.tipo.tipo == Tipo_Dato.NUMERIC and self.opDer.tipo.tipo == Tipo_Dato.INTEGER: self.tipo = Tipo(Tipo_Dato.NUMERIC) return self.tipo elif self.opIzq.tipo.tipo == Tipo_Dato.INTEGER and self.opDer.tipo.tipo == Tipo_Dato.NUMERIC: self.tipo = Tipo(Tipo_Dato.NUMERIC) return self.tipo elif self.opIzq.tipo.tipo == Tipo_Dato.DOUBLE_PRECISION and self.opDer.tipo.tipo == Tipo_Dato.DOUBLE_PRECISION: self.tipo = Tipo(Tipo_Dato.DOUBLE_PRECISION) return self.tipo elif self.opIzq.tipo.tipo == Tipo_Dato.DOUBLE_PRECISION and self.opDer.tipo.tipo == Tipo_Dato.INTEGER: self.tipo = Tipo(Tipo_Dato.DOUBLE_PRECISION) return self.tipo elif self.opIzq.tipo.tipo == Tipo_Dato.INTEGER and self.opDer.tipo.tipo == Tipo_Dato.DOUBLE_PRECISION: self.tipo = Tipo(Tipo_Dato.DOUBLE_PRECISION) return self.tipo elif self.opIzq.tipo.tipo == Tipo_Dato.DOUBLE_PRECISION and self.opDer.tipo.tipo == Tipo_Dato.NUMERIC: self.tipo = Tipo(Tipo_Dato.DOUBLE_PRECISION) return self.tipo elif self.opIzq.tipo.tipo == Tipo_Dato.NUMERIC and self.opDer.tipo.tipo == Tipo_Dato.DOUBLE_PRECISION: self.tipo = Tipo(Tipo_Dato.DOUBLE_PRECISION) return self.tipo else: error = Excepcion('42883',"Semántico","el operador no existe: "+self.opIzq.tipo.toString()+" - "+self.opDer.tipo.toString(),self.linea,self.columna) arbol.excepciones.append(error) arbol.consola.append(error.toString()) return error elif self.operador == '*': if self.opIzq.tipo.tipo == Tipo_Dato.INTEGER and self.opDer.tipo.tipo == Tipo_Dato.INTEGER: self.tipo = Tipo(Tipo_Dato.INTEGER) return self.tipo elif self.opIzq.tipo.tipo == Tipo_Dato.NUMERIC and self.opDer.tipo.tipo == Tipo_Dato.NUMERIC: self.tipo = Tipo(Tipo_Dato.NUMERIC) return self.tipo elif self.opIzq.tipo.tipo == Tipo_Dato.NUMERIC and self.opDer.tipo.tipo == Tipo_Dato.INTEGER: self.tipo = Tipo(Tipo_Dato.NUMERIC) return self.tipo elif self.opIzq.tipo.tipo == Tipo_Dato.INTEGER and self.opDer.tipo.tipo == Tipo_Dato.NUMERIC: self.tipo = Tipo(Tipo_Dato.NUMERIC) return self.tipo elif self.opIzq.tipo.tipo == Tipo_Dato.DOUBLE_PRECISION and self.opDer.tipo.tipo == Tipo_Dato.DOUBLE_PRECISION: self.tipo = Tipo(Tipo_Dato.DOUBLE_PRECISION) return self.tipo elif self.opIzq.tipo.tipo == Tipo_Dato.DOUBLE_PRECISION and self.opDer.tipo.tipo == Tipo_Dato.INTEGER: self.tipo = Tipo(Tipo_Dato.DOUBLE_PRECISION) return self.tipo elif self.opIzq.tipo.tipo == Tipo_Dato.INTEGER and self.opDer.tipo.tipo == Tipo_Dato.DOUBLE_PRECISION: self.tipo = Tipo(Tipo_Dato.DOUBLE_PRECISION) return self.tipo elif self.opIzq.tipo.tipo == Tipo_Dato.DOUBLE_PRECISION and self.opDer.tipo.tipo == Tipo_Dato.NUMERIC: self.tipo = Tipo(Tipo_Dato.DOUBLE_PRECISION) return self.tipo elif self.opIzq.tipo.tipo == Tipo_Dato.NUMERIC and self.opDer.tipo.tipo == Tipo_Dato.DOUBLE_PRECISION: self.tipo = Tipo(Tipo_Dato.DOUBLE_PRECISION) return self.tipo else: error = Excepcion('42883',"Semántico","el operador no existe: "+self.opIzq.tipo.toString()+" - "+self.opDer.tipo.toString(),self.linea,self.columna) arbol.excepciones.append(error) arbol.consola.append(error.toString()) return error elif self.operador == '/': if self.opIzq.tipo.tipo == Tipo_Dato.INTEGER and self.opDer.tipo.tipo == Tipo_Dato.INTEGER: if resultadoDer == 0: error = Excepcion('42883',"Semántico","No se puede dividir entre cero",self.linea,self.columna) arbol.excepciones.append(error) arbol.consola.append(error.toString()) return error self.tipo = Tipo(Tipo_Dato.INTEGER) return self.tipo elif self.opIzq.tipo.tipo == Tipo_Dato.NUMERIC and self.opDer.tipo.tipo == Tipo_Dato.NUMERIC: if resultadoDer == 0: error = Excepcion('42883',"Semántico","No se puede dividir entre cero",self.linea,self.columna) arbol.excepciones.append(error) arbol.consola.append(error.toString()) return error self.tipo = Tipo(Tipo_Dato.NUMERIC) return self.tipo elif self.opIzq.tipo.tipo == Tipo_Dato.NUMERIC and self.opDer.tipo.tipo == Tipo_Dato.INTEGER: if resultadoDer == 0: error = Excepcion('42883',"Semántico","No se puede dividir entre cero",self.linea,self.columna) arbol.excepciones.append(error) arbol.consola.append(error.toString()) return error self.tipo = Tipo(Tipo_Dato.NUMERIC) return self.tipo elif self.opIzq.tipo.tipo == Tipo_Dato.INTEGER and self.opDer.tipo.tipo == Tipo_Dato.NUMERIC: if resultadoDer == 0: error = Excepcion('42883',"Semántico","No se puede dividir entre cero",self.linea,self.columna) arbol.excepciones.append(error) arbol.consola.append(error.toString()) return error self.tipo = Tipo(Tipo_Dato.NUMERIC) return self.tipo elif self.opIzq.tipo.tipo == Tipo_Dato.DOUBLE_PRECISION and self.opDer.tipo.tipo == Tipo_Dato.DOUBLE_PRECISION: if resultadoDer == 0: error = Excepcion('42883',"Semántico","No se puede dividir entre cero",self.linea,self.columna) arbol.excepciones.append(error) arbol.consola.append(error.toString()) return error self.tipo = Tipo(Tipo_Dato.DOUBLE_PRECISION) return self.tipo elif self.opIzq.tipo.tipo == Tipo_Dato.DOUBLE_PRECISION and self.opDer.tipo.tipo == Tipo_Dato.INTEGER: if resultadoDer == 0: error = Excepcion('42883',"Semántico","No se puede dividir entre cero",self.linea,self.columna) arbol.excepciones.append(error) arbol.consola.append(error.toString()) return error self.tipo = Tipo(Tipo_Dato.DOUBLE_PRECISION) return self.tipo elif self.opIzq.tipo.tipo == Tipo_Dato.INTEGER and self.opDer.tipo.tipo == Tipo_Dato.DOUBLE_PRECISION: if resultadoDer == 0: error = Excepcion('42883',"Semántico","No se puede dividir entre cero",self.linea,self.columna) arbol.excepciones.append(error) arbol.consola.append(error.toString()) return error self.tipo = Tipo(Tipo_Dato.DOUBLE_PRECISION) return self.tipo elif self.opIzq.tipo.tipo == Tipo_Dato.DOUBLE_PRECISION and self.opDer.tipo.tipo == Tipo_Dato.NUMERIC: if resultadoDer == 0: error = Excepcion('42883',"Semántico","No se puede dividir entre cero",self.linea,self.columna) arbol.excepciones.append(error) arbol.consola.append(error.toString()) return error self.tipo = Tipo(Tipo_Dato.DOUBLE_PRECISION) return self.tipo elif self.opIzq.tipo.tipo == Tipo_Dato.NUMERIC and self.opDer.tipo.tipo == Tipo_Dato.DOUBLE_PRECISION: if resultadoDer == 0: error = Excepcion('42883',"Semántico","No se puede dividir entre cero",self.linea,self.columna) arbol.excepciones.append(error) arbol.consola.append(error.toString()) return error self.tipo = Tipo(Tipo_Dato.DOUBLE_PRECISION) return self.tipo else: error = Excepcion('42883',"Semántico","el operador no existe: "+self.opIzq.tipo.toString()+" / "+self.opDer.tipo.toString(),self.linea,self.columna) arbol.excepciones.append(error) arbol.consola.append(error.toString()) return error elif self.operador == '^': if self.opIzq.tipo.tipo == Tipo_Dato.INTEGER and self.opDer.tipo.tipo == Tipo_Dato.INTEGER: self.tipo = Tipo(Tipo_Dato.DOUBLE_PRECISION) return self.tipo elif self.opIzq.tipo.tipo == Tipo_Dato.NUMERIC and self.opDer.tipo.tipo == Tipo_Dato.NUMERIC: self.tipo = Tipo(Tipo_Dato.NUMERIC) return self.tipo elif self.opIzq.tipo.tipo == Tipo_Dato.NUMERIC and self.opDer.tipo.tipo == Tipo_Dato.INTEGER: self.tipo = Tipo(Tipo_Dato.NUMERIC) return self.tipo elif self.opIzq.tipo.tipo == Tipo_Dato.INTEGER and self.opDer.tipo.tipo == Tipo_Dato.NUMERIC: self.tipo = Tipo(Tipo_Dato.NUMERIC) return self.tipo elif self.opIzq.tipo.tipo == Tipo_Dato.DOUBLE_PRECISION and self.opDer.tipo.tipo == Tipo_Dato.DOUBLE_PRECISION: self.tipo = Tipo(Tipo_Dato.DOUBLE_PRECISION) return self.tipo elif self.opIzq.tipo.tipo == Tipo_Dato.DOUBLE_PRECISION and self.opDer.tipo.tipo == Tipo_Dato.INTEGER: self.tipo = Tipo(Tipo_Dato.DOUBLE_PRECISION) return self.tipo elif self.opIzq.tipo.tipo == Tipo_Dato.INTEGER and self.opDer.tipo.tipo == Tipo_Dato.DOUBLE_PRECISION: self.tipo = Tipo(Tipo_Dato.DOUBLE_PRECISION) return self.tipo elif self.opIzq.tipo.tipo == Tipo_Dato.DOUBLE_PRECISION and self.opDer.tipo.tipo == Tipo_Dato.NUMERIC: self.tipo = Tipo(Tipo_Dato.DOUBLE_PRECISION) return self.tipo elif self.opIzq.tipo.tipo == Tipo_Dato.NUMERIC and self.opDer.tipo.tipo == Tipo_Dato.DOUBLE_PRECISION: self.tipo = Tipo(Tipo_Dato.DOUBLE_PRECISION) return self.tipo else: error = Excepcion('42883',"Semántico","el operador no existe: "+self.opIzq.tipo.toString()+" ^ "+self.opDer.tipo.toString(),self.linea,self.columna) arbol.excepciones.append(error) arbol.consola.append(error.toString()) return error elif self.operador == '%': if self.opIzq.tipo.tipo == Tipo_Dato.INTEGER and self.opDer.tipo.tipo == Tipo_Dato.INTEGER: if resultadoDer == 0: error = Excepcion('42883',"Semántico","División entera o módulo por cero",self.linea,self.columna) arbol.excepciones.append(error) arbol.consola.append(error.toString()) return error self.tipo = Tipo(Tipo_Dato.INTEGER) return self.tipo elif self.opIzq.tipo.tipo == Tipo_Dato.NUMERIC and self.opDer.tipo.tipo == Tipo_Dato.NUMERIC: if resultadoDer == 0: error = Excepcion('42883',"Semántico","División entera o módulo por cero",self.linea,self.columna) arbol.excepciones.append(error) arbol.consola.append(error.toString()) return error self.tipo = Tipo(Tipo_Dato.NUMERIC) return self.tipo elif self.opIzq.tipo.tipo == Tipo_Dato.INTEGER and self.opDer.tipo.tipo == Tipo_Dato.NUMERIC: if resultadoDer == 0: error = Excepcion('42883',"Semántico","División entera o módulo por cero",self.linea,self.columna) arbol.excepciones.append(error) arbol.consola.append(error.toString()) return error self.tipo = Tipo(Tipo_Dato.NUMERIC) return self.tipo elif self.opIzq.tipo.tipo == Tipo_Dato.NUMERIC and self.opDer.tipo.tipo == Tipo_Dato.INTEGER: if resultadoDer == 0: error = Excepcion('42883',"Semántico","División entera o módulo por cero",self.linea,self.columna) arbol.excepciones.append(error) arbol.consola.append(error.toString()) return error self.tipo = Tipo(Tipo_Dato.NUMERIC) return self.tipo else: error = Excepcion('42883',"Semántico","el operador no existe: "+self.opIzq.tipo.toString()+" % "+self.opDer.tipo.toString(),self.linea,self.columna) arbol.excepciones.append(error) arbol.consola.append(error.toString()) return error else: error = Excepcion('42883',"Semántico","Operador desconocido.",self.linea,self.columna) arbol.excepciones.append(error) arbol.consola.append(error.toString()) return error # Operación unaria else: # Si existe algún error en el operador izquierdo, retorno el error. resultadoIzq = self.opIzq.ejecutar(tabla, arbol) if isinstance(resultadoIzq, Excepcion): return resultadoIzq if self.operador == '-': if self.opIzq.tipo.tipo == Tipo_Dato.INTEGER: self.tipo = Tipo(Tipo_Dato.INTEGER) return self.tipo if self.opIzq.tipo.tipo == Tipo_Dato.NUMERIC: self.tipo = Tipo(Tipo_Dato.NUMERIC) return self.tipo if self.opIzq.tipo.tipo == Tipo_Dato.DOUBLE_PRECISION: self.tipo = Tipo(Tipo_Dato.DOUBLE_PRECISION) return self.tipo else: error = Excepcion('42883',"Semántico","Tipo de datos incorrectos en la operación negativo",self.linea,self.columna) arbol.excepciones.append(error) arbol.consola.append(error.toString()) return error else: error = Excepcion('42883',"Semántico","Operador desconocido.",self.linea,self.columna) arbol.excepciones.append(error) arbol.consola.append(error.toString()) return error return None
def __init__(self, valor, strGram, linea, columna): Instruccion.__init__(self,Tipo(Tipo_Dato.NUMERIC),linea,columna,strGram) self.valor = valor
def ejecutar(self, tabla, arbol): super().ejecutar(tabla, arbol) prim = None strGram = "" if self.tipo.tipo == Tipo_Dato.SMALLINT: prim = Primitivo(0, Tipo(Tipo_Dato.SMALLINT), strGram, 0, 0) elif self.tipo.tipo == Tipo_Dato.INTEGER: prim = Primitivo(0, Tipo(Tipo_Dato.INTEGER), strGram, 0, 0) elif self.tipo.tipo == Tipo_Dato.BIGINT: prim = Primitivo(0, Tipo(Tipo_Dato.BIGINT), strGram, 0, 0) elif self.tipo.tipo == Tipo_Dato.DECIMAL: prim = Primitivo(0, Tipo(Tipo_Dato.DECIMAL), strGram, 0, 0) elif self.tipo.tipo == Tipo_Dato.NUMERIC: prim = Primitivo(0, Tipo(Tipo_Dato.NUMERIC), strGram, 0, 0) elif self.tipo.tipo == Tipo_Dato.REAL: prim = Primitivo(0, Tipo(Tipo_Dato.REAL), strGram, 0, 0) elif self.tipo.tipo == Tipo_Dato.DOUBLE_PRECISION: prim = Primitivo(0, Tipo(Tipo_Dato.DOUBLE_PRECISION), strGram, 0, 0) elif self.tipo.tipo == Tipo_Dato.MONEY: prim = Primitivo(0, Tipo(Tipo_Dato.MONEY), strGram, 0, 0) elif self.tipo.tipo == Tipo_Dato.DATE: prim = Primitivo('1900-01-01', Tipo(Tipo_Dato.DATE), strGram, 0, 0) elif self.tipo.tipo == Tipo_Dato.TIMESTAMP: prim = Primitivo('1900-01-01', Tipo(Tipo_Dato.TIMESTAMP), strGram, 0, 0) elif self.tipo.tipo == Tipo_Dato.TIME: prim = Primitivo('1900-01-01', Tipo(Tipo_Dato.DATE), strGram, 0, 0) elif self.tipo.tipo == Tipo_Dato.BOOLEAN: prim = Primitivo(True, Tipo(Tipo_Dato.BOOLEAN), strGram, 0, 0) variable = Simbolo(self.nombre, self.tipo, prim.valor, 0, 0) resultadoInsertar = tabla.setVariable(variable) if resultadoInsertar != None: error = Excepcion("100", "Semantico", "La columna " + self.nombre + " yo existe", self.linea, self.columna) arbol.excepciones.append(error) arbol.consola.append(error.toString()) return error if self.expresion != None: resultado = self.expresion.ejecutar(tabla, arbol) if isinstance(resultado, Excepcion): return resultado return True
def __init__(self, strGram,linea, columna): Instruccion.__init__(self,Tipo(Tipo_Dato.TIMESTAMP),linea,columna,strGram)
def __init__(self, opIzq, opDer, strGram, linea, columna): Instruccion.__init__(self, Tipo(Tipo_Dato.NUMERIC), linea, columna, strGram) self.opIzq = opIzq self.opDer = opDer
def __init__(self, id, tipo, linea, columna): Instruccion.__init__(self, Tipo(Tipo_Dato.TIPOENUM), linea, columna, "") self.id = id self.listaValores = []
def __init__(self, id, strGram, linea, columna): Instruccion.__init__(self, Tipo(Tipo_Dato.ID), linea, columna, strGram) self.id = id