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 < EXP") t[0] = Relacional(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 <= EXP") t[0] = Relacional(t[1], t[3], '<=') elif t[2] == '<>' or t[2] == '!=': listaBNF.append("EXP ::= EXP <> EXP") t[0] = Relacional(t[1], t[3], '<>') elif t[2] == '=': listaBNF.append("EXP ::= EXP = 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')
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')
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)
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)