Package pygccxml :: Package parser :: Module scanner

Source Code for Module pygccxml.parser.scanner

  1  # Copyright 2004-2008 Roman Yakovenko.
 
  2  # Distributed under the Boost Software License, Version 1.0. (See
 
  3  # accompanying file LICENSE_1_0.txt or copy at
 
  4  # http://www.boost.org/LICENSE_1_0.txt)
 
  5  
 
  6  import os 
  7  import types 
  8  import pprint 
  9  import xml.sax 
 10  import warnings 
 11  import xml.sax.handler 
 12  from pygccxml.declarations import * 
 13  from pygccxml import utils 
 14  
 
 15  ##convention
 
 16  #XML_NN - XML Node Name
 
 17  #XML_AN - XML Attribute Name
 
 18  #also those constants are sorted for easy searching.
 
 19  XML_AN_ABSTRACT = "abstract" 
 20  XML_AN_ACCESS = "access" 
 21  XML_AN_ALIGN = "align" 
 22  XML_AN_ARTIFICIAL = "artificial" 
 23  XML_AN_ATTRIBUTES = "attributes" 
 24  XML_AN_BASE_TYPE = "basetype" 
 25  XML_AN_BASES = "bases" 
 26  XML_AN_BITS = "bits" 
 27  XML_AN_CONST = "const" 
 28  XML_AN_CONTEXT = "context" 
 29  XML_AN_CVS_REVISION = "cvs_revision" 
 30  XML_AN_DEFAULT = "default" 
 31  XML_AN_DEMANGLED = "demangled" 
 32  XML_AN_EXTERN = "extern" 
 33  XML_AN_FILE = "file" 
 34  XML_AN_ID = "id" 
 35  XML_AN_INCOMPLETE = "incomplete" 
 36  XML_AN_INIT = "init" 
 37  XML_AN_LINE = "line" 
 38  XML_AN_MANGLED = "mangled" 
 39  XML_AN_MAX = "max" 
 40  XML_AN_MEMBERS = "members" 
 41  XML_AN_MUTABLE = "mutable" 
 42  XML_AN_NAME = "name" 
 43  XML_AN_OFFSET = "offset" 
 44  XML_AN_PURE_VIRTUAL = "pure_virtual" 
 45  XML_AN_RESTRICT = "restrict" 
 46  XML_AN_RETURNS = "returns" 
 47  XML_AN_SIZE = "size" 
 48  XML_AN_STATIC = "static" 
 49  XML_AN_THROW = "throw" 
 50  XML_AN_TYPE = "type" 
 51  XML_AN_VIRTUAL = "virtual" 
 52  XML_AN_VOLATILE = "volatile" 
 53  XML_NN_ARGUMENT = "Argument" 
 54  XML_NN_ARRAY_TYPE = "ArrayType" 
 55  XML_NN_CASTING_OPERATOR = "Converter" 
 56  XML_NN_CLASS = "Class" 
 57  XML_NN_CONSTRUCTOR = "Constructor" 
 58  XML_NN_CV_QUALIFIED_TYPE = "CvQualifiedType" 
 59  XML_NN_DESTRUCTOR = "Destructor" 
 60  XML_NN_ELLIPSIS = "Ellipsis" 
 61  XML_NN_ENUMERATION = "Enumeration" 
 62  XML_NN_ENUMERATION_VALUE = "EnumValue" 
 63  XML_NN_FIELD = "Field" 
 64  XML_NN_FILE = "File" 
 65  XML_NN_FUNCTION = "Function" 
 66  XML_NN_FUNCTION_TYPE = "FunctionType" 
 67  XML_NN_FUNDAMENTAL_TYPE = "FundamentalType" 
 68  XML_NN_FREE_OPERATOR = "OperatorFunction" 
 69  XML_NN_GCC_XML = "GCC_XML" 
 70  XML_NN_MEMBER_OPERATOR = "OperatorMethod" 
 71  XML_NN_METHOD = "Method" 
 72  XML_NN_METHOD_TYPE = "MethodType" 
 73  XML_NN_NAMESPACE = "Namespace" 
 74  XML_NN_OFFSET_TYPE = "OffsetType" 
 75  XML_NN_POINTER_TYPE = "PointerType" 
 76  XML_NN_REFERENCE_TYPE = "ReferenceType" 
 77  XML_NN_ROOT = "GCC_XML" 
 78  XML_NN_STRUCT = "Struct" 
 79  XML_NN_TYPEDEF = "Typedef" 
 80  XML_NN_UNION = "Union" 
 81  XML_NN_VARIABLE = "Variable" 
 82  
 
83 -class scanner_t( xml.sax.handler.ContentHandler ):
84 - def __init__(self, gccxml_file, decl_factory, *args ):
85 xml.sax.handler.ContentHandler.__init__(self, *args ) 86 self.logger = utils.loggers.gccxml 87 self.gccxml_file = gccxml_file 88 #defining parsing tables 89 self.__readers = { 90 XML_NN_FILE : self.__read_file 91 , XML_NN_NAMESPACE : self.__read_namespace 92 , XML_NN_ENUMERATION : self.__read_enumeration 93 , XML_NN_ENUMERATION_VALUE : self.__read_enumeration_value 94 , XML_NN_ARRAY_TYPE : self.__read_array_type 95 , XML_NN_CV_QUALIFIED_TYPE : self.__read_cv_qualified_type 96 , XML_NN_POINTER_TYPE : self.__read_pointer_type 97 , XML_NN_REFERENCE_TYPE : self.__read_reference_type 98 , XML_NN_FUNDAMENTAL_TYPE : self.__read_fundamental_type 99 , XML_NN_ARGUMENT : self.__read_argument 100 , XML_NN_FUNCTION_TYPE : self.__read_function_type 101 , XML_NN_METHOD_TYPE : self.__read_method_type 102 , XML_NN_OFFSET_TYPE : self.__read_offset_type 103 , XML_NN_TYPEDEF : self.__read_typedef 104 , XML_NN_VARIABLE : self.__read_variable 105 , XML_NN_CLASS : self.__read_class 106 , XML_NN_STRUCT : self.__read_struct 107 , XML_NN_UNION : self.__read_union 108 , XML_NN_FIELD : self.__read_field 109 , XML_NN_CASTING_OPERATOR : self.__read_casting_operator 110 , XML_NN_CONSTRUCTOR : self.__read_constructor 111 , XML_NN_DESTRUCTOR : self.__read_destructor 112 , XML_NN_FUNCTION : self.__read_function 113 , XML_NN_FREE_OPERATOR : self.__read_free_operator 114 , XML_NN_MEMBER_OPERATOR : self.__read_member_operator 115 , XML_NN_METHOD : self.__read_method 116 , XML_NN_GCC_XML : self.__read_version 117 , XML_NN_ELLIPSIS : self.__read_ellipsis 118 } 119 self.deep_declarations = [ 120 XML_NN_CASTING_OPERATOR 121 , XML_NN_CONSTRUCTOR 122 , XML_NN_DESTRUCTOR 123 , XML_NN_ENUMERATION 124 , XML_NN_FILE 125 , XML_NN_FUNCTION 126 , XML_NN_FREE_OPERATOR 127 , XML_NN_MEMBER_OPERATOR 128 , XML_NN_METHOD 129 , XML_NN_FUNCTION_TYPE 130 , XML_NN_METHOD_TYPE 131 ] 132 133 assert isinstance( decl_factory, decl_factory_t ) 134 self.__decl_factory = decl_factory 135 136 #mapping from id -> decl 137 self.__declarations = {} 138 #list of all read declarations 139 self.__calldefs = [] 140 #list of enums I need later 141 self.__enums = [] 142 #mapping from id -> type 143 self.__types = {} 144 #mapping from id -> file 145 self.__files = {} 146 #mapping between decl id -> access 147 self.__access = {} 148 #current object under construction 149 self.__inst = None 150 #mapping from id to members 151 self.__members = {} 152 153 self.__compiler = None
154
155 - def read( self ):
156 xml.sax.parse( self.gccxml_file, self )
157
158 - def endDocument( self ):
159 #updating membership 160 members_mapping = {} 161 for gccxml_id, members in self.__members.iteritems(): 162 <