Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 无法修改pycparser AST |将AST转换为C代码_Python_Abstract Syntax Tree_Pycparser - Fatal编程技术网

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

Python 无法修改pycparser AST |将AST转换为C代码,python,abstract-syntax-tree,pycparser,Python,Abstract Syntax Tree,Pycparser,我正在尝试修改/重构输入C源代码。 我试图在输入代码的每一行之后添加一个printf语句 例如,如果我的输入是- void foo(){ // Sample input code int a = 0, b = 0; a++; if(a<5) b++; b--; } 作为初始步骤,我只是尝试声明一个变量test,并尝试将其插入由随机源代码生成的AST的开头。 下面是我在将AST提取到对象AST- for i in range(0,l

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

例如,如果我的输入是-

void foo(){
    // Sample input code
    int a = 0, b = 0;
    a++;
    if(a<5)
         b++;
    b--;
}
作为初始步骤,我只是尝试声明一个变量
test
,并尝试将其插入由随机源代码生成的AST的开头。 下面是我在将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'
你知道我会偏离轨道吗


谢谢

我发现有三个地方你通过了一个你本应该不通过的列表

## 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,但这一更改为我修复了您的回溯。

是否有理由将lst2和lst3初始化为[],然后分配其他内容?您不能对lst1执行此操作。@IraBaxter我也已将lst1初始化为[]。没有真正的理由。只是表明这些变量属于列表类型。您是否能够为未修改的函数重新生成文本?谢谢!这就是诀窍。你又是怎么弄明白的?我确实无法从可用的文档中看出这一点,我深入研究了pycparser代码中的类声明,以了解它的预期。我所追求的最大线索是错误消息,这是因为当你做show()时,它会调用每个孩子来做show()。因此,错误表明您提供了一个列表,而预期的对象是支持show()调用的对象。花了一段时间才弄清楚什么时候参数不正确,因为除了模块本身包含的示例之外,这段代码似乎真的缺少示例。没问题。我可能会很快开始发布pycparser问题。也许你会回答我的问题……似乎没有多少人在用这个模块做事了。这是真的。我很乐意帮忙:)
## 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)