예제 #1
0
def p_EXP3(t):
    '''EXP : EXP mas EXP
            | EXP menos EXP
            | EXP multiplicacion  EXP
            | EXP division EXP
            | EXP modulo EXP
            | EXP elevado EXP
            | EXP and EXP
            | EXP or EXP
            | EXP mayor EXP
            | EXP menor EXP
            | EXP mayor_igual EXP
            | EXP menor_igual EXP
            | EXP igual EXP
            | EXP diferente1 EXP
            | EXP diferente2 EXP
            | EXP between EXP %prec predicates'''
    if t[2] == '+':
        listaBNF.append("EXP ::= EXP " + str(t[2]) + " EXP")
        t[0] = Aritmetica(t[1], t[3], '+')
    elif t[2] == '-':
        listaBNF.append("EXP ::= EXP " + str(t[2]) + " EXP")
        t[0] = Aritmetica(t[1], t[3], '-')
    elif t[2] == '*':
        listaBNF.append("EXP ::= EXP " + str(t[2]) + " EXP")
        t[0] = Aritmetica(t[1], t[3], '*')
    elif t[2] == '/':
        listaBNF.append("EXP ::= EXP " + str(t[2]) + " EXP")
        t[0] = Aritmetica(t[1], t[3], '/')
    elif t[2] == '>':
        listaBNF.append("EXP ::= EXP > EXP")
        t[0] = Relacional(t[1], t[3], '>')
    elif t[2] == '<':
        listaBNF.append("EXP ::= EXP &#60; EXP")
        t[0] = Relacional(t[1], t[3], '<')
    elif t[2] == '>=':
        listaBNF.append("EXP ::= EXP &#62;&#61; EXP")
        t[0] = Relacional(t[1], t[3], '>=')
    elif t[2] == '<=':
        listaBNF.append("EXP ::= EXP &#60;&#61; EXP")
        t[0] = Relacional(t[1], t[3], '<=')
    elif t[2] == '<>' or t[2] == '!=':
        listaBNF.append("EXP ::= EXP &#60;&#62; EXP")
        t[0] = Relacional(t[1], t[3], '<>')
    elif t[2] == '=':
        listaBNF.append("EXP ::= EXP &#61; EXP")
        t[0] = Relacional(t[1], t[3], '=')
    elif t[2] == 'or':
        listaBNF.append("EXP ::= EXP " + str(t[2]) + " EXP")
        t[0] = Logica(t[1], t[3], 'or')
    elif t[2] == 'and':
        listaBNF.append("EXP ::= EXP " + str(t[2]) + " EXP")
        t[0] = Logica(t[1], t[3], 'and')
예제 #2
0
def p_EXP3(t):
    '''EXP : EXP mas EXP
            | EXP menos EXP
            | EXP multiplicacion  EXP
            | EXP division EXP
            | EXP modulo EXP
            | EXP elevado EXP
            | EXP and EXP
            | EXP or EXP
            | EXP mayor EXP
            | EXP menor EXP
            | EXP mayor_igual EXP
            | EXP menor_igual EXP
            | EXP igual EXP
            | EXP diferente1 EXP
            | EXP diferente2 EXP
            | EXP punto EXP
            | EXP between EXP %prec predicates'''
    if t[2] == '+':
        t[0] = Aritmetica(t[1], t[3], '+')
    elif t[2] == '-':
        t[0] = Aritmetica(t[1], t[3], '-')
    elif t[2] == '*':
        t[0] = Aritmetica(t[1], t[3], '*')
    elif t[2] == '/':
        t[0] = Aritmetica(t[1], t[3], '/')
    elif t[2] == '>':
        t[0] = Relacional(t[1], t[3], '>')
    elif t[2] == '<':
        t[0] = Relacional(t[1], t[3], '<')
    elif t[2] == '>=':
        t[0] = Relacional(t[1], t[3], '>=')
    elif t[2] == '<=':
        t[0] = Relacional(t[1], t[3], '<=')
    elif t[2] == '<>' or t[2] == '!=':
        t[0] = Relacional(t[1], t[3], '<>')
    elif t[2] == '==':
        t[0] = Relacional(t[1], t[3], '==')
    elif t[2] == 'or':
        t[0] = Logica(t[1], t[3], 'or')
    elif t[2] == 'and':
        t[0] = Logica(t[1], t[3], 'and')
예제 #3
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)
예제 #4
0
파일: Delete.py 프로젝트: edgarJ91/tytus
    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)