4

入力 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を抽出した後、私が関与したpythonコードは次のとおりです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'

私が軌道から外れる場所について何か考えはありますか?

ありがとう

4

1 に答える 1

2

なしを渡す必要があるリストを渡す場所が3つ見つかりました。

## 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も学んでいるので、これについてはあまり詳しくありませんが、この変更により、トレースバックが修正されます。

于 2012-06-10T00:38:02.983 に答える