示例#1
0
 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)
示例#2
0
    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
示例#3
0
 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
示例#4
0
 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
示例#5
0
 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)
示例#6
0
 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
示例#7
0
文件: Trim.py 项目: sandymerida/tytus
 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
示例#8
0
 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
示例#9
0
    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
示例#10
0
 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
示例#11
0
    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
        '''
示例#12
0
 def __init__(self, lista, strGram, linea, columna):
     Instruccion.__init__(self, Tipo(Tipo_Dato.QUERY), linea, columna,
                          strGram)
     self.lista = lista
示例#13
0
 def __init__(self, valor, strGram, linea, columna):
     Instruccion.__init__(self,Tipo(Tipo_Dato.DOUBLE_PRECISION),linea,columna,strGram)
     self.valor = valor
示例#14
0
 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
示例#15
0
 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
示例#16
0
 def __init__(self, valor, strGram, linea, columna):
     Instruccion.__init__(self,Tipo(Tipo_Dato.NUMERIC),linea,columna,strGram)
     self.valor = valor
示例#17
0
    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
示例#18
0
文件: Now.py 项目: sandymerida/tytus
 def __init__(self, strGram,linea, columna):
     Instruccion.__init__(self,Tipo(Tipo_Dato.TIMESTAMP),linea,columna,strGram)
示例#19
0
 def __init__(self, opIzq, opDer, strGram, linea, columna):
     Instruccion.__init__(self, Tipo(Tipo_Dato.NUMERIC), linea, columna,
                          strGram)
     self.opIzq = opIzq
     self.opDer = opDer
示例#20
0
 def __init__(self, id, tipo, linea, columna):
     Instruccion.__init__(self, Tipo(Tipo_Dato.TIPOENUM), linea, columna,
                          "")
     self.id = id
     self.listaValores = []
示例#21
0
 def __init__(self, id, strGram, linea, columna):
     Instruccion.__init__(self, Tipo(Tipo_Dato.ID), linea, columna, strGram)
     self.id = id