예제 #1
0
def p_funciones2(p):  #ya
    'funciones : SUBSTRING PABRE ID COMA NUMERO COMA NUMERO PCIERRA'
    p[0] = FuncionCadena(funcion='SUBSTRING',
                         parametro1=ExpresionID(p[3], p.slice[1].lineno),
                         parametro2=ExpresionNumero(p[5], TIPO_DE_DATO.ENTERO,
                                                    p.slice[2].lineno),
                         parametro3=ExpresionNumero(p[7], TIPO_DE_DATO.ENTERO,
                                                    p.slice[2].lineno),
                         linea=p.slice[2].lineno)
예제 #2
0
 def metodo_width_bucket(self , lista_numeros , ts):
     if len(lista_numeros) == 4:
         #EXPRESION , MIN_VALLUE , MAX_VALUE , N_BLOQUES
         valorPrueba = lista_numeros[0].ejecutar(ts)
         if isinstance(valorPrueba , ErrorReport):
             return valorPrueba
         rangoInicial = lista_numeros[1].ejecutar(ts)
         if isinstance(rangoInicial , ErrorReport):
             return rangoInicial
         rangoMax = lista_numeros[2].ejecutar(ts)
         if isinstance(rangoMax , ErrorReport):
             return rangoMax
         nBloques = lista_numeros[3].ejecutar(ts)
         if isinstance(nBloques , ErrorReport):
             return nBloques
         # validacion de tipo numerico , 
         if not isinstance(valorPrueba , ExpresionNumero):
             return ErrorReport('sintactico', 'Error solo se acepta un tipo numero' ,self.linea)
         if not isinstance(rangoInicial, ExpresionNumero):
             return ErrorReport('sintactico', 'Error solo se acepta un tipo numero' ,self.linea)
         if not isinstance(rangoMax, ExpresionNumero):
             return ErrorReport('sintactico', 'Error solo se acepta un tipo numero' ,self.linea)
         if not isinstance(nBloques, ExpresionNumero):
             return ErrorReport('sintactico', 'Error solo se acepta un tipo numero' ,self.linea)
         if not self.getTipo(nBloques.val) == TIPO_DE_DATO.ENTERO:
             return ErrorReport('sintactico', 'Error solo se acepta un ENTERO en el ultimo parametro' ,self.linea)
             
         # dando los meros valores
         valorPrueba = valorPrueba.val
         rangoInicial = rangoInicial.val
         rangoMax = rangoMax.val
         nBloques = nBloques.val            
         if valorPrueba >= rangoMax:
             return ExpresionNumero(1 + nBloques,TIPO_DE_DATO.ENTERO,self.linea)
         elif valorPrueba < rangoInicial:
             return ExpresionNumero( (1-1)*0  , TIPO_DE_DATO.ENTERO,self.linea)
         else:
             diferencia = rangoMax-rangoInicial
             subIntervalos = diferencia/nBloques # _ , _ , _ , _ 
             auxUbicacion = 1
             aux = rangoInicial + subIntervalos
         while(not valorPrueba < aux):                    
             #print(str(aux - subIntervalos) +' , ' + str(aux))
             aux += subIntervalos
             auxUbicacion +=1
         return ExpresionNumero(auxUbicacion, TIPO_DE_DATO.ENTERO,self.linea)
     else:
         return ErrorReport('sintactico', 'error en width_bucket se esperaba solo 4 parametros' ,self.linea)
예제 #3
0
 def ejecutar(self, ts):
     
     if self.parametro2 != None and self.parametro3 != None: # 3 PARAMETROS
         res1 = self.parametro1.ejecutar(ts)
         res2 = self.parametro2.ejecutar(ts)
         res3 = self.parametro3.ejecutar(ts)
         if isinstance(res1 , ErrorReport):
             return res1
         if isinstance(res2 , ErrorReport):
             return res2
         if isinstance(res3 , ErrorReport):
             return res3
         
         if self.funcion == "SUBSTRING" or self.funcion == "SUBSTR":
             if isinstance(res1 , ExpresionID) or isinstance(res1 , ExpresionCadena):
                 if isinstance(res2 , ExpresionNumero) or isinstance(res3 , ExpresionNumero):
                     if res2.tipo == TIPO_DE_DATO.ENTERO and res3.tipo == TIPO_DE_DATO.ENTERO:
                         print("RETORNA: "+ str(res1)[int(res2.val) : int(res3.val)])
                         return ExpresionCadena(str(res1)[int(res2.val) : int(res3.val)], TIPO_DE_DATO.CADENA , self.linea)
                 # si no entra hasta el ultimo if  llega aca 
                 return ErrorReport('semantico', 'error de tipo en el parametro 2 o parametro 3' ,self.linea)
             else:
                 return ErrorReport('semantico', 'error de tipo en el parametro 1' ,self.linea)
        
         
     elif self.parametro2 != None:       # 2 PARAMETROS
         print("2 parametros")
         
     elif self.parametro1 != None:       # 1 PARAMETRO
         nodoSimplificado = self.parametro1.ejecutar(ts)
         if isinstance(nodoSimplificado , ErrorReport):
             return nodoSimplificado # SOLO SE SUBE EL ERROR
     
         if self.funcion == "LENGTH":
             if  isinstance(nodoSimplificado , ExpresionCadena) or isinstance(nodoSimplificado , ExpresionID):
                 print("RETORNA: "+ str(len(nodoSimplificado.val)))
                 return ExpresionNumero(len(nodoSimplificado.val), TIPO_DE_DATO.ENTERO , self.linea)
             else:
                 return ErrorReport('semantico', 'error de tipo' ,self.linea)
         elif self.funcion == "TRIM":
             if  isinstance(nodoSimplificado , ExpresionCadena) or isinstance(nodoSimplificado , ExpresionID):
                 print("RETORNA: "+ str((nodoSimplificado.val)).strip())
                 return ExpresionCadena(str((nodoSimplificado.val)).strip(), TIPO_DE_DATO.CADENA , self.linea)
             else:
                 return ErrorReport('semantico', 'error de tipo' ,self.linea)
         elif self.funcion == "MD5":
             if  isinstance(nodoSimplificado , ExpresionCadena) or isinstance(nodoSimplificado , ExpresionID):
                 return ExpresionCadena(hashlib.md5(nodoSimplificado.val.encode()).hexdigest(), TIPO_DE_DATO.CADENA , self.linea)
             else:
                 return ErrorReport('semantico', 'error de tipo' ,self.linea)
         elif self.funcion == "SHA256":
             if  isinstance(nodoSimplificado , ExpresionCadena) or isinstance(nodoSimplificado , ExpresionID):
                 return ExpresionCadena(hashlib.sha256(nodoSimplificado.val.encode()).hexdigest(), TIPO_DE_DATO.CADENA , self.linea)
예제 #4
0
 def ejecutar(self, ts):
     unario = self.exp.ejecutar(ts)
     if isinstance(unario , ErrorReport):
         return unario # si ya viene un error solo lo retorna
     if not (isinstance(unario , ExpresionNumero)):
         return ErrorReport('semantico', f'Error , Tipe Invalido UNARIO {self.operador}' ,self.linea)
 
     
     try:# CASOS DE EJECUCION
         if self.operador == "~":
             if GET_TIPO(unario.val) == TIPO_DE_DATO.ENTERO:
                 return ExpresionNumero(~ unario.val, GET_TIPO(unario.val), self.linea)
             else:
                 return ErrorReport('semantico', 'error operador Unario ~ solo recibe ENTEROS' ,self.linea)
         elif self.operador =="|": # SACA LA RAIZ CUADRADA
                 if (unario.val) < 0:
                     return ErrorReport('semantico', 'error operador Unario | solo recibe numeros POSITIVOS' ,self.linea)
                     valor = unario.val**(1/2)
                     return ExpresionNumero(valor,GET_TIPO(valor),self.linea)
         elif self.operador =="||": # SACA LA RAIZ CUBICA
                     valor = raizCubica(unario.val)
                     return ExpresionNumero(valor,GET_TIPO(valor),self.linea)    
     except:
         return ErrorReport('semantico', f'Error: Tipe Invalido UNARIO {self.operador}' ,self.linea)  
예제 #5
0
    def ejecutar(self, ts = None):            
        if self.parametro2 != None: # 2 PARAMETROS
            nodoSyn1 = self.parametro1.ejecutar(ts)
            if isinstance(nodoSyn1 , ErrorReport):
                return nodoSyn1
            nodoSyn2 = self.parametro2.ejecutar(ts)
            if isinstance(nodoSyn2 , ErrorReport):
                return nodoSyn2

            if isinstance(nodoSyn1 , ExpresionNumero) and isinstance(nodoSyn2 , ExpresionNumero):
                
                if self.funcion == "ATAN2":
                    rads = math.atan2(nodoSyn1.val,nodoSyn2.val)
                    return ExpresionNumero(rads,self.getTipo(rads),self.linea) 
                
                if self.funcion == "ATAN2D":
                    rads = math.atan2(nodoSyn1.val,nodoSyn2.val)
                    grados = (rads * 180/math.pi)
                    return ExpresionNumero(grados,self.getTipo(grados),self.linea)
                
                if self.funcion == "DIV":
                    
                    izq = nodoSyn1.val
                    der = nodoSyn2.val
                    if der == 0:
                        return ErrorReport('semantico', 'error DIVISION entre 0' ,self.linea)
                    valor = izq/der
                    return ExpresionNumero(valor,self.getTipo(valor),self.linea)
                
                if self.funcion =="GCD":
                    valor = math.gcd(nodoSyn1.val , nodoSyn2.val)
                    return ExpresionNumero(valor,self.getTipo(valor),self.linea)
                
                if self.funcion =="MOD":
                    try:
                        valor = (nodoSyn1.val % nodoSyn2.val)
                        return ExpresionNumero(valor,self.getTipo(valor),self.linea)                  
                    except:
                        return ErrorReport('semantico', 'error en MODULO' ,self.linea) 
                
                if self.funcion =="POWER":
                    try:
                        valor = (nodoSyn1.val ** nodoSyn2.val)
                        return ExpresionNumero(valor,self.getTipo(valor),self.linea)                  
                    except:
                        return ErrorReport('semantico', 'error en MODULO' ,self.linea)
                
                if self.funcion =="ROUND":
                    valor = round(nodoSyn1.val , nodoSyn2.val)
                    return ExpresionNumero(valor,self.getTipo(valor),self.linea)
                
                if self.funcion == "TRUNC": 
                    if self.getTipo(nodoSyn2.val) != TIPO_DE_DATO.ENTERO:
                        return ErrorReport('semantico', 'error en Metodo TRUNC el segundo parametro tiene que ser un entero' ,self.linea)
                    cadenaInt = str(nodoSyn1.val)
                    numero_truncado = ''
                    indice = 0
                    decimalesAdjuntados = 0
                    for i in range(len(cadenaInt)):
                        if cadenaInt[i] == '.':
                            numero_truncado += cadenaInt[i]
                            indice = i
                            break
                        else:
                            numero_truncado += cadenaInt[i]
                    indice+=1        
                    while(decimalesAdjuntados < nodoSyn2.val):
                        
                        if  indice < len(cadenaInt):
                            numero_truncado += cadenaInt[indice]
                        else:
                            numero_truncado += '0'
                        
                        indice+=1
                        decimalesAdjuntados+=1
                    valor = float(numero_truncado)
                    return ExpresionNumero(valor,self.getTipo(valor),self.linea) 
            else:
                return ErrorReport('semantico', 'error de tipo, se esperaba un ENTERO O DECIMAL' ,self.linea)
        elif self.parametro1 != None: # 1 PARAMETRO
            
            if  isinstance(self.parametro1,list):
                if self.funcion =="WIDTH_BUCKET":
                    return self.metodo_width_bucket(self.parametro1,ts)
            
            
            nodoSyn1 = self.parametro1.ejecutar(ts)
            if isinstance(nodoSyn1 , ErrorReport):
                return nodoSyn1
            
            if isinstance(nodoSyn1 , ExpresionNumero): # decimales y eneteros
                if self.funcion == "ACOS": # RADIANEES
                    if nodoSyn1.val > 1 or nodoSyn1.val < 1:
                        return ErrorReport('semantico', 'Error en ACOS ,el parametro debe estar entre -1 y 1' ,self.linea)   
                    return ExpresionNumero(math.acos(nodoSyn1.val),self.getTipo(nodoSyn1.val),self.linea)
                
                if self.funcion == "ACOSD": # GRADOS 
                    if nodoSyn1.val > 1 or nodoSyn1.val < 1:
                        return ErrorReport('semantico', 'Error en ACOSD , el parametro debe estar entre -1 y 1' ,self.linea)   
                    rads = math.acos(nodoSyn1.val)
                    grados = (rads * 180/math.pi)
                    return ExpresionNumero(grados,self.getTipo(grados),self.linea)
                
                if self.funcion == "ASIN":
                    if nodoSyn1.val > 1 or nodoSyn1.val < 1:
                        return ErrorReport('semantico', 'Error en ASIN ,el parametro debe estar entre -1 y 1' ,self.linea)   
                    valor = math.asin(nodoSyn1.val)
                    return ExpresionNumero(valor,self.getTipo(valor),self.linea)
                
                if self.funcion == "ASIND":
                    if nodoSyn1.val > 1 or nodoSyn1.val < 1:
                        return ErrorReport('semantico', 'Error en ASIND ,el parametro debe estar entre -1 y 1' ,self.linea)   
                    rads = math.asin(nodoSyn1.val)
                    grados = (rads * 180/math.pi)
                    return ExpresionNumero(grados,self.getTipo(grados),self.linea)
                
                if self.funcion == "ATAN":
                    try:
                        rads = math.atan(nodoSyn1.val)
                        return ExpresionNumero(rads,self.getTipo(rads),self.linea)
                    except:
                        return ErrorReport('semantico', 'Error en ATAN por el valor del parametro ' ,self.linea)

                if self.funcion == "ATAND":    
                    try:
                        rads = math.atan(nodoSyn1.val)
                        grados = (rads * 180/math.pi)
                        return ExpresionNumero(grados,self.getTipo(grados),self.linea)
                    except:
                        return ErrorReport('semantico', 'Error en ATAND por el valor del parametro ' ,self.linea)

                if self.funcion == "COS":
                    valor = math.cos(nodoSyn1.val)
                    return ExpresionNumero(valor,self.getTipo(valor),self.linea)
                
                if self.funcion == "COSD":
                    rads = math.cos(nodoSyn1.val)
                    grados = (rads * 180/math.pi)
                    return ExpresionNumero(grados,self.getTipo(grados),self.linea)
                
                if self.funcion == "COT":
                    tangente=math.tan(nodoSyn1.val)
                    if tangente == 0:
                        return ErrorReport('semantico', 'Error en COT por el valor del parametro ' ,self.linea)
                    cot = 1 / tangente   
                    return ExpresionNumero(cot,self.getTipo(cot),self.linea)
                
                if self.funcion == "COTD":
                    tangente=math.tan(nodoSyn1.val)
                    if tangente == 0:
                        return ErrorReport('semantico', 'Error en COTD por el valor del parametro ' ,self.linea)
                    cot =math.degrees(1 / tangente)    
                    return ExpresionNumero(cot,self.getTipo(cot),self.linea)  

                if self.funcion == "SIN":
                    radianes=math.sin(nodoSyn1.val)
                    return ExpresionNumero(radianes,self.getTipo(radianes),self.linea)  
            
                if self.funcion == "SIND":
                    grados=math.degrees(math.sin(nodoSyn1.val))
                    return ExpresionNumero(grados,self.getTipo(grados),self.linea)
            
                if self.funcion == "TAN":
                    try:
                        radianes=math.tan(nodoSyn1.val)
                        return ExpresionNumero(radianes,self.getTipo(radianes),self.linea) 
                    except:
                        return ErrorReport('semantico', 'Error en TAN por el valor del parametro ' ,self.linea)

                if self.funcion == "TAND":
                    try:
                        grados=math.degrees(math.tan(nodoSyn1.val))
                        return ExpresionNumero(grados,self.getTipo(grados),self.linea) 
                    except:
                        return ErrorReport('semantico', 'Error en TAND por el valor del parametro ' ,self.linea)
                
                if self.funcion == "COSH":
                    try:
                        valor=math.cosh(nodoSyn1.val)
                        return ExpresionNumero(valor,self.getTipo(valor),self.linea) 
                    except:
                        return ErrorReport('semantico', 'Error en COSH por el valor del parametro ' ,self.linea)
                    
                
                if self.funcion == "SINH":
                    try:
                        valor=math.sinh(nodoSyn1.val)
                        return ExpresionNumero(valor,self.getTipo(valor),self.linea) 
                    except:
                        return ErrorReport('semantico', 'Error en SINH por el valor del parametro ' ,self.linea)
                    
                if self.funcion == "TANH":
                    try:
                        valor=math.tanh(nodoSyn1.val)
                        return ExpresionNumero(valor,self.getTipo(valor),self.linea) 
                    except:
                        return ErrorReport('semantico', 'Error en TANH por el valor del parametro ' ,self.linea)
                    
                    
                if self.funcion == "ACOSH":
                    if nodoSyn1.val < 1:
                        return ErrorReport('semantico', 'Error en ACOSH, el parametro debe de ser mayor o igual a 1 ' ,self.linea)
                    valor=math.acosh(nodoSyn1.val)
                    return ExpresionNumero(valor,self.getTipo(valor),self.linea)
                
                if self.funcion == "ASINH":
                    valor=math.asinh(nodoSyn1.val)
                    return ExpresionNumero(valor,self.getTipo(valor),self.linea)
                
                if self.funcion == "ATANH":
                    if nodoSyn1.val > 0.99 or nodoSyn1.val < -0.99:
                        return ErrorReport('semantico', 'Error en ATANH, el parametro debe estar entre 0.99 y -0.99 ' ,self.linea)
                    valor=math.atanh(nodoSyn1.val)
                    return ExpresionNumero(valor,self.getTipo(valor),self.linea)
                
                #_________________________________ fin de trigonometricas
                
                if self.funcion == "ABS":
                    valor=math.fabs(nodoSyn1.val)                    
                    return ExpresionNumero(valor,self.getTipo(valor),self.linea)

                    
                if self.funcion == "CBRT": #RAIZ CUBICA SOLO PARA ENTREROS
                    if (nodoSyn1.val % 1) == 0:
                        valor = raizCubica(nodoSyn1.val)
                        return ExpresionNumero(valor,self.getTipo(valor),self.linea)  
                    else:
                        return ErrorReport('semantico', 'error CBRT solo recibe enteros, NO decimales' ,self.linea)
                
                if self.funcion =="CEIL" or self.funcion == "CEILING":
                    valor = math.ceil(nodoSyn1.val)
                    return ExpresionNumero(valor,self.getTipo(valor),self.linea)
                
                if self.funcion =="DEGREES":
                    valor = math.degrees(nodoSyn1.val)
                    return ExpresionNumero(valor,self.getTipo(valor),self.linea)
                
                if self.funcion =="FACTORIAL":
                    valor = math.factorial(nodoSyn1.val)
                    return ExpresionNumero(valor,self.getTipo(valor),self.linea)
                
                if self.funcion =="FLOOR":# POR SI VIENE EN UN INSERT  
                    valor = math.floor(nodoSyn1.val)
                    return ExpresionNumero(valor,self.getTipo(valor),self.linea)
                
                                
                if self.funcion =="LN":
                    try:
                        valor = math.log(nodoSyn1.val)
                        return  ExpresionNumero(valor,self.getTipo(valor),self.linea)
                    except :
                        return ErrorReport('semantico', 'error en el paramtro de LN' ,self.linea)

                
                if self.funcion =="LOG":
                    try:
                        valor = math.log10(nodoSyn1.val)
                        return  ExpresionNumero(valor,self.getTipo(valor),self.linea)    
                    except :
                        return ErrorReport('semantico', 'error en el paramtro de LOG' ,self.linea)
                
                if self.funcion =="EXP":
                    try:
                        valor = math.exp(nodoSyn1.val)
                        return  ExpresionNumero(valor,self.getTipo(valor),self.linea)    
                    except :
                        return ErrorReport('semantico', 'error en el paramtro de EXP' ,self.linea) 
                    
                if self.funcion =="RADIANS":
                    valor = math.radians(nodoSyn1.val)
                    return ExpresionNumero(valor,self.getTipo(valor),self.linea)

                if self.funcion =="ROUND":
                    valor = round(nodoSyn1.val)
                    return ExpresionNumero(valor,self.getTipo(valor),self.linea)
                    
                if self.funcion =="SIGN":
                    if nodoSyn1.val > 0:
                        valor = 1
                        return ExpresionNumero(valor,TIPO_DE_DATO.ENTERO,self.linea)
                    if nodoSyn1.val < 0:
                        valor = -1
                        return ExpresionNumero(valor,TIPO_DE_DATO.ENTERO,self.linea)
                    else:
                        return ErrorReport('semantico', 'error en funcion SING , EL 0 no tiene signo ' ,self.linea)
                if self.funcion == "SQRT":
                    if (nodoSyn1.val) < 0 :
                        return ErrorReport('semantico', 'error SQRT solo recibe enteros POSITIVOS' ,self.linea)
                    if (nodoSyn1.val % 1) == 0:
                        valor = nodoSyn1.val**(1/2)
                        return ExpresionNumero(valor,self.getTipo(valor),self.linea)  
                    else:
                        return ErrorReport('semantico', 'error SQRT solo recibe enteros, NO decimales' ,self.linea)
                
                if self.funcion == "TRUNC":
                    valor = math.trunc(nodoSyn1.val)
                    return ExpresionNumero(valor,TIPO_DE_DATO.ENTERO,self.linea)
 
                
                    
                    

            else:
                return ErrorReport('semantico', 'error de tipo, se esperaba un ENTERO O DECIMAL' ,self.linea)    
                
        
        else:# SIN PARAMETROS
            
            if self.funcion == 'PI':
                return ExpresionNumero(math.pi,TIPO_DE_DATO.DECIMAL,self.linea)
            elif self.funcion == "RANDOM":
                valor = random.choice((1,0))
                return ExpresionNumero(valor,TIPO_DE_DATO.ENTERO,self.linea)
예제 #6
0
    def ejecutar(self, ts):#los que pueden venir en el select 
        if self.parametro1 != None and self.parametro2 != None:        
            if self.funcion == "EXTRACT":
                
                self.parametro2 = str(self.parametro2).strip()
                # AHORA REVISANDO SI TIENE COHERENCIA
                
                try:# EL PARAMETRO 2 ES MI CADENA DATE , PARAMETRO 2 ESPERADO  yyyy-mm-dd hh:mm:dd
                    objetodate = datetime.strptime(self.parametro2, '%Y-%m-%d %H:%M:%S')
                except:
                    return ErrorReport('semantico', 'error Incoherencia con la cadena date' ,self.linea)
                
                if self.parametro1 == "YEAR":
                    anio = str(objetodate.year)
                    return ExpresionNumero(int(anio), TIPO_DE_DATO.ENTERO,self.linea)
                    
                elif self.parametro1 == "MONTH":
                    mes = str(objetodate.month)
                    return ExpresionNumero(int(mes), TIPO_DE_DATO.ENTERO,self.linea)
    
                elif self.parametro1 == "DAY":
                    dia = str(objetodate.day)
                    return ExpresionNumero(int(dia), TIPO_DE_DATO.ENTERO,self.linea)
                        
                elif self.parametro1 == "HOUR":
                    hora = str(objetodate.hour)
                    return ExpresionNumero(int(hora), TIPO_DE_DATO.ENTERO,self.linea)
                
                elif self.parametro1 == "MINUTE":
                    minuto = str(objetodate.minute)
                    return ExpresionNumero(int(minuto), TIPO_DE_DATO.ENTERO,self.linea)
                    
                elif self.parametro1 == "SECOND":
                    seg = str(objetodate.second)
                    return ExpresionNumero(int(seg), TIPO_DE_DATO.ENTERO,self.linea)
            elif self.funcion == "DATE_PART":
                
                self.parametro2 = self.parametro2.lower().strip()
                valores = {}
                lexema = self.parametro2[0]
                x = 1 
                while(x < len(self.parametro2)):
                    lexema += self.parametro2[x]
                    if self.parametro2[x] == "s" and self.parametro2[x-1] != " " :
                        lexema = lexema.strip()
                        key = ''
                        val = ''
                        posIniKey = 0 
                        for i in range( len(lexema)):
                            if lexema[i] == ' ':
                                break
                            else:
                                val += lexema[i]
                                posIniKey = i
                                posIniKey +=1
                        
                        while(posIniKey < len(lexema)):
                            key += lexema[posIniKey]
                            posIniKey+=1
                        lexema = ""
                        key = key.strip()
                        validacion = valores.get(key , 'ok')
                        
                        if validacion == 'ok':
                            valores[key] = val
                        else:
                            return ErrorReport('sintactico', 'ERROR:  la sintaxis de entrada no es válida para tipo interval' ,self.linea)            
                    x+=1
                    
                

                if self.parametro1 == "HOUR" or self.parametro1 == "HOURS":
                    
                    valor = valores.get('hours','NO_ESTA')
                    if valor == 'NO_ESTA':
                        return ErrorReport('semantico', 'solicitud de horas en Interaval y no fue especificado en la cadena' ,self.linea) 
                    else:
                        return ExpresionNumero(int(valor), TIPO_DE_DATO.ENTERO,self.linea)
                    
                elif self.parametro1 == "MINUTE" or self.parametro1 == "MINUTE":
                    
                    valor = valores.get('minutes','NO_ESTA')
                    if valor == 'NO_ESTA':
                        return ErrorReport('semantico', 'solicitud de minutos en Interaval y no fue especificado en la cadena' ,self.linea) 
                    else:
                        return ExpresionNumero(int(valor), TIPO_DE_DATO.ENTERO,self.linea)

                elif self.parametro1 == "SECOND" or self.parametro1 == "SECONDS":
                    
                    valor = valores.get('seconds','NO_ESTA')
                    if valor == 'NO_ESTA':
                        return ErrorReport('semantico', 'solicitud de segundos en Interaval y no fue especificado en la cadena' ,self.linea) 
                    else:                   
                        return ExpresionNumero(int(valor), TIPO_DE_DATO.ENTERO,self.linea)
            else:
                print("funcion desconocida")
        elif self.parametro1 != None:
            if self.funcion == 'TIMESTAMP':
                hora_fecha_actual = str(datetime.now())[0:19]
                return ExpresionCadena(hora_fecha_actual,TIPO_DE_DATO.CADENA,self.linea)
            else:
                print("funcion desconocida")
        else:
            if self.funcion == "NOW":
                hora_fecha_actual = str(datetime.now())[0:19]
                return ExpresionCadena(hora_fecha_actual,TIPO_DE_DATO.CADENA,self.linea)
            elif self.funcion == "CURRENT_DATE":
                fecha_actual = str(datetime.now())[0:10]
                return ExpresionCadena(fecha_actual,TIPO_DE_DATO.CADENA,self.linea)
            elif self.funcion == "CURRENT_TIME":
                hora_actual = str(datetime.now())[11:19]
                return ExpresionCadena(hora_actual,TIPO_DE_DATO.CADENA,self.linea)
            elif self.funcion == "CURRENT_TIMESTAMP":
                hora_fecha_actual = str(datetime.now())[0:19]
                return ExpresionCadena(hora_fecha_actual,TIPO_DE_DATO.CADENA,self.linea)
예제 #7
0
    def ejecutar(self, ts):
        expizq = self.exp1.ejecutar(ts)
        expder = self.exp2.ejecutar(ts)
        # por si se quiere operar un error con una expresion buena ,  retorna de una el error
        if isinstance(expizq , ErrorReport):
            return expizq
        if isinstance(expder , ErrorReport):
            return expder
        # la UNICA EXPRESION QUE DEBE DE OPERAR ES UN ID-tipo-entero o un tipoentero de la expresion sumerica
        if not (isinstance(expizq , ExpresionNumero)  or isinstance(expizq , ExpresionID)):
            return ErrorReport('semantico', 'Error de tipo con el operando izquierdo' , self.linea )
        
        if not (isinstance(expder , ExpresionNumero)  or isinstance(expizq , ExpresionID)):
            return ErrorReport('semantico', 'Error de tipo con el operando Derecho' , self.linea )

        if self.operador == ">>" :
            if expizq.tipo == TIPO_DE_DATO.ENTERO and expder.tipo == TIPO_DE_DATO.ENTERO:
                return ExpresionNumero(expizq.val >> expder.val, TIPO_DE_DATO.ENTERO,self.linea) 
            elif expizq.tipo == TIPO_DE_DATO.DECIMAL:
                return  ErrorReport('semantico', 'Error de tipo con el operando izquierdo en OPERADOR >>' , self.linea )
            elif expder.tipo == TIPO_DE_DATO.DECIMAL:
                return  ErrorReport('semantico', 'Error de tipo con el operando derecho en OPERADOR >>' , self.linea )

        elif self.operador == "<<":
            if expizq.tipo == TIPO_DE_DATO.ENTERO and expder.tipo == TIPO_DE_DATO.ENTERO:
                return ExpresionNumero(expizq.val << expder.val, TIPO_DE_DATO.ENTERO,self.linea) 
            elif expizq.tipo == TIPO_DE_DATO.DECIMAL:
                return  ErrorReport('semantico', 'Error de tipo con el operando izquierdo en OPERADOR <<' , self.linea )
            elif expder.tipo == TIPO_DE_DATO.DECIMAL:
                return  ErrorReport('semantico', 'Error de tipo con el operando derecho en OPERADOR <<' , self.linea )
            
        elif self.operador == "#":
            if expizq.tipo == TIPO_DE_DATO.ENTERO and expder.tipo == TIPO_DE_DATO.ENTERO:
                try:
                    valor = expizq.val ^ expder.val
                    return ExpresionNumero(valor, TIPO_DE_DATO.ENTERO , self.linea) 
                except:
                    return  ErrorReport('semantico', 'Error de Ejecucion con el OPERADOR | ', self.linea )
            elif expizq.tipo == TIPO_DE_DATO.DECIMAL:
                return  ErrorReport('semantico', 'Error de tipo con el operando izquierdo en OPERADOR #' , self.linea )
            elif expder.tipo == TIPO_DE_DATO.DECIMAL:
                return  ErrorReport('semantico', 'Error de tipo con el operando derecho en OPERADOR #' , self.linea )
            else:
                return 0
        elif self.operador == "|":
            if expizq.tipo == TIPO_DE_DATO.ENTERO and expder.tipo == TIPO_DE_DATO.ENTERO:
                try:
                    valor = expizq.val | expder.val
                    return ExpresionNumero(valor, TIPO_DE_DATO.ENTERO , self.linea) 
                except:
                    return  ErrorReport('semantico', 'Error de Ejecucion con el OPERADOR | ', self.linea )
                
            elif expizq.tipo == TIPO_DE_DATO.DECIMAL:
                return  ErrorReport('semantico', 'Error de tipo con el operando izquierdo en OPERADOR |' , self.linea )
            elif expder.tipo == TIPO_DE_DATO.DECIMAL:
                return  ErrorReport('semantico', 'Error de tipo con el operando derecho en OPERADOR |' , self.linea )
            else:
                return 0
        elif self.operador == "&":

            if expizq.tipo == TIPO_DE_DATO.ENTERO and expder.tipo == TIPO_DE_DATO.ENTERO:
                try:
                    valor = expizq.val & expder.val
                    return ExpresionNumero(valor, TIPO_DE_DATO.ENTERO , self.linea) 
                except:
                    return  ErrorReport('semantico', 'Error de Ejecucion con el OPERADOR | ', self.linea )
            elif expizq.tipo == TIPO_DE_DATO.DECIMAL:
                return  ErrorReport('semantico', 'Error de tipo con el operando izquierdo en OPERADOR #' , self.linea )
            elif expder.tipo == TIPO_DE_DATO.DECIMAL:
                return  ErrorReport('semantico', 'Error de tipo con el operando derecho en OPERADOR #' , self.linea )
        else:
            return  ErrorReport('semantico', 'Error Operador desconocido' , self.linea )
예제 #8
0
def p_expresion_primitivo2(p):
    'expresion : DECIMAL_LITERAL'
    p[0] = ExpresionNumero(p[1], TIPO_DE_DATO.DECIMAL, p.slice[1].lineno)
예제 #9
0
def p_expresion_primitivo1(p):
    'expresion : NUMERO'
    p[0] = ExpresionNumero(p[1], TIPO_DE_DATO.ENTERO, p.slice[1].lineno)
예제 #10
0
def p_tipo_numero2(p):
    'tipo_numero : DECIMAL_LITERAL'
    p[0] = ExpresionNumero(p[1], TIPO_DE_DATO.DECIMAL, p.slice[1].lineno)
예제 #11
0
def p_tipo_numero1(p):
    'tipo_numero : NUMERO'
    p[0] = ExpresionNumero(p[1], TIPO_DE_DATO.ENTERO, p.slice[1].lineno)
예제 #12
0
def p_exp_aux_decimal(p):
    'exp_aux :  DECIMAL_LITERAL'
    p[0] = ExpresionNumero(p[1], TIPO_DE_DATO.DECIMAL, p.slice[1].lineno)
예제 #13
0
def p_exp_aux_numero(p):
    'exp_aux :  NUMERO'
    p[0] = ExpresionNumero(p[1], TIPO_DE_DATO.ENTERO, p.slice[1].lineno)