我想修改/重构输入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'
任何想法,我要走的轨道?
感谢
是否有一个原因,lst2和lst3初始化为[],然后分配别的东西?你不会那样做到lst1。 –
@IraBaxter我也初始化_lst1_到_ [] _。并没有真正的理由。只是表明这些变量的类型是_list_。 – Shash
您是否可以为未修改的功能重新生成文本? –