from copy import deepcopy 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[(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.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.get_size() if(size str: print("变量类型") for item in self.variable_type_list: print(f"\t{item.attr}") print("变量别名") for item in self.variable_type_alias: print(f"\t{item.attr.attr} eq {item.alias}") print("变量栈") for item in self.stack: print(f"\t{item.attr.attr} {item.name}={item.value()}") return "" if __name__ == "__main__": f=file() f.add_enum_type("enum1",[("ENUM0",0),("ENUM1",1)]) f.add_struct_type(4,"struct1",[(f.get_variable_type(['int']),'a')]) f.add_type_alias(['unsigned','char'],'uint8_t') f.add_variable(['unsigned','char'],'char_a',120) f.add_variable(['uint8_t'],'char_b',100) print(f)