def __init__(self,Raiz): self.Raiz=Raiz self.imprimir="---- Consola-----\n" self.error="----- Error ----\n" self.tabla_simbolos=tabladesimbolos() #instancio mi tabla simbolos self.lsen=[] self.i=0 self.fin=0 self.posLabel=0
def acciones_array(self, Raiz,valorP): result = None # raiz es variable # valor p es el resultado de la exprecion if valorP != None: #ejecuto la asignacion de la dimencion nombre_variable=Raiz.hijos[0].valor variable_arry=self.tabla_simbolos.get_symbol(nombre_variable) if(variable_arry!=None and variable_arry.rol=='array'): arbol_param_acceso=Raiz.hijos[1] if len (arbol_param_acceso.hijos)==1: # solo una dimencion id=arbol_param_acceso.hijos[0] id=self.acciones_exp_num(id) if(valorP.tipo == 'cadena'): id_chr=0 nuevo_simbolo=Simbolo(id.valor,'l_array','','array','1','0') nuevo_simbolo.valor=tabladesimbolos({}) variable_arry.valor.add_symbol(nuevo_simbolo) variable_arry=nuevo_simbolo for i in valorP.valor: nuevo_simbolo=Simbolo(str(id_chr),'char',i,'var','1','1') variable_arry.valor.add_symbol(nuevo_simbolo) id_chr+=1 else: nuevo_simbolo=Simbolo(id.valor,valorP.tipo,valorP.valor,'var','1','0') variable_arry.valor.add_symbol(nuevo_simbolo) else: # mas dimenciones n tam=len(arbol_param_acceso.hijos) for i in range(tam-1): hijo=arbol_param_acceso.hijos[i] id=self.acciones_exp_num(hijo) dimension=variable_arry.valor.get_symbol(id.valor) if(dimension==None): nuevo_simbolo=Simbolo(id.valor,'array','','array','1','0') nuevo_simbolo.valor=tabladesimbolos({}) variable_arry.valor.add_symbol(nuevo_simbolo) variable_arry=nuevo_simbolo # corrimiento para la nueva dimension else: variable_arry = dimension # ultimo hijo parametro y se guarda el valor hijo=arbol_param_acceso.hijos[tam-1] id=self.acciones_exp_num(hijo) if(valorP.tipo != 'cadena'): nuevo_simbolo=Simbolo(id.valor,valorP.tipo,valorP.valor,'var','1','0') if(variable_arry.tipo!='array'): self.error+= "Error en array el indice "+id.valor +" ya esta ocupado \n" else: variable_arry.valor.add_symbol(nuevo_simbolo) else: nuevo_simbolo=Simbolo(id.valor,'l_array','','array','1','0') if(variable_arry.tipo!='array'): if(len(valorP.valor)==1 and valorP.tipo=='cadena'): aux_char=variable_arry.valor.get_symbol(id.valor) if(aux_char!=None): aux_char.valor=valorP.valor else: self.error+= "Error en array el indice "+id.valor +" ya esta ocupado \n" else: nuevo_simbolo.valor=tabladesimbolos({}) variable_arry.valor.add_symbol(nuevo_simbolo) variable_arry=nuevo_simbolo if(valorP.tipo == 'cadena'): id_chr=0 for i in valorP.valor: nuevo_simbolo=Simbolo(str(id_chr),'char',i,'var','1','1') variable_arry.valor.add_symbol(nuevo_simbolo) id_chr+=1 #ingresar cadena de caracteres a un vector else: self.error+= "Error no es un vector la variable "+nombre_variable+"\n" else: self.error+="Error de asignacion en vec \n" return result
def acciones(self,Raiz): resutl=None #consola1=consola if Raiz.produccion=='lista_inst': # listas de hijos de produccion lista de instancias self.lsen=Raiz.hijos # es la lista de hijos de lista_inta self.fin=len(self.lsen) for j in range(self.i,self.fin): self.posLabel+=1 node=self.lsen[j] if(isinstance(node,LexToken)): s=0 else: resutl=self.acciones(node) if(resutl!=None): if(resutl.tipo=='goto'): break elif(resutl.tipo=='exit'): break if(resutl!=None): if(resutl.tipo=='goto'): self.i=int(resutl.valor) resutl=self.acciones(self.Raiz) # si el result dice que ve vengo de un goto # paro el for y cambio el inicio del i # y vuelvo a entrar al mismo metodo elif Raiz.produccion=='asignacion': # tenes dos hijos izq=Raiz.hijos[0] #hijo izq el nombre de la variable der=Raiz.hijos[1] # hijo de derecho tenes expresion if len(izq.hijos)==1: izq=self.acciones(izq) # el var y esta en tablal de simblos / objeto simbolo der=self.acciones(der) # obtengo el resultado del arbol exp_num y me devuelve un objeto tipo simbolo o un null si hubo un error if der != None: # no hay un error en tiempo de ejecucion izq.tipo=der.tipo izq.valor=der.valor izq.rol = der.rol self.tabla_simbolos.update_symbol(izq) else: #existe un error en tiempo de ejecucion self.error+="existe un error en la Asignacion \n" else: der=self.acciones(der,consola1) if der != None: sim=der resutl = self.acciones_array(Raiz.hijos[0],sim) else: self.error+="existe un error en la operacion \n" elif Raiz.produccion=='variable': if len(Raiz.hijos)==1: # es crear una variable simple izq=Raiz.hijos[0] resutl=self.acciones(izq) else: #pasos para accesar a un vector print('') elif Raiz.produccion=='var': # solo el nombre de la variable nombre=Raiz.valor #obtengo el nombre de la variable buscar_simbolo=self.tabla_simbolos.get_symbol(nombre) if(buscar_simbolo!=None): resutl=buscar_simbolo else: nuevo_simbolo=Simbolo(nombre,'sin','0','var','1','0') self.tabla_simbolos.add_symbol(nuevo_simbolo) resutl=nuevo_simbolo elif Raiz.produccion == 'imprimir': resutl=self.acciones(Raiz.hijos[0]) cadenafinal="" if resutl != None: if(resutl.tipo=='l_array'): cadena_array=resutl.valor for char in cadena_array.simbolos: char_simbolo=cadena_array.get_symbol(char) cadenafinal+=char_simbolo.valor self.imprimir+=cadenafinal+"\n" #consola1.appendPlainText(cadenafinal) #imprimir cada dato del array elif(resutl.tipo=='cadena'): self.imprimir+=resutl.valor+"\n" #consola1.appendPlainText(resutl.valor) else: #consola1.appendPlainText(resutl.valor) self.imprimir+=resutl.valor+"\n" elif Raiz.produccion == 'array': nuevo_simbolo=Simbolo('sin','array',{},'array','1','1') nuevo_simbolo.valor=tabladesimbolos({}) resutl=nuevo_simbolo elif Raiz.produccion == 'exp_num': resutl=self.acciones_exp_num(Raiz) elif Raiz.produccion == 'exp_rel': resutl = self.acciones_exp_rel(Raiz) elif Raiz.produccion == 'exp_log': resutl = self.acciones_exp_log(Raiz) elif Raiz.produccion == 'valorIMP': resutl=self.acciones_exp_num(Raiz) elif Raiz.produccion == 'entero': resutl = self.acciones_exp_num(Raiz) elif Raiz.produccion == 'cadena': resutl = self.acciones_exp_num(Raiz) elif Raiz.produccion == 'var': resutl = self.acciones_exp_num(Raiz) elif Raiz.produccion == 'decimal': resutl = self.acciones_exp_num(Raiz) elif Raiz.produccion == 'negativo': resutl = self.acciones_negativo(Raiz) elif Raiz.produccion == 'abs': resutl = self.acciones_abs(Raiz) elif Raiz.produccion == 'conversion': resutl = self.acciones_conversion(Raiz) elif Raiz.produccion == 'read': resutl = self.acciones_read(Raiz) ############## ACCIONES GO TO elif Raiz.produccion == 'label': resutl = self.acciones_label(Raiz) elif Raiz.produccion == 'goto': resutl = self.acciones_goto(Raiz) ############### ACCCIONES IF elif Raiz.produccion == 'sentenciaif': resutl = self.acciones_if(Raiz) ############### ACCION EXIT elif Raiz.produccion == 'exit': resutl = self.accion_exit(Raiz) return resutl