pythoncpycparser

pycparser nested node visitor


I am tring to parse a C code with pycparser with visitor for every IF statements. From my observation it only visits top nodes without nested IFs. Is it intentional, or something is wrong in my code?


Solution

  • See the comment for the class: https://github.com/eliben/pycparser/blob/master/pycparser/c_ast.py#L107

    The children of nodes for which a visit_XXX was defined will not be visited - if you need this, call generic_visit() on the node.

    You can use:

    NodeVisitor.generic_visit(self, node)

    I tried this and it worked for me:

    if_conditions.py

    from __future__ import print_function
    import sys
    
    # This is not required if you've installed pycparser into
    # your site-packages/ with setup.py
    sys.path.extend(['.', '..'])
    
    from pycparser import c_parser, c_ast, parse_file
    
    class IfVisitor(c_ast.NodeVisitor):
        def __init__(self):
            pass
    
        def visit_If(self, node):
            node.show()
            self.generic_visit(node);
    
    
    
    def start(filename):
        ast = parse_file(filename, use_cpp=True)
        v = IfVisitor()
        v.visit(ast)
    
    
    if __name__ == "__main__":
        if len(sys.argv) > 2:
            filename = sys.argv[1]
        else:
            filename = 'examples/c_files/test.c'
    
        start(filename)
    

    test.c

    main ( int arc, char **argv ) {
    
        int i = 1;
    
        if (i > 1) {
            if (i > 2) {
                printf("Yay!");
            }
        }
    
        // code
        return 0; // Indicates that everything vent well.     
    }