Esempio n. 1
0
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
Esempio n. 2
0
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')
Esempio n. 3
0
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
Esempio n. 4
0
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
Esempio n. 5
0
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
Esempio n. 6
0
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)