gccxmlparser.py

来自「Boost provides free peer-reviewed portab」· Python 代码 · 共 475 行 · 第 1/2 页

PY
475
字号
        instances. The first tuple is the most direct inheritance, and then it        goes up in the hierarchy.         '''        if bases is None:            return []        base_names = bases.split()        this_level = []              next_levels = []        for base in base_names:            # get the visibility            split = base.split(':')            if len(split) == 2:                visib = split[0]                base = split[1]            else:                visib = Scope.public                                        decl = self.GetDecl(base)             if not isinstance(decl, Class):                # on windows, there are some classes which "bases" points to an                # "Unimplemented" tag, but we are not interested in this classes                # anyway                continue            base = Base(decl.FullName(), visib)            this_level.append(base)            # normalize with the other levels            for index, level in enumerate(decl.hierarchy):                if index < len(next_levels):                    next_levels[index] = next_levels[index] + level                else:                    next_levels.append(level)        hierarchy = []        if this_level:            hierarchy.append(tuple(this_level))        if next_levels:            hierarchy.extend(next_levels)        return hierarchy            def GetMembers(self, member_list):        # members must be a string with the ids of the members        if member_list is None:            return []        members = []        for member in member_list.split():            decl = self.GetDecl(member)            if type(decl) in Class.ValidMemberTypes():                members.append(decl)         return members    def ParseClass(self, id, element):        name = element.get('name')        abstract = bool(int(element.get('abstract', '0')))        location = self.GetLocation(element.get('location'))        context = self.GetDecl(element.get('context'))        incomplete = bool(int(element.get('incomplete', 0)))        if isinstance(context, str):             class_ = Class(name, context, [], abstract)        else:            # a nested class            visib = element.get('access', Scope.public)            class_ = NestedClass(                name, context.FullName(), visib, [], abstract)        class_.incomplete = incomplete        # we have to add the declaration of the class before trying                # to parse its members and bases, to avoid recursion.        self.AddDecl(class_)        class_.location = location        self.Update(id, class_)               # now we can get the members and the bases        class_.hierarchy = self.GetHierarchy(element.get('bases'))                if class_.hierarchy:            class_.bases = class_.hierarchy[0]        members = self.GetMembers(element.get('members'))        for member in members:            class_.AddMember(member)    def ParseStruct(self, id, element):        self.ParseClass(id, element)    FUNDAMENTAL_RENAME = {        'long long int' : 'boost::int64_t',        'long long unsigned int' : 'boost::uint64_t',    }    def ParseFundamentalType(self, id, element):        name = element.get('name')        name = self.FUNDAMENTAL_RENAME.get(name, name)        type_ = FundamentalType(name)        self.Update(id, type_)    def ParseArrayType(self, id, element):        type = self.GetType(element.get('type'))        min = element.get('min')        max = element.get('max')        array = ArrayType(type.name, type.const, min, max)        self.Update(id, array)            def ParseReferenceType(self, id, element):        type = self.GetType(element.get('type'))        expand = not isinstance(type, FunctionType)        ref = ReferenceType(type.name, type.const, None, expand, type.suffix)        self.Update(id, ref)                    def ParsePointerType(self, id, element):        type = self.GetType(element.get('type'))        expand = not isinstance(type, FunctionType)        ref = PointerType(type.name, type.const, None, expand, type.suffix)        self.Update(id, ref)                    def ParseFunctionType(self, id, element):        result = self.GetType(element.get('returns'))        args = self.GetArguments(element)        func = FunctionType(result, args)        self.Update(id, func)    def ParseMethodType(self, id, element):        class_ = self.GetDecl(element.get('basetype')).FullName()        result = self.GetType(element.get('returns'))        args = self.GetArguments(element)        method = MethodType(result, args, class_)        self.Update(id, method)            def ParseField(self, id, element):        name = element.get('name')        visib = element.get('access', Scope.public)        classname = self.GetDecl(element.get('context')).FullName()        type_ = self.GetType(element.get('type'))        static = bool(int(element.get('extern', '0')))        location = self.GetLocation(element.get('location'))        var = ClassVariable(type_, name, classname, visib, static)        var.location = location        self.Update(id, var)    def ParseMethod(self, id, element, methodType=Method):        name = element.get('name')        result = self.GetType(element.get('returns'))        classname = self.GetDecl(element.get('context')).FullName()        visib = element.get('access', Scope.public)        static = bool(int(element.get('static', '0')))        virtual = bool(int(element.get('virtual', '0')))        abstract = bool(int(element.get('pure_virtual', '0')))        const = bool(int(element.get('const', '0')))        location = self.GetLocation(element.get('location'))        throws = self.GetExceptions(element.get('throw', None))         params = self.GetArguments(element)        method = methodType(            name, classname, result, params, visib, virtual, abstract, static, const, throws)        method.location = location        self.Update(id, method)    def ParseOperatorMethod(self, id, element):        self.ParseMethod(id, element, ClassOperator)            def ParseConstructor(self, id, element):        name = element.get('name')        visib = element.get('access', Scope.public)        classname = self.GetDecl(element.get('context')).FullName()        location = self.GetLocation(element.get('location'))        params = self.GetArguments(element)        artificial = element.get('artificial', False)                ctor = Constructor(name, classname, params, visib)        ctor.location = location        self.Update(id, ctor)    def ParseDestructor(self, id, element):        name = element.get('name')        visib = element.get('access', Scope.public)        classname = self.GetDecl(element.get('context')).FullName()        virtual = bool(int(element.get('virtual', '0')))        location = self.GetLocation(element.get('location'))        des = Destructor(name, classname, visib, virtual)        des.location = location        self.Update(id, des)    def ParseConverter(self, id, element):        self.ParseMethod(id, element, ConverterOperator)    def ParseTypedef(self, id, element):        name = element.get('name')        type = self.GetType(element.get('type'))                context = self.GetDecl(element.get('context'))        if isinstance(context, Class):            context = context.FullName()        typedef = Typedef(type, name, context)        self.Update(id, typedef)        self.AddDecl(typedef)    def ParseEnumeration(self, id, element):        name = element.get('name')        location = self.GetLocation(element.get('location'))        context = self.GetDecl(element.get('context'))        incomplete = bool(int(element.get('incomplete', 0)))         if isinstance(context, str):            enum = Enumeration(name, context)        else:            visib = element.get('access', Scope.public)            enum = ClassEnumeration(name, context.FullName(), visib)        self.AddDecl(enum)        enum.location = location        for child in element:            if child.tag == 'EnumValue':                name = child.get('name')                value = int(child.get('init'))                enum.values[name] = value        enum.incomplete = incomplete        self.Update(id, enum)def ParseDeclarations(filename):    'Returns a list of the top declarations found in the gcc_xml file.'            parser = GCCXMLParser()     parser.Parse(filename)    return parser.Declarations()if __name__ == '__main__':    ParseDeclarations(r'D:\Programming\Libraries\boost-cvs\boost\libs\python\pyste\example\test.xml')

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?