class Asignacion(Instruccion): def __init__(self, nombre, valor): self.nombre = nombre self.valor = valor 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 traducir(self, entorno): 'traduzco asignacion' expval = self.valor.traducir(entorno) cad = expval.codigo3d cad += self.nombre + '=' + str(expval.temp) + '\n' self.codigo3d = cad sql = self.nombre if self.valor != None: sql += ' = ' + self.valor.stringsql sql += ';' self.stringsql = sql return self
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_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