diff options
author | Eli Bendersky <eliben@gmail.com> | 2020-04-15 20:19:29 -0700 |
---|---|---|
committer | Eli Bendersky <eliben@gmail.com> | 2020-04-15 20:19:29 -0700 |
commit | 61eac63fda12f9ba4504def70d0d76cd3ac1bbff (patch) | |
tree | 5191570eba1e68e826148578573f541e63bbe0e6 /examples | |
parent | ac2fef55f1c4f46c5c79dc49cf32bed7fea4f18f (diff) | |
download | pycparser-61eac63fda12f9ba4504def70d0d76cd3ac1bbff.tar.gz |
Add example of modifying an AST and printing out modified code
Diffstat (limited to 'examples')
-rw-r--r-- | examples/func_defs_add_param.py | 58 |
1 files changed, 58 insertions, 0 deletions
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)) |