2012-06-07 2 views
3

Я пытаюсь изменить исходный код ввода C/refactor. Я пытаюсь добавить инструкцию 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 и попытался вставить его в начало АСТ, генерируемого случайным исходным кодом. Вот код 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(). Потребовалось некоторое время, чтобы выяснить, когда параметры были неправильными, поскольку, по-видимому, существует настоящий недостаток примеров для этого кода, кроме примеров, включенных в сам модуль. – ChipJust

+0

Ярмарка 'nuf. Еще раз спасибо! – Shash

Смежные вопросы