1

Cファイルを解析するためにpycparserを使用しています。Cファイルの各関数定義の開始と終了を取得したい。しかし、実際に得られるのは関数定義の始まりだけです。

memmgr_init at examples/c_files/memmgr.c:46
get_mem_from_pool at examples/c_files/memmgr.c:55

次のようなものを取得したい:

memmgr_init at examples/c_files/memmgr.c: start :46 end : 52

class FuncDefVisitor(c_ast.NodeVisitor):

def visit_FuncDef(self, node):
print('%s at %s' % (node.decl.name, node.decl.coord))
4

2 に答える 2

1

解析中に関数の終了位置を記録しないため、pycparser でこれを行うことはできません。

AST から関数本体を再生成できます。

from pycparser import c_parser, c_ast, parse_file, c_generator

class FuncDefVisitor(c_ast.NodeVisitor):
def __init__(self, bodies):
    self.bodies = bodies
    self.generator = c_generator.CGenerator()
def visit_FuncDef(self, node):
    self.bodies.append(self.generator.visit(node))

def show_func_defs(filename):
    ast = parse_file(filename, use_cpp=True,
                 cpp_args=r'-Iutils/fake_libc_include')
    bodies = []
    v = FuncDefVisitor(bodies)
    v.visit(ast)
    for body in bodies:
        print(body)

ただし、これは元の形式とはわずかに異なる形式になっている可能性があるため、関数の最後が最初から何行後にあるかを計算するために使用することはできません。

于 2016-03-21T07:45:19.257 に答える