Редактировать объявление функции C с помощью pycparser - PullRequest
0 голосов
/ 06 января 2020

Мне нужно написать Python программу, которая анализирует C файлы исходного кода и добавляет скрытый параметр в конце каждого объявления функции.

Точнее, мне нужно изменить что-то вроде этого:

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

примерно так:

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

Очевидно, мне нужно будет также отредактировать все вызовы этой функции из других функций.

Мне нужно сделать это, используя pycparser, но я не могу придумать, как правильно отредактировать AST, как только прочитал. Есть ли правильный способ сделать это, что я пропускаю (или каким-либо другим способом)?

1 Ответ

0 голосов
/ 16 апреля 2020

В качестве примера изменения 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.

...