from copy import deepcopy from cpu import cpu from io import StringIO as string class variable_type(object): def __init__(self,attr:list[str],size:int,limit:tuple[int,int]=None): # 对于函数 attr就是返回值类型 attr中包含 '()' 则表示函数 self.attr=attr self.size=size self.pack=4 # 默认4字节对齐 self.member:list[tuple[variable_type,str]]=[] if not (limit is None): self.min=limit[0] self.max=limit[1] if(self.min>self.max): raise Exception(f"{self.attr} 最小值大于最大值 {limit}") self.enum_types={} # 对于函数 member就是形式参数 def add_member(self,member,name:str): if(isinstance(member,(variable_type))): self.member.append((member,name)) else: raise Exception(f"参数类型不对 {type(member)}") def add_enum_item(self,key:str,index:int): if (not key in self.enum_types.keys()) and (not index in self.enum_types.values()): self.enum_types[key]=index return print(self.enum_types.keys(),self.enum_types.values()) raise Exception(f"枚举类型键或值已存在 {key} {index}") def get_enum_value(self,key:str): return self.enum_types.get(key,None) def eq(self,attr:list[str]): attr.sort() self.attr.sort() if(len(self.attr) != len(attr)): return False for item1,item2 in zip(self.attr,attr): if(item1 != item2): return False return True def get_size(self): if("struct" in self.attr): size=0 for item in self.member: item_size=((item[0].get_size()+(self.pack-1))//self.pack)*self.pack size+=item_size return size elif("union" in self.attr): size=0 for item in self.member: item_size=item[0].get_size() if(size str: ret=string() ret.write("变量类型\n") for item in self.variable_type_list: ret.write(f"\t{item.attr}\n") ret.write("变量别名\n") for item in self.variable_type_alias: ret.write(f"\t{item.attr.attr} eq {item.alias}\n") ret.write("变量栈\n") for item in self.stack: addr,size=item.value() ret.write(f"\t{item.attr.attr} {item.name}={hex(addr)},{size}\n") ret_str=ret.getvalue() ret.close() return ret_str if __name__ == "__main__": f=run() f.add_enum_type("enum1",[("ENUM0",0),("ENUM1",1)]) f.add_struct_type(4,"struct1",[ (f.get_variable_type(['int']),'a'), (f.get_variable_type(['int']),'b'), ]) f.add_type_alias(['unsigned','char'],'uint8_t') f.add_type_alias(['struct','struct1'],'struct1_def') f.add_type_alias(['struct1_def'],'struct1_def_def') f.add_variable(['unsigned','char'],'char_a',120) f.add_variable(['uint8_t'],'char_b',100) f.add_variable(['struct',"struct1"],'struct_a') f.get_variable("struct_a") f.get_variable("struct_a",['a']) f.get_variable("struct_a",['b']) print(f)