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?
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.
}