def p_EXP1(t): '''EXP : mas EXP %prec umas | menos EXP %prec umenos | not EXP''' if t[1] == '+': t[0] = Unaria(t[2], '+') elif t[1] == '-': t[0] = Unaria(t[2], '-') elif t[2] == 'not': t[0] = Unaria(t[2], '*')
def p_EXP1(t): '''EXP : mas EXP %prec umas | menos EXP %prec umenos | not EXP''' listaBNF.append("EXP ::= " + str(t[1]) + " EXP") if t[1] == '+': t[0] = Unaria(t[2], '+') elif t[1] == '-': t[0] = Unaria(t[2], '-') elif t[1] == 'not': t[0] = Unaria(t[2], 'not')
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')
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)