def acciones_exp_log(self, Raiz):
        result=None
        if Raiz.produccion=='exp_log':
            izq = Raiz.hijos[0] # seria el valor de el lado izq
            op  = Raiz.hijos[1] # seria el operador >, <, >=, <=, !=
            der = Raiz.hijos[2] # seria el valor derecho
            izq=self.acciones_exp_log(izq) # ya tengo el valor del hijo izq
            der=self.acciones_exp_log(der) # ya tengo el valor del hijo der
            result=self.operaciones_logicas(izq,der,op.produccion) # me regresa el objeto de tipo simbolo

        elif Raiz.produccion == 'entero':
            result = Simbolo('numero','entero',str(Raiz.valor),'var','1','0')
        elif Raiz.produccion == 'cadena':
            result = Simbolo('cadena','cadena',str(Raiz.valor),'var','1','0')
        elif Raiz.produccion == 'decimal':
            result = Simbolo('decimal','decimal',str(Raiz.valor),'var','1','0')
        

        elif Raiz.produccion == 'variable':
            if len(Raiz.hijos)==1:
                # acceso a un avariable
                izq=Raiz.hijos[0]
                result=self.acciones_exp_num(izq)

            else:
                #acceso a un vector
                a=""
        elif Raiz.produccion=='var':
            # busco el simbolo en la tabla de simbolos
            nombre=Raiz.valor #obtengo el nombre de la variable
            result=self.tabla_simbolos.get_symbol(nombre)
        return result      
Exemple #2
0
    def operaciones_bit_bit(self, izq, der,op):
        result=None
        if (izq!=None and der!=None):
            if(izq.tipo=='entero' and der.tipo=='entero'):
                if(op=='orbit'):
                    valor=str(int(izq.valor)|int(der.valor))
                    new=Simbolo('sin','entero',valor,'var',str(len(valor)),'0')
                    result=new
                    return result
                elif(op=='xorbit'):
                    valor=str(int(izq.valor)^int(der.valor))
                    new=Simbolo('sin','entero',valor,'var',str(len(valor)),'0')
                    result=new
                    return result
                elif(op=='shiftizq'):
                    valor=str(int(izq.valor)<<int(der.valor))
                    new=Simbolo('sin','entero',valor,'var',str(len(valor)),'0')
                    result=new
                    return result  
                elif(op=='shiftder'):
                    valor=str(int(izq.valor)>>int(der.valor))
                    new=Simbolo('sin','entero',valor,'var',str(len(valor)),'0')
                    result=new
                    return result                  

            else:
                self.error+="Solo se puede operar numeros enteros\n"
                result=None
                return result
        else:
            self.error+="Error en la conversion negativa del bit"
            result=None
        return result
 def acciones_accesso_array(self,Raiz):
  
     result=None
     id_variable=Raiz.hijos[0].valor
     id_variable_simbolo=self.tabla_simbolos.get_symbol(id_variable)
     #validar si es rol array y tipo array..........
     if(id_variable_simbolo!=None and id_variable_simbolo.rol=='array'):
         if id_variable_simbolo !=None:
             arbol_param_acceso=Raiz.hijos[1]
             for acceso in arbol_param_acceso.hijos:
                 id_acceso=self.acciones_exp_num(acceso)
                 # busco del ambito actual  -> id_variable_simbolo
                 try:
                     ambito=id_variable_simbolo.valor.get_symbol(id_acceso.valor)
                 except:
                     self.error+="Error no se encuentra el indice "+ambito.valor+ "\n"
                 if (ambito != None):
                     id_variable_simbolo=ambito
                 else:
                     self.error+="no existe el acceso al indice "+id_acceso.valor+"\n"
                     id_variable_simbolo=None
                     break
             if(id_variable_simbolo!=None):
                 result=Simbolo('nada',id_variable_simbolo.tipo,id_variable_simbolo.valor,'valor puntal','1','1')
                 
                 
         else:
             self.error+="error no existe\n"
     else:
         self.error+="la variable "+id_variable+ " no es un array\n"
     return result
    def acciones_exp_num(self,Raiz):
        result=None
        if Raiz.produccion=='exp_num':
            izq = Raiz.hijos[0] # seria el valor de el lado izq
            op  = Raiz.hijos[1] # seria el operador + ,-,*,/,%
            der = Raiz.hijos[2] # seria el valor derecho
            izq=self.acciones_exp_num(izq) # ya tengo el valor del hijo izq
            der=self.acciones_exp_num(der) # ya tengo el valor del hijo der
            result=self.operaciones_aritmeticas(izq,der,op.produccion) # me regresa el objeto de tipo simbolo

        elif Raiz.produccion == 'entero':
            result = Simbolo('numero','entero',str(Raiz.valor),'var','1','0')
        elif Raiz.produccion == 'cadena':
            if(Raiz.valor=='\\n'):
                self.imprimir+="\n"
            else:
                result = Simbolo('cadena','cadena',str(Raiz.valor),'var','1','0')
        elif Raiz.produccion == 'decimal':
            result = Simbolo('decimal','decimal',str(Raiz.valor),'var','1','0')
        
        elif Raiz.produccion == 'valorIMP':
            result = self.acciones_exp_num(Raiz.hijos[0])
        elif Raiz.produccion == 'variable':
            if len(Raiz.hijos)==1:
                # acceso a un avariable
                izq=Raiz.hijos[0]
                result=self.acciones_exp_num(izq)

            else:
                #acceso a un vector
                result=self.acciones_accesso_array(Raiz)
        
        elif Raiz.produccion=='var':
            # busco el simbolo en la tabla de simbolos
            nombre=Raiz.valor #obtengo el nombre de la variable
            aux=self.tabla_simbolos.get_symbol(nombre)
            if(aux!=None):
                if(aux.tipo=='array'):
                    self.error+="Error en "+ str(nombre)+ " no se puede imprimir un arreglo \n"
                    result=None
                else:
                    result=self.tabla_simbolos.get_symbol(nombre)
            else:
                self.error+="Error no existe la variable "+str(nombre)+"\n"
                result=None
        return result
 def acciones_goto(self,Raiz):
     result=None
     label=Raiz.hijos[0].valor
     
     pos=self.buscar_etiqueta(label)
     if(pos!=None):
         nuevo_simbolo=Simbolo(label,'goto',pos,'goto','0','0')
         result=nuevo_simbolo
     return result
 def  acciones_negativo(self,Raiz):
     result = None
     if Raiz.produccion == 'negativo':
         izq = Raiz.hijos[0]
         result = self.acciones_negativo(izq)
         
         
     elif Raiz.produccion=='var' :
         # busco el simbolo en la tabla de simbolos
         nombre=Raiz.valor #obtengo el nombre de la variable
         valor_var=self.tabla_simbolos.get_symbol(nombre)
         valor_var.valor='-'+valor_var.valor
         result =self.tabla_simbolos.get_symbol(nombre)
     elif Raiz.produccion == 'entero':
         Raiz.valor = Raiz.valor*-1
         result = Simbolo('numero','entero',str(Raiz.valor),'var','1','0')
     elif Raiz.produccion == 'decimal':
         Raiz.valor = Raiz.valor*-1
         result = Simbolo('numero','decimal',str(Raiz.valor),'var','1','0')
     return result
Exemple #7
0
    def acciones_read(self,Raiz,consola):
        result=None
        consola1=consola
        if(Raiz.produccion=='read'):
            myvar = easygui.enterbox("Ingrese Valor")
            if myvar.isdigit():
                aux=int(myvar)
                result=Simbolo('sin','entero',str(aux),'var','0','0')
                #consola1.appendPlainText(str(aux))
                return result
            else:
                aux=str(myvar)
                result=Simbolo('sin','cadena',str(aux),'var','0','0')
                #consola1.appendPlainText(aux)
                return result
                 
        else:
            self.error+= 'Error en la lectura\n'
            result=None

        return result  
 def acciones_abs(self, Raiz):
     result = None
     if result!=None:
         if Raiz.produccion == 'abs':
             izq = Raiz.hijos[0]
             result = self.acciones_abs(izq)
         elif Raiz.produccion=='var' :
             # busco el simbolo en la tabla de simbolos
             nombre=Raiz.valor #obtengo el nombre de la variable
             valor_var=self.tabla_simbolos.get_symbol(nombre)
             valor_var.valor= str(abs(int(valor_var.valor)))
             result =self.tabla_simbolos.get_symbol(nombre)
         elif Raiz.produccion == 'entero':
             Raiz.valor = abs(Raiz.valor)
             result = Simbolo('numero','entero',str(Raiz.valor),'var','1','0')
         elif Raiz.produccion == 'decimal':
             Raiz.valor = abs(Raiz.valor)
             result = Simbolo('numero','decimal',str(Raiz.valor),'var','1','0')
     else:
         self.error+="error de valor absoluto\n"
     return result
    def acciones_read(self,Raiz):
        result=None
        if(Raiz.produccion=='read'):
            # while True:
            #     num = input()
            #     try:
            #         valor_lectura = int(num)
            #         nuevo_simbolo = Simbolo('sin','entero',str(valor_lectura),'entero','1','1')
            #         result=nuevo_simbolo
            #         break;
            #     except ValueError:
            #         try:
            #             valor_lectura = float(num)
            #             nuevo_simbolo = Simbolo('sin','decimal',str(valor_lectura),'decimal','1','1')
            #             result=nuevo_simbolo
            #             break;
            #         except ValueError:
            #             print ("Ingreso un valor numerico valido")
            
            master = tk.Tk()
            tk.Label(master, 
            text="Ingresar Valor ").grid(row=0)
            
            v = StringVar()
            e1 = tk.Entry(master, textvariable=v)
            

            e1.grid(row=0, column=1)
            

            tk.Button(master, 
            text='Ingresar ', 
            command=master.quit).grid(row=2, 
                                    column=0, 
                                    sticky=tk.W, 
                                    pady=4)
            
            tk.mainloop()
            nuevo_simbolo = Simbolo('sin','var',v.get(),'sin','1','1')
            result=nuevo_simbolo           
        else:
            self.error+= 'Error en la lectura\n'

        return result       
Exemple #10
0
    def operacion_not_bit(self,Raiz):
        result=None
        if Raiz!=None:
            sim=Raiz.hijos[0]
            if(sim.produccion=='var'and sim!=None):
                nuevo_simbolo=self.tabla_simbolos.get_symbol(sim.valor)
                if(nuevo_simbolo.tipo=='entero'):
                    
                    valor=str(~int(nuevo_simbolo.valor))
                    new=Simbolo(nuevo_simbolo.id,nuevo_simbolo.tipo,valor,nuevo_simbolo.rol,str(len(valor)),'0')
                    result = new
                    return result
                else:

                    self.error+="No se puede hacer el negativo de "+nuevo_simbolo.id+"\n"
                    result=None
                    return result
        else:
            self.error+="Error en la conversion negativa del bit"
            result=None
        return result
Exemple #11
0
    def acciones_exp_bit(self, Raiz):
        result=None
        if(Raiz!=None):
            if Raiz.produccion=='exp_bit_bit':
                izq = Raiz.hijos[0] # seria el valor de el lado izq
                op  = Raiz.hijos[1] # seria el operador bit a bit
                der = Raiz.hijos[2] # seria el valor derecho
                izq=self.acciones_exp_bit(izq) # ya tengo el valor del hijo izq
                der=self.acciones_exp_bit(der) # ya tengo el valor del hijo der
                result=self.operaciones_bit_bit(izq,der,op.produccion) # me regresa el objeto de tipo simbolo

            elif Raiz.produccion == 'entero':
                result = Simbolo('numero','entero',str(Raiz.valor),'var','1','0')

            elif Raiz.produccion=='var':
                # busco el simbolo en la tabla de simbolos
                nombre=Raiz.valor #obtengo el nombre de la variable
                result=self.tabla_simbolos.get_symbol(nombre)
        else:
            self.result+="Error en operacion bit a bit\n"
            result=None
        return result
    def operaciones_logicas(self, izq,der,op):
        result=None
        num = 0
        if (izq!=None) and (der!=None):
            if op == 'and':
                if izq.tipo=="entero" and der.tipo == "entero":     num=int(izq.valor) and int(der.valor)
                elif izq.tipo=="entero" and der.tipo == "decimal":  num=int(izq.valor) and float(der.valor)
                elif izq.tipo=="decimal" and der.tipo == "entero":  num=float(izq.valor) and int(der.valor)
                elif izq.tipo=="decimal" and der.tipo == "decimal": num=float(izq.valor) and float(der.valor)
                elif izq.tipo=="cadena" and der.tipo == "entero":   num=izq.valor and int(der.valor)
                elif izq.tipo=="cadena" and der.tipo == "decimal":  num=izq.valor and float(der.valor)
                elif izq.tipo=="cadena" and der.tipo == "cadena":   num=izq.valor and der.valor
                    
            elif op == 'or':
                if izq.tipo=="entero" and der.tipo == "entero":     num=int(izq.valor) or int(der.valor)
                elif izq.tipo=="entero" and der.tipo == "decimal":  num=int(izq.valor) or float(der.valor)
                elif izq.tipo=="decimal" and der.tipo == "entero":  num=float(izq.valor) or int(der.valor)
                elif izq.tipo=="decimal" and der.tipo == "decimal": num=float(izq.valor) or float(der.valor)
                elif izq.tipo=="cadena" and der.tipo == "entero":   num=izq.valor or int(der.valor)
                elif izq.tipo=="cadena" and der.tipo == "decimal":  num=izq.valor or float(der.valor)
                elif izq.tipo=="cadena" and der.tipo == "cadena":   num=izq.valor or der.valor

            elif op == 'xor':
                if izq.tipo=="entero" and der.tipo == "entero":     num=int(izq.valor) ^ int(der.valor)
                elif izq.tipo=="entero" and der.tipo == "decimal":  num=int(izq.valor) ^ float(der.valor)
                elif izq.tipo=="decimal" and der.tipo == "entero":  num=float(izq.valor)^int(der.valor)
                elif izq.tipo=="decimal" and der.tipo == "decimal": num=float(izq.valor)^float(der.valor)
                elif izq.tipo=="cadena" and der.tipo == "entero":   num=izq.valor^int(der.valor)
                elif izq.tipo=="cadena" and der.tipo == "decimal":  num=izq.valor^float(der.valor)
                elif izq.tipo=="cadena" and der.tipo == "cadena":   num=izq.valor^der.valor

            if num == True: num=1
            else:           num=0
            result=Simbolo('nada','bool',str(num),'var','0','1')        
        else:
            self.error+="Error En la Expresion Logica\n"
            result=None
        return result
    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 operaciones_relacionales(self,izq,der,op):
        result=None
        num = 0
        if(izq!=None and der!=None):
            if op == 'mayorque':
                if izq.tipo=="entero" and der.tipo == "entero":     num=int(izq.valor)>int(der.valor)
                elif izq.tipo=="entero" and der.tipo == "decimal":  num=int(izq.valor)>float(der.valor)
                elif izq.tipo=="decimal" and der.tipo == "entero":  num=float(izq.valor)>int(der.valor)
                elif izq.tipo=="decimal" and der.tipo == "decimal": num=float(izq.valor)>float(der.valor)
                elif izq.tipo=="cadena" and der.tipo == "entero":   num=izq.valor>int(der.valor)
                elif izq.tipo=="cadena" and der.tipo == "decimal":  num=izq.valor>float(der.valor)
                elif izq.tipo=="cadena" and der.tipo == "cadena":   num=izq.valor>der.valor
                    
            elif op == 'menorque':
                if izq.tipo=="entero" and der.tipo == "entero":     num=int(izq.valor) < int(der.valor)
                elif izq.tipo=="entero" and der.tipo == "decimal":  num=int(izq.valor)<float(der.valor)
                elif izq.tipo=="decimal" and der.tipo == "entero":  num=float(izq.valor)<int(der.valor)
                elif izq.tipo=="decimal" and der.tipo == "decimal": num=float(izq.valor)<float(der.valor)
                elif izq.tipo=="cadena" and der.tipo == "entero":   num=izq.valor<int(der.valor)
                elif izq.tipo=="cadena" and der.tipo == "decimal":  num=izq.valor<float(der.valor)
                elif izq.tipo=="cadena" and der.tipo == "cadena":   num=izq.valor<der.valor

            elif op == 'igualque':
                if izq.tipo=="entero" and der.tipo == "entero":     num=int(izq.valor)==int(der.valor)
                elif izq.tipo=="entero" and der.tipo == "decimal":  num=int(izq.valor)==float(der.valor)
                elif izq.tipo=="decimal" and der.tipo == "entero":  num=float(izq.valor)==int(der.valor)
                elif izq.tipo=="decimal" and der.tipo == "decimal": num=float(izq.valor)==float(der.valor)
                elif izq.tipo=="cadena" and der.tipo == "entero":   num=izq.valor==int(der.valor)
                elif izq.tipo=="cadena" and der.tipo == "decimal":  num=izq.valor==float(der.valor)
                elif izq.tipo=="cadena" and der.tipo == "cadena":   num=izq.valor==der.valor

            elif op == 'noigual':
                if izq.tipo=="entero" and der.tipo == "entero":     num=int(izq.valor)!=int(der.valor)
                elif izq.tipo=="entero" and der.tipo == "decimal":  num=int(izq.valor)!=float(der.valor)
                elif izq.tipo=="decimal" and der.tipo == "entero":  num=float(izq.valor)!=int(der.valor)
                elif izq.tipo=="decimal" and der.tipo == "decimal": num=float(izq.valor)!=float(der.valor)
                elif izq.tipo=="cadena" and der.tipo == "entero":   num=izq.valor!=int(der.valor)
                elif izq.tipo=="cadena" and der.tipo == "decimal":  num=izq.valor!=float(der.valor)
                elif izq.tipo=="cadena" and der.tipo == "cadena":   num=izq.valor!=der.valor

            elif op == 'menorigualque':
                if izq.tipo=="entero" and der.tipo == "entero":     num=int(izq.valor)<=int(der.valor)
                elif izq.tipo=="entero" and der.tipo == "decimal":  num=int(izq.valor)<=float(der.valor)
                elif izq.tipo=="decimal" and der.tipo == "entero":  num=float(izq.valor)<=int(der.valor)
                elif izq.tipo=="decimal" and der.tipo == "decimal": num=float(izq.valor)<=float(der.valor)
                elif izq.tipo=="cadena" and der.tipo == "entero":   num=izq.valor<=int(der.valor)
                elif izq.tipo=="cadena" and der.tipo == "decimal":  num=izq.valor<=float(der.valor)
                elif izq.tipo=="cadena" and der.tipo == "cadena":   num=izq.valor<=der.valor

            if op == 'mayorigualque':
                if izq.tipo=="entero" and der.tipo == "entero":     num=int(izq.valor)>=int(der.valor)
                elif izq.tipo=="entero" and der.tipo == "decimal":  num=int(izq.valor)>=float(der.valor)
                elif izq.tipo=="decimal" and der.tipo == "entero":  num=float(izq.valor)>=int(der.valor)
                elif izq.tipo=="decimal" and der.tipo == "decimal": num=float(izq.valor)>=float(der.valor)
                elif izq.tipo=="cadena" and der.tipo == "entero":   num=izq.valor>=int(der.valor)
                elif izq.tipo=="cadena" and der.tipo == "decimal":  num=izq.valor>=float(der.valor)
                elif izq.tipo=="cadena" and der.tipo == "cadena":   num=izq.valor>=der.valor
                    
                
            if num == True: num=1
            else:           num=0
            result=Simbolo('nada','bool',str(num),'var','0','1')        
        else:
            self.error+="Error en operacion aritemetica\n"
        return result
    def operaciones_aritmeticas(self,izq,der,op):
        result=None
        try:
            if op == 'suma':
                if izq.tipo=="entero" and der.tipo == "entero": 
                    num=int(izq.valor)+int(der.valor)
                    result=Simbolo('nada','entero',str(num),'var','0','1')

                elif izq.tipo=="decimal" and der.tipo == "entero":
                    num=float(izq.valor)+int(der.valor)
                    result=Simbolo('nada','decimal',str(num),'var','0','1')
                
                elif izq.tipo=="entero" and der.tipo == "decimal":
                    num=float(izq.valor)+int(der.valor)
                    result=Simbolo('nada','decimal',str(num),'var','0','1')

                elif izq.tipo=="decimal" and der.tipo == "decimal":
                    num=float(izq.valor)+float(der.valor)
                    result=Simbolo('nada','decimal',str(num),'var','0','1')

                elif izq.tipo=="cadena" and der.tipo == "cadena":
                    num= izq.valor + der.valor
                    result=Simbolo('nada','cadena',str(num),'var','0','1')

            elif op == 'resta':   
                if izq.tipo=="entero" and der.tipo == "entero": 
                    num=int(izq.valor)-int(der.valor)
                    result=Simbolo('nada','entero',str(num),'var','0','1')

                elif izq.tipo=="decimal" and der.tipo == "entero":
                    num=float(izq.valor)-int(der.valor)
                    result=Simbolo('nada','decimal',str(num),'var','0','1')

                elif izq.tipo=="entero" and der.tipo == "decimal":
                    num=int(izq.valor)-float(der.valor)
                    result=Simbolo('nada','decimal',str(num),'var','0','1') 

                elif izq.tipo=="decimal" and der.tipo == "decimal":
                    num=float(izq.valor)-float(der.valor)
                    result=Simbolo('nada','decimal',str(num),'var','0','1')

            elif op == 'multi':   
                if izq.tipo=="entero" and der.tipo == "entero": 
                    num=int(izq.valor)*int(der.valor)
                    result=Simbolo('nada','entero',str(num),'var','0','1')

                elif izq.tipo=="decimal" and der.tipo == "entero":
                    num=float(izq.valor)*int(der.valor)
                    result=Simbolo('nada','decimal',str(num),'var','0','1')

                elif izq.tipo=="entero" and der.tipo == "decimal":
                    num=int(izq.valor)*float(der.valor)
                    result=Simbolo('nada','decimal',str(num),'var','0','1')

                elif izq.tipo=="decimal" and der.tipo == "decimal":
                    num=float(izq.valor)*float(der.valor)
                    result=Simbolo('nada','decimal',str(num),'var','0','1')

            elif op == 'div':   
                try:
                
                    if izq.tipo=="entero" and der.tipo == "entero": 
                        num=int(izq.valor)/int(der.valor)
                        result=Simbolo('nada','entero',str(num),'var','0','1')

                    elif izq.tipo=="decimal" and der.tipo == "entero":
                        num=float(izq.valor)/int(der.valor)
                        result=Simbolo('nada','decimal',str(num),'var','0','1')

                    elif izq.tipo=="entero" and der.tipo == "decimal":
                        num=int(izq.valor)/float(der.valor)
                        result=Simbolo('nada','decimal',str(num),'var','0','1')

                    elif izq.tipo=="decimal" and der.tipo == "decimal":
                        num=float(izq.valor)/float(der.valor)
                        result=Simbolo('nada','decimal',str(num),'var','0','1')
                except ZeroDivisionError:
                    print(' ')# aqui se regresa el error en nodo
            elif op == 'residuo':   
                try:
                
                    if izq.tipo=="entero" and der.tipo == "entero": 
                        num=int(izq.valor)%int(der.valor)
                        result=Simbolo('nada','entero',str(num),'var','0','1')

                    elif izq.tipo=="decimal" and der.tipo == "entero":
                        num=float(izq.valor)%int(der.valor)
                        result=Simbolo('nada','decimal',str(num),'var','0','1')

                    elif izq.tipo=="entero" and der.tipo == "decimal":
                        num=int(izq.valor)%float(der.valor)
                        result=Simbolo('nada','decimal',str(num),'var','0','1')

                    elif izq.tipo=="decimal" and der.tipo == "decimal":
                        num=float(izq.valor)%float(der.valor)
                        result=Simbolo('nada','decimal',str(num),'var','0','1')
                except ZeroDivisionError:
                    print(' ')# aqui se regresa el error en nodo  
        except AttributeError:
            print('error')
       
        return result
 def accion_exit(self,Raiz):
     simbolo_exit=Simbolo('exit','exit','exit','exit','0','0')
     return simbolo_exit
    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
 def acciones_label(self,Raiz):
     result =None
     nuevo_simbolo=Simbolo(Raiz.valor,'label',self.posLabel,'label','0','0')
     result=nuevo_simbolo
     return result