summaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorEli Bendersky <eliben@gmail.com>2020-04-15 20:19:29 -0700
committerEli Bendersky <eliben@gmail.com>2020-04-15 20:19:29 -0700
commit61eac63fda12f9ba4504def70d0d76cd3ac1bbff (patch)
tree5191570eba1e68e826148578573f541e63bbe0e6 /examples
parentac2fef55f1c4f46c5c79dc49cf32bed7fea4f18f (diff)
downloadpycparser-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.py58
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))