首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法修改pycparser AST |将AST转换为C代码

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

Stack Overflow用户
提问于 2012-06-08 01:27:20
回答 1查看 1.9K关注 0票数 4

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

例如,如果我的输入是-

代码语言:javascript
复制
void foo(){
    // Sample input code
    int a = 0, b = 0;
    a++;
    if(a<5)
         b++;
    b--;
}

我想添加语句printf('Hi');,导致-

代码语言:javascript
复制
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之后-

代码语言:javascript
复制
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()

每当我尝试使用它的show( )方法时,我都会发现结果结构functionBody1中没有任何变化,并且也得到了以下错误。

代码语言:javascript
复制
'list' object has no attribute 'show'

你知道我要偏离正轨了吗?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-10 08:38:03

我发现有三个地方你正在传递一个列表,而你本应该一个都没有传递。

代码语言:javascript
复制
## 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,但这一更改会为我修复您的回溯。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10936782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档