Ejemplo n.º 1
0
    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
Ejemplo n.º 2
0
    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"))
Ejemplo n.º 3
0
    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
Ejemplo n.º 4
0
    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
Ejemplo n.º 5
0
    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")
Ejemplo n.º 6
0
 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)
Ejemplo n.º 7
0
 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"))
Ejemplo n.º 8
0
 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)
Ejemplo n.º 9
0
    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
Ejemplo n.º 10
0
    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"))
Ejemplo n.º 11
0
    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
Ejemplo n.º 12
0
    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