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
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 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
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
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')
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())
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])
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
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)
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])
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])
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])
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])
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 p_EXPT16(t): 'EXP : default' t[0] = Terminal('default', t[1])
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])
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])
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])
def p_EXPT12(t): 'EXP : timestamp cadena' t[0] = Terminal('timestamp without time zone', t[1])
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])
def p_EXPT13(t): 'EXP : interval cadena' t[0] = Terminal('interval', t[1])
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)
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])
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])
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])
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])
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])
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])
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])
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