【问题标题】:Edit C function declaration with pycparser使用 pycparser 编辑 C 函数声明
【发布时间】:2020-04-23 14:14:19
【问题描述】:

我需要编写一个 Python 程序来解析 C 源代码文件并在每个函数声明的末尾添加一个隐藏参数。

更准确地说,我需要更改如下内容:

void f(int a, int b, int c) { ... }

变成这样:

void f(int a, int b, int c, int hiddenArg) { ... }

显然,我还需要编辑从其他函数对该函数的所有调用。

我需要使用pycparser 来执行此操作,但是一旦我阅读了 AST,我就无法找出编辑 AST 的正确方法。有没有我想念的正确方法(或任何方法)?

【问题讨论】:

  • "each" 函数声明?这不会破坏很多需要特定类型签名的函数,例如main
  • @JosephSible-ReinstateMonica 我只想对 OpenCL 内核文件 (*.cl) 中的辅助函数执行此操作。什么都不会破坏,在我的情况下,这是由于其他原因而得到保证的。
  • 不清楚,只是声明而不是实现或调用应该更新?
  • @Ôrel 正如我所指出的,我最终需要更改呼叫,但这不是目前的主要问题。我只需要知道是否有适当的方法来编辑pycparser 构造的 AST 节点。
  • 如果你总是使用相同的额外参数,也许你可以覆盖visit_FuncCall

标签: c pycparser


【解决方案1】:

作为修改 AST 的示例,这里将函数声明更改为具有新参数:

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])

这会改变所有函数。显然,您可以在访问者中添加一个条件来仅更改您感兴趣的某些功能。

您可以使用visit_FuncCall 以类似的方式修改对此函数的调用。

【讨论】:

    猜你喜欢
    • 2023-03-20
    • 2016-11-06
    • 1970-01-01
    • 2015-11-22
    • 1970-01-01
    • 1970-01-01
    • 2020-06-06
    • 1970-01-01
    相关资源
    最近更新 更多