Exemplo n.º 1
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)
Exemplo n.º 2
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)