このスニペットを検討することから始めましょう。
import sys
from pycparser import c_parser, c_ast, c_generator
text = r"""
void main() {
foo(1,3);
foo1(4);
x = 1;
foo2(4,
10,
3);
foo3(
"xxx"
);
}
"""
class FuncCallVisitor(c_ast.NodeVisitor):
def visit_FuncCall(self, node):
print('%s called at %s' % (node.name.name, node.name.coord))
if node.args:
self.visit(node.args)
class RemoveFuncCalls(c_generator.CGenerator):
def visit_FuncCall(self, n):
# fref = self._parenthesize_unless_simple(n.name)
# return fref + '(' + self.visit(n.args) + ')'
return ""
if __name__ == '__main__':
parser = c_parser.CParser()
ast = parser.parse(text)
v = FuncCallVisitor()
v.visit(ast)
print('-' * 80)
ast.show(showcoord=True)
generator = RemoveFuncCalls()
print('-' * 80)
print(generator.visit(ast))
上記の出力は次のようになります。
void main()
{
;
;
x = 1;
;
;
}
しかし、代わりにこれになりたい:
void main()
{
x = 1;
}
私の質問は、pycparser を使用して AST からノード/サブツリーを削除する正規/慣用的な方法は何ですか?