def Comprobar_Crear_Arreglo(registro, ts): searched = ts.obtener(registro) if searched is None: nuevosimbolo = TS.Simbolo(TS.TIPO_DATO.ARRAY, {}) ts.agregar(nuevosimbolo, registro) dic = ts.obtener(registro).valor return dic elif type(searched.valor) is dict: return searched.valor # devuelo el diccionario else: # creao o actualizo el arreglo nuevosimbolo = TS.Simbolo(TS.TIPO_DATO.ARRAY, {}) ts.actualizar(nuevosimbolo, registro) searched = ts.obtener(registro) # vuelo a traer su simbolo return searched.valor # devuelo el diccionario pertinente
def accion_LlenarTsEtiquetas(instrucciones, ts): try: size = len(instrucciones) i = 0 lastflagnane = "" flagetiq = False while (i < size): if isinstance(instrucciones[i], Etiqueta): accion_etiqueta(instrucciones[i], ts, i) lastflagnane = instrucciones[i].iden flagetiq = True if isinstance(instrucciones[i], declaracion): var = instrucciones[i].variable.registro if '$a' in var: if flagetiq is True: lastindex = ts.obtener(lastflagnane).valor simbolo = TS.Simbolo(TS.TIPO_DATO.METODO, lastindex) ts.actualizar(simbolo, lastflagnane) elif '$v' in var: if flagetiq is True: lastindex = ts.obtener(lastflagnane).valor simbolo = TS.Simbolo(TS.TIPO_DATO.FUNCION, lastindex) ts.actualizar(simbolo, lastflagnane) if isinstance(instrucciones[i], asignacion): var = "" if isinstance(instrucciones[i].variable, ExpresionArreglo): var = instrucciones[i].variable.id else: var = instrucciones[i].variable.registro if '$a' in var: if flagetiq is True: lastindex = ts.obtener(lastflagnane).valor simbolo = TS.Simbolo(TS.TIPO_DATO.METODO, lastindex) ts.actualizar(simbolo, lastflagnane) elif '$v' in var: if flagetiq is True: lastindex = ts.obtener(lastflagnane).valor simbolo = TS.Simbolo(TS.TIPO_DATO.FUNCION, lastindex) ts.actualizar(simbolo, lastflagnane) if isinstance(instrucciones[i], Goto): pass i += 1 except: print('Error En Primera Pasada')
def accion_etiqueta(inst, ts, posicion): searched_var = ts.obtener(inst.iden) if searched_var is None: simbolo = TS.Simbolo(TS.TIPO_DATO.ETIQUETA, posicion) # lo inicializamos en metodo ts.agregar(simbolo, inst.iden) # agregamos la etiqueta a la tabla de simbolos
def Obtener_o_Crear_Id(variable, ts): searched_var = ts.obtener(variable) if searched_var is None: # creamos variable simbolo = TS.Simbolo(TS.TIPO_DATO.NUMERO, 0) # lo inicializo en 0 ts.agregar(simbolo, variable) # crea una nueva variable en la tabla de simbolos return variable # solo retorno de mas el nombre
def accion_declaracion(inst, ts): searched_var = ts.obtener(inst.variable.registro) if searched_var is None: simbolo = TS.Simbolo(TS.TIPO_DATO.NUMERO, 0) # lo inicializo en 0 ts.agregar(simbolo, inst.variable.registro ) # crea una nueva variable en la tabla de simbolos
def accion_asignar(instr, ts): if isinstance(instr.valor, ExpresionReferencia): simboloref = ts.ObtenerTabla()[ instr.valor.registro. registro] # obtengo el dic de la referencia que estoy haciendo ts.agregar(simboloref, instr.variable.registro ) # creo una nueva variable pero con el mismo simbolo elif isinstance(instr.variable, ExpresionArreglo): diccionario = Comprobar_Crear_Arreglo(instr.variable.id, ts) llaveconcatenada = "" result = "" indexlast = [] lastflag = False for lista in instr.variable.dimension: # voy obteniendo las dimensiones de los registros if lastflag is False: valor = resolver_Expresion(lista.registro, ts) llaveconcatenada += '$' + str(valor) result = diccionario.get(llaveconcatenada, None) if result is not None: lastflag = True else: indexlast.append( resolver_Expresion(lista.registro, ts) ) # agregando las dimensiones luego del valor en caso existan # Procedo a hacer la insercion o modiicacion if len(indexlast) > 0: # cambiar caracter, modifcar val o error if len(indexlast) == 1: valor = diccionario.get(llaveconcatenada) nuevocaracter = resolver_Expresion(instr.valor, ts) # llamada a metodo exterior if type(valor) is int: print('Acceso Denegado') else: nuevacadena = replace_str_index(valor, int(indexlast[0]), nuevocaracter[0]) diccionario[llaveconcatenada] = nuevacadena nuevo = TS.Simbolo(TS.TIPO_DATO.ARRAY, diccionario) ts.actualizar(nuevo, instr.variable.id) else: print('Dimensiones Incorrectas') else: # tengo que crear una nueva llave valor = resolver_Expresion(instr.valor, ts) diccionario[llaveconcatenada] = valor nuevo = TS.Simbolo(TS.TIPO_DATO.ARRAY, diccionario) ts.actualizar(nuevo, instr.variable.id) else: valor = resolver_Expresion(instr.valor, ts) # Obtenie la operacion de la expresion id = Obtener_o_Crear_Id(instr.variable.registro, ts) # una vez comprobada ya esta creada la var o verificada if type(valor) is str: simbolo = ts.obtener( id) # obtengo el simbolo para no perder referencia simbolo.tipo = TS.TIPO_DATO.CADENA simbolo.valor = valor ts.actualizar(simbolo, id) elif type(valor) is int: simbolo = ts.obtener( id) # obtengo el simbolo para no perder referencia simbolo.tipo = TS.TIPO_DATO.NUMERO simbolo.valor = valor ts.actualizar(simbolo, id) elif type(valor) is float: simbolo = ts.obtener( id) # Obtengo el simbolo para no perder referencia simbolo.tipo = TS.TIPO_DATO.FLOAT simbolo.valor = valor ts.actualizar(simbolo, id) elif type(valor) is dict: simbolo = ts.obtener( id) # Obtengo el simbolo para no perder referencia simbolo.tipo = TS.TIPO_DATO.ARRAY simbolo.valor = valor # el nuevo array ts.actualizar(simbolo, id)