Exemple #1
0
    def getacceso(self,entorno,expresion,result,fila,tablas):
        for i in range(0, len(self.encabezado)):
            nombrediv = self.encabezado[i].split('.')

            nombrecol = nombrediv[0]
            nombretabla = nombrediv[1]
            nombrecol = nombretabla + '.' + nombrecol
            if expresion.getval(entorno).valor == nombrecol:
                dato = result[fila][i]
                tipo = None
                if len(nombrediv) > 1:
                    tipo = self.gettipo(entorno, tablas, nombrediv[0], nombrediv[1])
                else:
                    tipo = self.gettipo(entorno, tablas, nombrediv[0])
                term = Terminal(tipo, dato)
                return term

            for x in range(0,len(self.aliast)):
                nombreacc = self.aliast[x] + '.' + nombrediv[0]
                if expresion.getval(entorno).valor == nombreacc and nombrediv[1]== tablas[x].nombre.replace('_' + entorno.getDataBase(), ''):
                    dato = result[fila][i]
                    tipo = None
                    if len(nombrediv) > 1:
                        tipo = self.gettipo(entorno, tablas, nombrediv[0], nombrediv[1])
                    else:
                        tipo = self.gettipo(entorno, tablas, nombrediv[0])
                    term = Terminal(tipo, dato)
                    return term

        return None
Exemple #2
0
def p_EXPV2(t):
    'EXP : EXP not like cadena  %prec predicates '
    tipo = Tipo('varchar', t[4], -1, -1)
    tipo.getTipo()
    ter = Terminal(tipo, t[4])
    rel = Relacional(t[1], ter, 'like')
    t[0] = Unaria(rel, 'not')
Exemple #3
0
def p_CREATEINDEX2(t):
    '''CREATEINDEX      : create index id on id  para id ORDEN parc '''
    listaBNF.append("CREATEINDEX ::= create index " + str(t[3]) + " on " +
                    str(t[5]) + " para " + str(t[7]) + " ORDEN parc")
    i = Index(str(t[3]), str(t[5]), [Terminal("identificador", str(t[7]))])
    i.orden = t[8]
    t[0] = i
Exemple #4
0
    def traducir(self,ent):
        'traduccion proc'
        nl=ent.newlabel()
        cad='goto ' + nl+'\n'
        cad+='label '+ent.newlabel('p_'+self.nombre)+'\n'
        cont=0
        lenparams=0
        if self.params != None:
            lenparams=len(self.params)

        for i in range(0,lenparams):
            val='stack['+str(i)+']'
            term=Terminal(Tipo('stack',None,-1,-1),val)
            d=Declaracion(self.params[i].nombre,False,self.params[i].tipo,term)
            c3d=d.traducir(ent).codigo3d
            cad+=c3d
            cont=i

        if self.instrucciones!=None:
            for inst in self.instrucciones:
                if inst !=None:
                    c3d= inst.traducir(ent).codigo3d
                    cad+=c3d
        cad+='temp=stack['+str(lenparams)+']\n'
        cad+='stack=[]\n'
        cad+='goto temp\n'
        cad+='label ' +nl+'\n'
        self.codigo3d=cad
        self.ejecutar(ent)
        return self
Exemple #5
0
def p_EXPV1(t):
    'EXP : EXP like cadena  %prec predicates'
    tipo = Tipo('varchar', t[3], -1, -1)
    tipo.getTipo()
    ter = Terminal(tipo, t[3])

    t[0] = Relacional(t[1], ter, 'like')
Exemple #6
0
def p_EXP_FuncNativas2(t):
    '''EXP : id para parc '''
    tipo = None
    if t[1].lower() == 'now':
        tipo = Tipo('timestamp without time zone', t[1], len(t[1]), -1)
    elif t[1].lower() == 'random':
        tipo = Tipo('double', t[1], len(t[1]), -1)
    elif t[1].lower() == 'pi':
        tipo = Tipo('double', t[1], len(t[1]), -1)

    t[0] = Terminal(tipo, t[1].lower())
Exemple #7
0
 def getval(self,entorno):
     'spliteo el timestamp'
     splited=self.timestamp.split(' ')
     fecha= splited[0]
     hora = splited[1]
     splitedfecha= fecha.split('-')
     splitedhora = hora.split(':')
     if self.field=='year':
         tipo=Tipo('integer',None,-1,-1)
         return Terminal(tipo,splitedfecha[0])
     elif self.field=='month':
         tipo = Tipo('integer', None, -1, -1)
         return Terminal(tipo,splitedfecha[1])
     elif self.field == 'day':
         tipo = Tipo('integer', None, -1, -1)
         return Terminal(tipo,splitedfecha[2])
     elif self.field=='hour':
         tipo = Tipo('integer', None, -1, -1)
         return Terminal(tipo,splitedhora[0])
     elif self.field=='minute':
         tipo = Tipo('integer', None, -1, -1)
         return Terminal(tipo,splitedhora[1])
     elif self.field == 'second':
         tipo = Tipo('integer', None, -1, -1)
         return Terminal(tipo,splitedhora[2])
Exemple #8
0
    def traducir(self, ent):
        'traduccion func'
        nl = ent.newlabel()
        cad = 'goto ' + nl + '\n'
        cad += 'label ' + ent.newlabel('f_' + self.nombre) + '\n'
        cont = 0
        lenparams = 0
        if self.params != None:
            lenparams = len(self.params)

        for i in range(0, lenparams):
            val = 'stack[' + str(i) + ']'
            term = Terminal(Tipo('stack', None, -1, -1), val)
            d = Declaracion(self.params[i].nombre, False, self.params[i].tipo,
                            term)
            c3d = d.traducir(ent).codigo3d
            cad += c3d
            cont = i

        if self.instrucciones != None:
            for inst in self.instrucciones:
                if inst != None:
                    c3d = inst.traducir(ent).codigo3d
                    cad += c3d
        cad += 'temp=stack[' + str(lenparams) + ']\n'
        cad += 'stack=[]\n'
        cad += 'goto temp\n'
        cad += 'label ' + nl + '\n'
        self.codigo3d = cad

        # string quemado
        sql = 'ci.ejecutarsql("create function ' + self.nombre + '('
        if self.params != None:
            for i in range(0, len(self.params)):
                if i > 0:
                    sql += ','
                if self.params[i].modo != None:
                    sql += 'inout '

                sql += self.params[i].nombre + ' ' + self.params[i].tipo.tipo

        sql += ') returns ' + self.tipo.tipo + ' as $$ '

        if self.instrucciones != None:
            for ins in self.instrucciones:
                sql += ins.traducir(ent).stringsql
        sql += ' $$ language plpgsql;\")\n'
        self.codigo3d = sql + self.codigo3d
        return self
Exemple #9
0
    def ejecutar(self, ent):
        'ejecutar asignacion'
        sim = ent.buscarSimbolo(self.nombre)
        if sim == None:
            reporteerrores.append(
                Lerrores("Error Semantico",
                         'Error,no existe la variable ' + self.nombre, 0, 0))
            variables.consola.insert(
                INSERT, 'Error,no existe la variable ' + self.nombre + '\n')
            return

        util = Tipo(None, None, -1, -1)
        if isinstance(self.valor, Select):
            val = self.valor.ejecutar(ent, 0)
            val = val[1][0]
            self.valor = Terminal(sim.tipo, val[0])
        if isinstance(self.valor, Terminal):
            sim.valor = self.valor.getval(ent).valor
            ent.editarSimbolo(self.nombre, sim)

        else:
            self.valor = self.valor.getval(ent)
            sim.valor = self.valor.getval(ent).valor
            ent.editarSimbolo(self.nombre, sim)
Exemple #10
0
def p_EXPT11(t):
    'EXP : current_date'
    listaBNF.append("EXP ::= " + str(t[1]).lower())
    tipo = Tipo('date', t[1], len(t[1]), -1)
    tipo.getTipo()
    t[0] = Terminal(tipo, t[1])
Exemple #11
0
def p_EXPT12(t):
    'EXP : timestamp cadena'
    listaBNF.append("EXP ::= timestamp '" + str(t[2]) + "'")
    tipo = Tipo('timestamp without time zone', t[2], len(t[2]), -1)
    tipo.getTipo()
    t[0] = Terminal(tipo, t[2])
Exemple #12
0
def p_EXPT9(t):
    'EXP : null'
    listaBNF.append("EXP ::= " + str(t[1]).lower())
    tipo = Tipo('indefinido', t[1], len(t[1]), -1)
    tipo.getTipo()
    t[0] = Terminal(tipo, t[1])
Exemple #13
0
def p_EXPT10(t):
    'EXP : current_time'
    listaBNF.append("EXP ::= " + str(t[1]).lower())
    tipo = Tipo('time without time zone', t[1], len(t[1]), -1)
    tipo.getTipo()
    t[0] = Terminal(tipo, t[1])
Exemple #14
0
    def resolver(self,expresion,entorno,result,tablas,fila):
        #para expresion binaria
        if not isinstance(expresion,Terminal) and not isinstance(expresion,Unaria) and not isinstance(expresion,FuncionesNativas) and not isinstance(expresion,Identificador):
            'resuelvo logicas,aritmeticas y relacionales'
            exp1=expresion.exp1
            exp2=expresion.exp2
            res1=self.resolver(exp1,entorno,result,tablas,fila)
            res2=self.resolver(exp2,entorno,result,tablas,fila)

            op=None
            if isinstance(expresion,Logica):
                op=Logica(res1, res2, expresion.operador)
            if isinstance(expresion,Relacional):
                op =Relacional(res1, res2, expresion.operador)
            if isinstance(expresion,Aritmetica):
                op =Aritmetica(res1, res2, expresion.operador)

            return op.getval(entorno)
        elif isinstance(expresion,Unaria): #para expresion unaria
            exp=expresion.exp1
            res= self.resolver(exp,entorno,result,tablas,fila)
            op = Unaria(res,expresion.operador)
            return op.getval(entorno)

        else:
            'aqui resuelvo los terminales y funciones'
            if isinstance(expresion,Identificador):
                ''
                term=expresion.getval(entorno)
                if term!= None:
                    return term
                else:
                    for i in range(0, len(self.encabezado)):
                        nombrediv = self.encabezado[i].split('.')
                        nombrecol = nombrediv[0]
                        if expresion.nombre == nombrecol:
                            dato=result[fila][i]
                            tipo = None
                            if len(nombrediv) > 1:
                                tipo = self.gettipo(entorno, tablas, nombrediv[0], nombrediv[1])
                            else:
                                tipo = self.gettipo(entorno, tablas, nombrediv[0])
                            term=Terminal(tipo,dato)
                            return term
            elif isinstance(expresion,Terminal):
                if expresion.tipo.tipo=='acceso':
                    return self.getacceso(entorno,expresion,result,fila,tablas)
                else:
                    return expresion

            elif isinstance(expresion,FuncionesNativas):
                if expresion.identificador.lower()=='count':
                    t=Tipo('integer',None,-1,-1)
                    self.agregacion=1
                    return Terminal(t,len(result))
                tempexp=[]
                for exp in expresion.expresiones:
                    tempexp.append(exp)

                for j in range(0, len(expresion.expresiones)):
                    if isinstance(expresion.expresiones[j],Identificador):
                        val = expresion.expresiones[j].nombre
                        for i in range(0, len(self.encabezado)):
                            nombrediv = self.encabezado[i].split('.')
                            nombrecol = nombrediv[0]
                            if val == nombrecol:
                                tipo=None
                                if len(nombrediv)>1:
                                    tipo = self.gettipo(entorno, tablas, val,nombrediv[1])
                                else:
                                    tipo = self.gettipo(entorno, tablas, val)
                                dato = result[fila][i]
                                tempexp[j]=Terminal(tipo,dato)
                    func=FuncionesNativas(expresion.identificador, tempexp)
                return func.getval(entorno)
Exemple #15
0
def p_EXPT16(t):
    'EXP : default'
    t[0] = Terminal('default', t[1])
Exemple #16
0
def p_EXPT4(t):
    'EXP : cadenaString'
    listaBNF.append("EXP ::= \"" + str(t[1]) + "\"")
    tipo = Tipo('varchar', t[1], len(t[1]), -1)
    tipo.getTipo()
    t[0] = Terminal(tipo, t[1])
Exemple #17
0
def p_EXPT16(t):
    'EXP : default'
    listaBNF.append("EXP ::= " + str(t[1]).lower())
    tipo = Tipo('default', t[1], len(t[1]), -1)
    tipo.getTipo()
    t[0] = Terminal(tipo, t[1])
Exemple #18
0
def p_EXPT2(t):
    'EXP : decimales'
    listaBNF.append("EXP ::= " + str(t[1]))
    tipo = Tipo('decimal', t[1], len(str(t[1])), -1)
    tipo.getTipo()
    t[0] = Terminal(tipo, t[1])
Exemple #19
0
def p_EXPT12(t):
    'EXP : timestamp cadena'
    t[0] = Terminal('timestamp without time zone', t[1])
Exemple #20
0
def p_EXPT1(t):
    'EXP : int'
    listaBNF.append("EXP ::= " + str(t[1]))
    tipo = Tipo('int', t[1], len(str(t[1])), -1)
    tipo.getTipo()
    t[0] = Terminal(tipo, t[1])
Exemple #21
0
def p_EXPT13(t):
    'EXP : interval cadena'
    t[0] = Terminal('interval', t[1])
Exemple #22
0
    def resolver(self, expresion, entorno, result, tabla, fila):
        # para expresion binaria
        if not isinstance(expresion, Terminal) and not isinstance(
                expresion, Unaria) and not isinstance(expresion,
                                                      FuncionesNativas):
            'resuelvo logicas,aritmeticas y relacionales'
            exp1 = expresion.exp1
            exp2 = expresion.exp2
            res1 = self.resolver(exp1, entorno, result, tabla, fila)
            res2 = self.resolver(exp2, entorno, result, tabla, fila)

            op = None
            if isinstance(expresion, Logica):
                op = Logica(res1, res2, expresion.operador)
            if isinstance(expresion, Relacional):
                op = Relacional(res1, res2, expresion.operador)
            if isinstance(expresion, Aritmetica):
                op = Aritmetica(res1, res2, expresion.operador)

            return op.getval(entorno)
        elif isinstance(expresion, Unaria):  # para expresion unaria
            exp = expresion.exp1
            res = self.resolver(exp, entorno, result, tabla, fila)
            op = Unaria(res, expresion.operador)
            return op.getval(entorno)

        else:
            'aqui resuelvo los terminales y funciones'
            if isinstance(expresion, Terminal):
                if expresion.tipo.tipo == 'identificador':
                    for i in range(0, len(self.encabezado)):
                        nombrediv = self.encabezado[i].split('.')
                        nombrecol = nombrediv[0]
                        if expresion.getval(entorno).valor == nombrecol:
                            dato = result[fila][i]
                            tipo = None
                            tipo = self.gettipo(entorno, tabla, nombrediv[0])
                            term = Terminal(tipo, dato)
                            return term
                elif expresion.tipo.tipo == 'acceso':
                    for i in range(0, len(self.encabezado)):
                        nombrediv = self.encabezado[i].split('.')
                        nombrecol = nombrediv[0]
                        nombretabla = nombrediv[1]
                        nombrecol = nombretabla + '.' + nombrecol
                        if expresion.getval(entorno).valor == nombrecol:
                            dato = result[fila][i]
                            tipo = None
                            tipo = self.gettipo(entorno, tabla, nombrediv[0])
                            term = Terminal(tipo, dato)
                            return term.getval(entorno)

                else:
                    return expresion

            elif isinstance(expresion, FuncionesNativas):
                tempexp = []
                for exp in expresion.expresiones:
                    tempexp.append(exp)

                for j in range(0, len(expresion.expresiones)):
                    if expresion.expresiones[j].tipo.tipo == 'identificador':
                        val = expresion.expresiones[j].getval(entorno).valor
                        for i in range(0, len(self.encabezado)):
                            nombrediv = self.encabezado[i].split('.')
                            nombrecol = nombrediv[0]
                            if val == nombrecol:
                                tipo = None
                                tipo = self.gettipo(entorno, tabla, val)
                                dato = result[fila][i]
                                tempexp[j] = Terminal(tipo, dato)
                    func = FuncionesNativas(expresion.identificador, tempexp)
                return func.getval(entorno)
Exemple #23
0
def p_EXPT13(t):
    'EXP : interval cadena'
    listaBNF.append("EXP ::= interval '" + str(t[2]) + "'")
    tipo = Tipo('interval', t[2], len(t[2]), -1)
    tipo.getTipo()
    t[0] = Terminal(tipo, t[2])
Exemple #24
0
def p_EXPT6(t):
    'EXP : false'
    listaBNF.append("EXP ::= " + str(t[1]).lower())
    tipo = Tipo('boolean', t[1], len(t[1]), -1)
    tipo.getTipo()
    t[0] = Terminal(tipo, t[1])
Exemple #25
0
def p_EXPT14(t):
    'EXP : cadena as TIPO'
    listaBNF.append("EXP ::= '" + str(t[1]) + "' as TIPO")
    # aqui es en donde va el convert
    t[0] = Terminal(t[3], t[1])
Exemple #26
0
def p_EXPT7(t):
    'EXP : id'
    listaBNF.append("EXP ::= " + str(t[1]).lower())
    tipo = Tipo('identificador', t[1], len(t[1]), -1)
    tipo.getTipo()
    t[0] = Terminal(tipo, t[1])
Exemple #27
0
def p_EXPT17(t):
    'EXP : idPunto'
    listaBNF.append("EXP ::= " + str(t[1]))
    tipo = Tipo('acceso', t[1], len(t[1]), -1)
    tipo.getTipo()
    t[0] = Terminal(tipo, t[1])
Exemple #28
0
def p_EXPT8(t):
    'EXP : multiplicacion %prec lsel'
    listaBNF.append("EXP ::= * ")
    tipo = Tipo('todo', t[1], len(t[1]), -1)
    tipo.getTipo()
    t[0] = Terminal(tipo, t[1])
Exemple #29
0
def p_EXPT3(t):
    'EXP : cadena'
    listaBNF.append("EXP ::= '" + str(t[1]) + "'")
    tipo = Tipo('varchar', t[1], len(t[1]), -1)
    tipo.getTipo()
    t[0] = Terminal(tipo, t[1])
Exemple #30
0
def p_EXPT11(t):
    'EXP : current_date'
    tipo = Tipo('date', t[1], len(t[1]), -1)
    tipo.getTipo()
    ter = Terminal(tipo, t[1])
    t[0] = ter.getval(ent).valor