From 61eac63fda12f9ba4504def70d0d76cd3ac1bbff Mon Sep 17 00:00:00 2001 From: Eli Bendersky Date: Wed, 15 Apr 2020 20:19:29 -0700 Subject: Add example of modifying an AST and printing out modified code --- examples/func_defs_add_param.py | 58 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 examples/func_defs_add_param.py (limited to 'examples') diff --git a/examples/func_defs_add_param.py b/examples/func_defs_add_param.py new file mode 100644 index 0000000..433f12d --- /dev/null +++ b/examples/func_defs_add_param.py @@ -0,0 +1,58 @@ +#----------------------------------------------------------------- +# pycparser: func_defs_add_param.py +# +# Example of rewriting AST nodes to add parameters to function +# definitions. Adds an "int _hidden" to every function. +# +# Eli Bendersky [https://eli.thegreenplace.net/] +# License: BSD +#----------------------------------------------------------------- +from __future__ import print_function +import sys + +from pycparser import c_parser, c_ast, c_generator + +text = r""" +void foo(int a, int b) { +} + +void bar() { +} +""" + + +class ParamAdder(c_ast.NodeVisitor): + def visit_FuncDecl(self, node): + ty = c_ast.TypeDecl(declname='_hidden', + quals=[], + type=c_ast.IdentifierType(['int'])) + newdecl = c_ast.Decl( + name='_hidden', + quals=[], + storage=[], + funcspec=[], + type=ty, + init=None, + bitsize=None, + coord=node.coord) + if node.args: + node.args.params.append(newdecl) + else: + node.args = c_ast.ParamList(params=[newdecl]) + + +if __name__ == '__main__': + parser = c_parser.CParser() + ast = parser.parse(text) + print("AST before change:") + ast.show(offset=2) + + v = ParamAdder() + v.visit(ast) + + print("\nAST after change:") + ast.show(offset=2) + + print("\nCode after change:") + generator = c_generator.CGenerator() + print(generator.visit(ast)) -- cgit v1.2.1