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

时间:2012-06-07 17:27:20

标签: python abstract-syntax-tree pycparser

我正在尝试修改/重构输入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'

知道我要离开的地方吗?

由于

1 个答案:

答案 0 :(得分:1)

我找到了三个你传递名单的地方,你应该传递无。

## 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,但是这个改变为我修复了你的追溯。