Esempio n. 1
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
Esempio n. 2
0
    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