2012-06-07 42 views
3

我想修改/重构输入C源代码。 我正在尝试在每行输入代码后添加一条printf语句。无法修改pycparser AST |转换AST到C代码

例如,如果我输入的是 -

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。 下面是我介入了与Python代码,已经提取AST对象ast后 -

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' 

任何想法,我要走的轨道?

感谢

+0

是否有一个原因,lst2和lst3初始化为[],然后分配别的东西?你不会那样做到lst1。 –

+0

@IraBaxter我也初始化_lst1_到_ [] _。并没有真正的理由。只是表明这些变量的类型是_list_。 – Shash

+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,但是这种改变可以修复你对我的追踪。

+0

谢谢!这就是诀窍。 你又怎么弄出来的呢?我真的无法从可用的文档中解决这个问题。 – Shash

+1

我深入pycparser代码中的类声明以了解它的期望。我追求的最大线索是错误信息,这是因为当你做一个show()时,它会调用每个孩子做一个show()。所以错误表明你提供了一个列表,当期望的是一个支持show()调用的对象。花了一段时间才搞清楚什么时候参数不正确,因为除了模块本身包含的例子之外,这个代码似乎真的没有例子。 – ChipJust

+0

Fair'nuf。 再次感谢! – Shash