pycparser 嵌套节点访问者
pycparser nested node visitor
我正在尝试使用带有访问者的 pycparser 为每个 IF 语句解析 C 代码。根据我的观察,它只访问没有嵌套 IF 的顶级节点。是故意的,还是我的代码有问题?
查看 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)
我试过了,它对我有用:
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.
}
generic_visit() 就可以了。或者,只是 re-visit 个子节点。
https://github.com/eliben/pycparser/blob/master/examples/func_calls.py#L29
# A visitor with some state information (the funcname it's looking for)
class FuncCallVisitor(c_ast.NodeVisitor):
def __init__(self, funcname):
self.funcname = funcname
def visit_FuncCall(self, node):
if node.name.name == self.funcname:
print('%s called at %s' % (self.funcname, node.name.coord))
# Visit args in case they contain more func calls.
if node.args:
self.visit(node.args)
在这种情况下(IF 语句),
if node.iftrue:
self.visit(node.iftrue)
if node.iffalse:
self.visit(node.iffalse)
我正在尝试使用带有访问者的 pycparser 为每个 IF 语句解析 C 代码。根据我的观察,它只访问没有嵌套 IF 的顶级节点。是故意的,还是我的代码有问题?
查看 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)
我试过了,它对我有用:
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.
}
generic_visit() 就可以了。或者,只是 re-visit 个子节点。
https://github.com/eliben/pycparser/blob/master/examples/func_calls.py#L29
# A visitor with some state information (the funcname it's looking for)
class FuncCallVisitor(c_ast.NodeVisitor):
def __init__(self, funcname):
self.funcname = funcname
def visit_FuncCall(self, node):
if node.name.name == self.funcname:
print('%s called at %s' % (self.funcname, node.name.coord))
# Visit args in case they contain more func calls.
if node.args:
self.visit(node.args)
在这种情况下(IF 语句),
if node.iftrue:
self.visit(node.iftrue)
if node.iffalse:
self.visit(node.iffalse)