Exemplo n.º 1
0
def parse_recursive(include_path):
    """recursively parse a header file, including all the includes inside it.
    :param include_path: stdio.h
    :return a set contains all defines,structs,functions
    """
    logger.info('parsing: '+include_path)
    typedefs = set()
    defines = set()
    functions = set()
    to_parse_set = set()
    to_parse_set.add(include_path)
    parsed_set = set()
    while to_parse_set:
        include_path = to_parse_set.pop()
        parsed_set.add(include_path)
        full_path = include_path_to_full_path(include_path)
        if not full_path:
            logger.warning('this header does not exists: '+include_path)
            continue
        xml = srcmlutil.get_xml_from_file(full_path)
        doc = parseString(xml)
        for typedef_node in doc.getElementsByTagName('typedef'):
            name_node = domutil.get_first_child_by_tagname(typedef_node, 'name')
            name = domutil.get_text_content(name_node)
            if name and not name.startswith('_'):
                typedefs.add(name)
        for struct_node in doc.getElementsByTagName('struct'):
            name_node = domutil.get_first_child_by_tagname(struct_node, 'name')
            name = domutil.get_text_content(name_node)
            if name and not name.startswith('_'):
                typedefs.add(name)
        for define_node in doc.getElementsByTagName('cpp:define'):
            name_node = domutil.get_first_child_by_tagnames(define_node, 'cpp:macro', 'name')
            name = domutil.get_text_content(name_node)
            if name and not name.startswith('_'):
                defines.add(name)
        for function_node in doc.getElementsByTagName('function_decl'):
            name_node = domutil.get_first_child_by_tagname(function_node, 'name')
            name = domutil.get_text_content(name_node)
            if name and not name.startswith('_'):
                functions.add(name)
        for include_node in doc.getElementsByTagName('cpp:include'):
            name_node = domutil.get_first_child_by_tagname(include_node, 'cpp:file')
            name = domutil.get_text_content(name_node)
            name = name[1:-1] # remove "<>"
            if name not in parsed_set | to_parse_set:
                to_parse_set.add(name)
    return typedefs | defines | functions
Exemplo n.º 2
0
def parse_expr(node):
    """Parse a <expr>
    :retrn a set of variable names used.
    :bug it=(item*)ptr; the type cast will be recognized as name
    :bug there may be <expr> inside <expr>
    """
    assert(domutil.is_element(node) and node.tagName == 'expr')
    name_nodes = domutil.get_children_by_tagname(node, 'name')
    names = set()
    for name_node in name_nodes:
        name = domutil.get_text_content(name_node)
        # TODO move array related code into util
        names.add(simplify_variable_name(name))
    # for a->b
    double_name_node = domutil.get_first_child_by_tagnames(node, 'name', 'name')
    if double_name_node:
        name = domutil.get_text_content(double_name_node)
        names.add(simplify_variable_name(name))
    return names