Esempio n. 1
0
 def __init__(self,name,index=0):
     self.bloques = Bloques()
     self.errors_s = {}
     self.errors = {}
     self.warnings = {}
     self.dir_init = ""
     self.pc = []
     self.obj_code=[]
     self.symbols = []
     self.num_bloque =[]
     self.name = name
     self.step2 = Step2()
     self.inicial = "0H"
     self.code = []
     self.index= index
     self.file_name = name
Esempio n. 2
0
class NodoS:
    
    def __init__(self,name,index=0):
        self.bloques = Bloques()
        self.errors_s = {}
        self.errors = {}
        self.warnings = {}
        self.dir_init = ""
        self.pc = []
        self.obj_code=[]
        self.symbols = []
        self.num_bloque =[]
        self.name = name
        self.step2 = Step2()
        self.inicial = "0H"
        self.code = []
        self.index= index
        self.file_name = name

    ## imprime la tabla de simbolos en un archivo 
    # @param fo archivo donde se agregara la tabla de simbolos
    def print_symbols(self,fo):
        fo.write("Tabla de Simbolos \n\n")
        d = Displacement()
        tam = 12
        string = d.get_tex_space("NOMBRE",tam)
        string += d.get_tex_space("DIR/VAL",tam)
        string += d.get_tex_space("TIPO",tam)
        string += d.get_tex_space("BLOQUE",tam)
        string += d.get_tex_space("EXTERNO",tam)+"\n"
        for s in self.symbols:
            string += d.get_tex_space(s.get_name(),tam)
            string += d.get_tex_space(str(s.get_dir_val()),tam)
            string += d.get_tex_space(s.get_sym_type(),tam)
            string += d.get_tex_space(s.num_bloque,tam)
            string += d.get_tex_space(str(s.is_externo()),tam)+"\n"
        fo.write(string+"\n\n")
    

    ## imprime la tabla de bloques en un archivo 
    # @param fo archivo donde se agregara la tabla de bloques  
    def print_bloques(self,fo):
        fo.write("Tabla de Bloques \n\n")
        d = Displacement()
        tam = 18
        string = d.get_tex_space("DIR_CARGA",tam)
        string += d.get_tex_space("NOMBRE",tam)
        string += d.get_tex_space("NUM_BLOQUE",tam)
        string += d.get_tex_space("TAMAÑO",tam)+"\n"
        for b in self.bloques.bloques:
            string += d.get_tex_space(b.load_dir,tam)
            string += d.get_tex_space(b.name,tam)
            string += d.get_tex_space(b.num,tam)
            string += d.get_tex_space(b.length,tam)+"\n"            
        fo.write(string+"\n\n")
    
    ## crea el archivo intermedio de este segmento 
    # @param extension extension del archivo intermedio que se generara 
    def archivo_intermedio(self,extension):
        fo = File()
        name_file = "./salidas/"+self.file_name+".t"+extension
        print name_file
        fo1 = open(name_file,"w")
        fo.create_file(self.file_name,"t"+extension)
        self.delete_spaces()
        self.print_intr_code(fo)
        self.print_intr_code(fo1)
        self.print_symbols(fo)
        self.print_symbols(fo1)
        self.print_bloques(fo)
        self.print_bloques(fo1)
        fo.close()
        fo1.close()
    
    ## crea el archivo objeto de este segmento 
    # @param extension extension del archivo objeto que se generara 
    def archivo_objeto(self,extension):
        fo = File()
        fo.create_file(self.file_name,"o"+extension)
        name_file = "./salidas/"+self.file_name+".o"+extension 
        fo1 = open(name_file,"w")
        self.bloques.gen_table()
        len_program = self.bloques.get_len_program()
        self.step2.directive_start(self.name,len_program,self.pc[0])               
        self.step2.complete_register()
        self.step2.make_register_m(self.obj_code,self.pc,self.num_bloque,self.bloques)
        if not self.index == 0:        
            self.step2.directive_end_segment()
        list_r = self.step2.all_registers()
        for s in list_r:
           fo.write(s+"\n")
           fo1.write(s+"\n")
        fo1.close()
        fo.close()
    
    ## crea la tabla del codigo con los campos de contador de programa
    # de numero de bloque y el codigo objeto
    # @param fo archivo donde se agregara la tabla de codigo
    def print_intr_code(self,fo):
        d = Displacement()
        tam = 18
        string = d.get_tex_space("CP",10)
        string += d.get_tex_space("BLOQUE",10)
        string += d.get_tex_space("CODIGO",45)
        string += d.get_tex_space("C. Objeto",10)+"\n"
        tam = len(self.code)
        it = 0
        while it < tam:
            string += d.get_tex_space(self.pc[it],10)
            string += d.get_tex_space(self.num_bloque[it],10)
            string += d.get_tex_space(self.code[it],45)
            if len(self.obj_code) > it:
                string += d.get_tex_space(self.obj_code[it],10)
            error = self.get_line_error(it)
            string += d.get_tex_space(error,10)+"\n"
            it += 1
        fo.write(string)

    ## elimina los espacion es una lista de codigo   
    def delete_spaces(self):
        it = 0
        while it < len(self.code):
            item = self.code[it]
            if item.strip() == "":
                self.code.remove(item)
            else:
                it += 1
    ## regresa los errores de una linea de codigo
    # @param line linea de codigo la cual se busca si tubo un error
    # @return errores lexicos y sintacticos de la linea de codigo
    def get_line_error(self,line):
        error_s = self.errors_s.get(str(line),"")
        error_p = self.errors.get(str(line),"")
        warning = self.warnings.get(str(line),"")
        if error_s == "":
            error = error_p
        else:
            error = error_s + "\t" + error_p
        return error + "\t"+ warning