def ejecutar(self, ts, ms): #ts.printts() result = None Simbolo = ts.obtener(self.id) if Simbolo is not None: et = Simbolo.valor if isinstance(et, Etiqueta): for instr in et.instrucciones: if isinstance(instr, Asignacion): instr.etiqueta = et if isinstance(instr, RefAsignacion): instr.etiqueta = et result = instr.ejecutar(ts, ms) if result == False: break if (et.next != None) and (result is None): et.next.ejecutar(ts, ms) else: ms.AddMensaje( MS.Mensaje("El salto no se dirige hacia una etiqueta", self.linea, self.columna, True, "Semantico")) else: ms.AddMensaje( MS.Mensaje("No existe salto a donde dirigirse", self.linea, self.columna, True, "Semantico")) return False
def GetValor(self, ts, ms): exp1 = self.exp1.GetValor(ts, ms) exp2 = self.exp2.GetValor(ts, ms) tipo1 = self.exp1.GetTipo(ts, ms) tipo2 = self.exp2.GetTipo(ts, ms) maxi = self.MaxType(tipo1, tipo2) if (exp1 is not None) and (exp2 is not None): if maxi == TS.TIPO_DATO.INTEGER: if self.operador == OPERACION_ARITMETICA.MAS: return exp1 + exp2 if self.operador == OPERACION_ARITMETICA.MENOS: return exp1 - exp2 if self.operador == OPERACION_ARITMETICA.POR: return exp1 * exp2 if self.operador == OPERACION_ARITMETICA.DIVIDIDO: if exp2 != 0: return exp1 / exp2 else: print("No es posible dividr entre 0") ms.AddMensaje( MS.Mensaje("No es posible dividir entre 0", self.linea, self.columna, True, "Semantico")) return exp2 if self.operador == OPERACION_ARITMETICA.MODULO: return exp1 % exp2 elif maxi == TS.TIPO_DATO.CHAR: if self.operador == OPERACION_ARITMETICA.MAS: return str(exp1) + str(exp2) else: print("Expresion en numero entero no tiene valor") ms.AddMensaje( MS.Mensaje("Expresion en numero entero no tiene valor", self.linea, self.columna, True, "Semantico"))
def ejecutar(self, ts, ms): valor = self.cad.GetValor(ts, ms) if isinstance(valor, Arreglo): valor = valor.GetElements(ts, ms) #print("si es"+str(valor)) if (valor != None): formatted = str(valor).replace('\\n', '\n') ms.AddMensaje( MS.Mensaje(formatted, self.linea, self.columna, False, None)) print(formatted) #print(ts.printts()) else: #print("Error: Variable a imprimir no tiene valor") ms.AddMensaje( MS.Mensaje("Variable a imprimir no tiene valor", self.linea, self.columna, True, "Semantico")) return None
def ejecutar(self, ts, ms): if (isinstance(self.var, Variable)) or (isinstance( self.var, ExpresionCadena)): key = self.var.GetName(ts, ms) #print("unsetting" + key) ts.eliminar(key) else: print("Error: unset no se puede manejar con este tipo") ms.AddMensaje( MS.Mensaje("Unset no se puede manejar con este tipo", self.linea, self.columna, True, "Semantico")) return None
def debug_next(self): if GLO.pila_action is not None: #do if GLO.action_puntero < len(GLO.pila_action): instr = GLO.pila_action[GLO.action_puntero] print(str(instr)) if isinstance(instr, GoTo): #change Simbolo = self.ts_global.obtener(instr.id) et = Simbolo.valor if isinstance(et, Etiqueta): GLO.current_etiqueta = et GLO.pila_action = et.instrucciones GLO.action_puntero = -1 else: print("El salto no se dirige a una etiqueta") ms.AddMensaje( MS.Mensaje( "El salto no se dirige hacia una etiqueta", self.linea, self.columna, True, "Semantico")) elif isinstance(instr, Print): result = instr.debug(self.ts_global, self.ms_global) else: if isinstance(instr, Asignacion): instr.etiqueta = GLO.current_etiqueta result = instr.ejecutar(self.ts_global, self.ms_global) GLO.action_puntero += 1 else: if GLO.current_etiqueta.next is not None: GLO.pila_action = GLO.current_etiqueta.next.instrucciones GLO.current_etiqueta = GLO.current_etiqueta.next GLO.action_puntero = -1 else: self.debug_stop() else: showinfo("Notice", "No se tiene informacion en la pila")
def procesar_instrucciones(self, instrucciones, ts, ms): ## lista de instrucciones recolectadas for i in range(len(instrucciones)): if i < len(instrucciones) - 1: instrucciones[i].inicializar(ts, ms, instrucciones[i + 1]) else: instrucciones[i].inicializar(ts, ms, None) encontrado = False for instr in instrucciones: if (instr.id == "main"): instr.ejecutar(ts, ms) encontrado = True break if encontrado == False: ms.AddMensaje( MS.Mensaje( "Es necesario contener una instrucion main al inicio", 0, 0, True, "Semantico")) for instr in instrucciones: instr.actualizar(ts)
def GetValor(self, ts, ms): exp1 = self.exp1.GetValor(ts, ms) exp2 = self.exp2.GetValor(ts, ms) if (exp1 is not None) and (exp2 is not None): if self.operador == OPERACION_RELACIONAL.MAYOR: return exp1 > exp2 if self.operador == OPERACION_RELACIONAL.MENOR: return exp1 < exp2 if self.operador == OPERACION_RELACIONAL.MAYORIGUAL: return exp1 >= exp2 if self.operador == OPERACION_RELACIONAL.MENORIGUAL: return exp1 <= exp2 if self.operador == OPERACION_RELACIONAL.IGUAL: return exp1 == exp2 if self.operador == OPERACION_RELACIONAL.DIFERENTE: return exp1 != exp2 else: print( "Uno de los valores para la operacion relacional no fue declarado" ) ms.AddMensaje( MS.Mensaje( "Uno de los valores para la operacion relacional no fue declarado", self.linea, self.columna, True, "Semantico"))
def debug_instrucciones(self, instrucciones, ts, ms): ## lista de instrucciones recolectadas for i in range(len(instrucciones)): if i < len(instrucciones) - 1: instrucciones[i].inicializar(ts, ms, instrucciones[i + 1]) else: instrucciones[i].inicializar(ts, ms, None) encontrado = False for instr in instrucciones: if (instr.id == "main"): #instr.debug(ts,ms) GLO.pila_action = instr.instrucciones GLO.current_etiqueta = instr encontrado = True break if encontrado == False: ms.AddMensaje( MS.Mensaje( "Es necesario contener una instrucion main al inicio", 0, 0, True, "Semantico")) for instr in instrucciones: instr.actualizar(ts)
def ejecutar(self, ts, ms): sym = ts.obtener(self.var.id) reference = ts.obtener(self.refvar.id) tipo_et = self.DefineRol(self.var.id) recorrido = "" print("id: " + str(self.var.id) + " referencia: " + str(reference)) if self.var.accesos == None: if sym is not None: GLO.pila = GLO.pila + 1 self.pila = GLO.pila declarada = self.Declaradaen() simbolo = TS.Simbolo(self.var.id, reference.tipo, self.refvar.GetValor(ts, ms), tipo_et, reference.dim, self.etiqueta.id, declarada) simbolo.SetReference(reference.id) ts.actualizar(simbolo) else: GLO.pila = GLO.pila + 1 self.pila = GLO.pila declarada = self.Declaradaen() simbolo = TS.Simbolo(self.var.id, reference.tipo, self.refvar.GetValor(ts, ms), tipo_et, reference.dim, self.etiqueta.id, declarada) simbolo.SetReference(reference.id) ts.agregar(simbolo) else: if sym is not None: if (sym.tipo == TS.TIPO_DATO.ARRAY) or (sym.tipo == TS.TIPO_DATO.STRUCT): array = sym.valor arreglo = array.values else: print("Este temporal ya contiene un dato") ms.AddMensaje( MS.Mensaje("Este temporal ya contiene un dato", self.linea, self.columna, True, "Semantico")) return None else: array = Arreglo() arreglo = array.values accesos = self.CheckA(self.var.accesos, ts, ms) isint = self.CheckInt(self.var.accesos, ts, ms) level = arreglo for i in range(len(accesos)): #print("lenght: "+str(len(accesos))) if i == (len(accesos)) - 1: #print("fin"+str(i)+str(accesos[i])+str(val)+str(level)) #guardar valor recorrido += str(accesos[i]) if isinstance(self.refvar.GetValor(ts, ms), Arreglo): level[accesos[i]] = self.refvar.GetValor(ts, ms).values else: level[accesos[i]] = self.refvar.GetValor(ts, ms) else: recorrido += str(accesos[i]) if accesos[i] in level: if type(level[accesos[i]]) is dict: #agregar a elemento #print("is instance") level = level[accesos[i]] elif isinstance(level[accesos[i]], str): if i + 2 == len(accesos): if isinstance(accesos[i + 1], int): if accesos[i + 1] < len(level[accesos[i]]): #print("una cadenita:"+str(i)) level[accesos[i]] = level[ accesos[i]][:accesos[i + 1]] + str( self.refvar.GetValor(ts, ms) ) + level[accesos[i]][accesos[i + 1] + 1:] break else: r = len(level[accesos[i]]) adding = "" while r < accesos[i + 1]: adding = adding + " " r += 1 adding += str( self.refvar.GetValor(ts, ms)) level[accesos[i]] = level[ accesos[i]] + adding else: print( "Solo se puede acceder con un numero a una cadena" ) ms.AddMensaje( MS.Mensaje( "Solo se puede acceder con un numero a una cadena", self.linea, self.columna, True, "Semantico")) else: print( "Error no se puede acceder a este tipo de elemento" ) ms.AddMensaje( MS.Mensaje( "Error no se puede acceder a este tipo de elemento", self.linea, self.columna, True, "Semantico")) else: ms.AddMensaje( MS.Mensaje( "No se puede acceder a este tipo de elemento", self.linea, self.columna, True, "Semantico")) print( "error no se puede acceder a este tipo de elemento" ) break else: #iterar o crear #print("I am not" + str(accesos[i])) level[accesos[i]] = {} level = level[accesos[i]] if array.GetTipo(ts, ms) == TS.TIPO_DATO.ARRAY: rol = "Arreglo" else: rol = "Struct" #print("es este:"+str(array.values)+" from: "+self.var.id) GLO.pila = GLO.pila + 1 self.pila = GLO.pila declarada = self.Declaradaen() simbolo = TS.Simbolo(self.var.id, array.GetTipo(ts, ms), array, tipo_et, reference.dim, self.etiqueta.id, declarada) #simbolo = TS.Simbolo(self.var.id, reference.tipo, reference.valor,tipo_et,reference.dim,self.etiqueta.id,declarada) simbolo.SetReference(reference.id) simbolo.SetPosicion(recorrido, reference.id) ts.agregar(simbolo) if sym is not None: ts.actualizar(simbolo) else: ts.agregar(simbolo) return None
def GetValor(self, ts, ms): extipo = self.exp.GetTipo(ts, ms) exvalor = self.exp.GetValor(ts, ms) # print("tipo: "+str(extipo)) # print("valor: "+str(exvalor)) if (self.tipo == TS.TIPO_DATO.INTEGER): if (extipo == TS.TIPO_DATO.FLOAT): return round(exvalor, 0) elif (extipo == TS.TIPO_DATO.INTEGER): return exvalor elif (extipo == TS.TIPO_DATO.CHAR): fletter = exvalor[0] return ord(fletter) elif (extipo == TS.TIPO_DATO.ARRAY): fletter = self.GetFirst(exvalor.values) return ExpConvertida(fletter, self.tipo, self.linea, self.columna).GetValor(ts, ms) else: ms.AddMensaje( MS.Mensaje("No se puede convertir a tipo", self.linea, self.columna, True, "Semantico")) return None elif (self.tipo == TS.TIPO_DATO.FLOAT): if (extipo == TS.TIPO_DATO.INTEGER): return float(exvalor) elif (extipo == TS.TIPO_DATO.FLOAT): return exvalor elif (extipo == TS.TIPO_DATO.CHAR): fletter = exvalor[0] return float(ord(fletter)) elif (extipo == TS.TIPO_DATO.ARRAY): fletter = self.GetFirst(exvalor.values) return ExpConvertida(fletter, self.tipo, self.linea, self.columna).GetValor(ts, ms) else: ms.AddMensaje( MS.Mensaje("No se puede convertir a tipo", self.linea, self.columna, True, "Semantico")) return None elif (self.tipo == TS.TIPO_DATO.CHAR): if (extipo == TS.TIPO_DATO.INTEGER): if (exvalor >= 0) and (exvalor <= 255): return chr(exvalor) else: mod = exvalor % 256 return chr(mod) elif (extipo == TS.TIPO_DATO.FLOAT): ent = round(exvalor, 0) if (ent >= 0) and (ent <= 255): return chr(ent) else: mod = ent % 256 return chr(mod) elif (extipo == TS.TIPO_DATO.CHAR): fletter = exvalor[0] return ord(fletter) elif (extipo == TS.TIPO_DATO.ARRAY): fletter = self.GetFirst(exvalor.values) return ExpConvertida(fletter, self.tipo, self.linea, self.columna).GetValor(ts, ms) else: ms.AddMensaje( MS.Mensaje("No se puede convertir a tipo", self.linea, self.columna, True, "Semantico")) return None else: print("Error: No se puede convertir a tipo") ms.AddMensaje( MS.Mensaje("No se puede convertir a tipo", self.linea, self.columna, True, "Semantico"))
def GetValor(self, ts, ms): sym = ts.obtener(self.id) if sym != None: if self.accesos == None: if sym.reference == None: return sym.valor else: referencia = ts.obtener(sym.reference) refsymbol = TS.Simbolo(self.id, referencia.tipo, referencia.valor, referencia.rol, referencia.dim, sym.ambito, sym.declarada) ts.actualizar(refsymbol) if referencia != None: return referencia.valor else: accesos = self.GetAccesos(self.accesos, ts, ms) isint = self.CheckInt(self.accesos, ts, ms) recorrido = "" if (accesos is None): print("Error obteniendo los accesos") ms.AddMensaje( MS.Mensaje("Error obteniendo los accesos", self.linea, self.columna, True, "Semantico")) return None if (sym.tipo == TS.TIPO_DATO.ARRAY) or (sym.tipo == TS.TIPO_DATO.STRUCT): arreglo = sym.valor value = arreglo level = arreglo.values #print("levels: "+str(level)+" from:"+ self.id) for i in range(len(accesos)): if i == (len(accesos)) - 1: #print("fin"+str(i)) #obtiene valor recorrido += str(accesos[i]) if accesos[i] in level: if sym.reference is None: value = level[accesos[i]] else: if sym.posicion is not None: if recorrido in sym.posicion: refs = ts.obtener( sym.posicion[recorrido]) value = refs.valor level[accesos[i]] = value else: value = level[accesos[i]] else: value = level[accesos[i]] else: print( "Error acceso a esta posicion esta vacios") ms.AddMensaje( MS.Mensaje( "Error acceso a esta posicion esta vacios", self.linea, self.columna, True, "Semantico")) else: recorrido += str(accesos[i]) if accesos[i] in level: if isinstance(level[accesos[i]], dict): #agregar a elemento level = level[accesos[i]] elif isinstance(level[accesos[i]], str): if i + 2 == len(accesos): if isint: if accesos[i + 1] < len( level[accesos[i]]): #print("una cadenita:"+str(i)) return level[accesos[i]][ accesos[i + 1]] else: print( "Posicion mayor a cadena") ms.AddMensaje( MS.Mensaje( "Posicion mayor a cadena", self.linea, self.columna, True, "Semantico")) else: print( "Solo se puede acceder con un numero a una cadena" ) ms.AddMensaje( MS.Mensaje( "Solo se puede acceder con un numero a una cadena", self.linea, self.columna, True, "Semantico")) else: print( "Error no se puede acceder a este tipo de elemento" ) ms.AddMensaje( MS.Mensaje( "Error no se puede acceder a este tipo de elemento", self.linea, self.columna, True, "Semantico")) else: #error no se puede acceder a este tipo de elemento print( "Error no se puede acceder a este tipo de elemento" ) ms.AddMensaje( MS.Mensaje( "Error no se puede acceder a este tipo de elemento", self.linea, self.columna, True, "Semantico")) break else: print( "Error acceso a esta posicion esta vacio") ms.AddMensaje( MS.Mensaje( "Error acceso a esta posicion esta vacio", self.linea, self.columna, True, "Semantico")) break return value elif sym.tipo == TS.TIPO_DATO.CHAR: if len(accesos) == 1: if isint: if accesos[0] < len(sym.valor): return sym.valor[accesos[0]] else: print("Posicion mayor a cadena") ms.AddMensaje( MS.Mensaje("Posicion mayor a cadena", self.linea, self.columna, True, "Semantico")) else: print( "Solo se puede acceder con un numero a una cadena" ) ms.AddMensaje( MS.Mensaje( "Solo se puede acceder con un numero a una cadena", self.linea, self.columna, True, "Semantico")) else: print( "No se puede acceder multiples veces a una cadena") ms.AddMensaje( MS.Mensaje( "No se puede acceder multiples veces a una cadena", self.linea, self.columna, True, "Semantico")) else: print("No se puede aceeder a una variable con este tipo") ms.AddMensaje( MS.Mensaje( "No se puede aceeder a una variable con este tipo", self.linea, self.columna, True, "Semantico")) print("No existe esta variable") ms.AddMensaje( MS.Mensaje("No existe esta variable", self.linea, self.columna, True, "Semantico")) return None
def ejecutar(self, ts,ms): sym = ts.obtener(self.var.id) val = self.valor.GetValor(ts,ms) tipo_et=self.DefineRol(self.var.id) #print("id: "+str(self.var.id)+" accesos:"+str(self.var.accesos)) if self.var.accesos == None: if sym is not None: GLO.pila = GLO.pila +1 self.pila = GLO.pila declarada = self.Declaradaen() simbolo = TS.Simbolo(self.var.id, self.valor.GetTipo(ts,ms), val,tipo_et,1,self.etiqueta.id,declarada) if(sym.reference != None): reference = ts.obtener(sym.reference) refsymbol = TS.Simbolo(sym.reference, self.valor.GetTipo(ts,ms), val,tipo_et,1,self.etiqueta.id,declarada) simbolo.SetReference(sym.reference) ts.actualizar(refsymbol) ts.actualizar(simbolo) else: if tipo_et == "Parametro": self.etiqueta.rol = "Metodo" elif tipo_et =="Retorno de valor": self.etiqueta.rol = "Funcion" GLO.pila = GLO.pila +1 self.pila = GLO.pila declarada = self.Declaradaen() simbolo = TS.Simbolo(self.var.id, self.valor.GetTipo(ts,ms), val,tipo_et,1,self.etiqueta.id,declarada) ts.agregar(simbolo) else: if sym is not None: if (sym.tipo == TS.TIPO_DATO.ARRAY) or (sym.tipo == TS.TIPO_DATO.STRUCT): array = sym.valor arreglo=array.values else: print("Este temporal ya contiene un dato") ms.AddMensaje(MS.Mensaje("Este temporal ya contiene un dato",self.linea,self.columna,True,"Semantico")) return None else: array = Arreglo() arreglo = array.values accesos = self.CheckA(self.var.accesos,ts,ms) isint = self.CheckInt(self.var.accesos,ts,ms) level=arreglo recorrido = "" for i in range(len(accesos)): #print("lenght: "+str(len(accesos))) if i==(len(accesos))-1: #print("fin"+str(i)+str(accesos[i])+str(val)+str(level)) #guardar valor recorrido+=str(accesos[i]) level[accesos[i]] = val if sym is not None: if sym.reference is not None: if sym.posicion is not None: if recorrido in sym.posicion: refs = ts.obtener(sym.posicion[recorrido]) refs.valor = val else: recorrido+=str(accesos[i]) if accesos[i] in level: if type(level[accesos[i]]) is dict: #agregar a elemento #print("is instance") level = level[accesos[i]] elif isinstance(level[accesos[i]],str): if i + 2== len(accesos): if isinstance(accesos[i+1],int): if accesos[i+1] < len(level[accesos[i]]): #print("una cadenita:"+str(i)) level[accesos[i]] = level[accesos[i]][:accesos[i+1]] + str(val) + level[accesos[i]][accesos[i+1]+1:] break else: r = len(level[accesos[i]]) adding = "" while r < accesos[i+1]: adding = adding + " " r+=1 adding += str(val) level[accesos[i]] = level[accesos[i]] + adding else: print("Solo se puede acceder con un numero a una cadena") ms.AddMensaje(MS.Mensaje("Solo se puede acceder con un numero a una cadena",self.linea,self.columna,True,"Semantico")) else: print("Error no se puede acceder a este tipo de elemento") ms.AddMensaje(MS.Mensaje("Error no se puede acceder a este tipo de elemento",self.linea,self.columna,True,"Semantico")) else: ms.AddMensaje(MS.Mensaje("No se puede acceder a este tipo de elemento",self.linea,self.columna,True,"Semantico")) print("error no se puede acceder a este tipo de elemento") break else: #iterar o crear #print("I am not" + str(accesos[i])) level[accesos[i]]={} level = level[accesos[i]] if array.GetTipo(ts,ms) == TS.TIPO_DATO.ARRAY: rol = "Arreglo" else: rol = "Struct" dim = len(accesos) GLO.pila = GLO.pila + dim + len(array.values) self.pila = GLO.pila declarada = self.Declaradaen() simbolo = TS.Simbolo(self.var.id, array.GetTipo(ts,ms), array,tipo_et,dim,self.etiqueta.id,declarada) if sym is not None: if sym.posicion is not None: simbolo.posicion = sym.posicion simbolo.SetReference(sym.reference) ts.actualizar(simbolo) if(sym.reference != None) and (sym.posicion is None): reference = ts.obtener(sym.reference) refsymbol = TS.Simbolo(reference, array.GetTipo(ts,ms), array,tipo_et,dim,self.etiqueta.id,declarada) ts.actualizar(refsymbol) simbolo.SetReference(sym.reference) else: ts.agregar(simbolo) return None