无法修改pycparser AST | 将AST转换为C代码

4

我将尝试修改/重构输入的C源代码。 我将尝试在每行输入代码后添加一个 printf 语句。

例如,如果我的输入是 -

void foo(){
    // Sample input code
    int a = 0, b = 0;
    a++;
    if(a<5)
         b++;
    b--;
}

我希望添加语句printf('Hi');,结果为 -
void foo(){
    int a = 0, b = 0;
    printf('Hi');
    a++;
    printf('Hi');
    if(a<5){
         b++;
         printf('Hi');
    }
    printf('Hi');
    b--;
    printf('Hi');
}

作为第一步,我尝试声明一个变量test并尝试将其插入到随机源代码生成的AST开头。 在提取了AST对象ast后,我参与了以下Python代码-
for i in range(0,len(ast.ext)):
    ## Look for a function named 'foo'
    if(type(ast.ext[i]) == c_ast.FuncDef and ast.ext[i].decl.name == 'foo'):
        ## Store the list of AST node objects in functionBody
        functionBody    = ast.ext[i].body

        ## Create a Decl object for the variable test
        id_obj          = c_ast.ID('test')
        identifier_obj  = c_ast.IdentifierType(['int'])
        typedecl_obj    = c_ast.TypeDecl(id_obj.name,[],identifier_obj)
        decl_obj        = c_ast.Decl(id_obj.name,[],[],[],typedecl_obj,[],[])

        ## Append the object to a list.
        ## Concatenate to a copy of existing list of AST objects     
        lst1 = []
        lst1.append(decl_obj)
        lst2 = []
        lst2 = copy.deepcopy(functionBody.block_items)
        lst3 = []
        lst3 = lst1+lst2

        ## Create a modified AST and print content
        functionBody1 = c_ast.Compound(lst3)
        functionBody1.show()

我发现在最终结构functionBody1中没有变化,并且每当我尝试使用它的show()方法时,会出现以下错误。

'list' object has no attribute 'show'

你有没有想法,我在哪里偏离了轨道?

谢谢


lst2和lst3被初始化为[],然后再赋值是有原因的吗?你没有对lst1这样做。 - Ira Baxter
@IraBaxter 我已经将_lst1_初始化为 _[ ]_。实际上没有什么特别的原因,只是表明这些变量是_list_类型。 - Shash
你能否重新生成未修改的函数的文本? - Ira Baxter
1个回答

2
我发现你在三个地方传递了一个列表,但应该传递None。
## Create a Decl object for the variable test
id_obj          = c_ast.ID('test')
identifier_obj  = c_ast.IdentifierType(['int'])
typedecl_obj    = c_ast.TypeDecl(id_obj.name,None,identifier_obj)
decl_obj        = c_ast.Decl(id_obj.name,[],[],[],typedecl_obj,None,None)

我其实对这个不是很熟悉,因为我也还在学习pycparser,但是这个修改对我来说修复了你的回溯。


谢谢!这就解决了问题。 你是怎么想到的?我在文档中没看出来。 - Shash
1
我深入研究了pycparser代码中的类声明,以了解它的期望。我追踪的一个重要线索是错误消息,这是因为当你调用show()时,它会调用每个子对象的show()方法。所以错误提示表明你提供了一个列表,而期望的是一个支持show()方法调用的对象。由于这段代码似乎缺乏示例,除了模块本身包含的示例之外,找出参数不正确的地方花了一些时间。 - ChipJust
没问题。我很快就会开始发布有关pycparser的问题。也许你能回答我的问题……似乎现在没有多少人在使用这个模块了。 - ChipJust
那是真的。 - Shash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接