| #----------------------------------------------------------------- |
| # 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 |
| sys.path.extend(['.', '..']) |
| |
| 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=[], |
| align=[], |
| type=c_ast.IdentifierType(['int'])) |
| newdecl = c_ast.Decl( |
| name='_hidden', |
| quals=[], |
| align=[], |
| 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)) |