Я пытаюсь изменить исходный код ввода 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'
Любая идея относительно того, где я собираюсь уйти с трассы?
Благодаря
Есть ли причина, по которой lst2 и lst3 инициализируются [], а затем назначены что-то еще? Вы не делаете этого до lst1. –
@IraBaxter Я также инициализировал _lst1_ и _ [] _. И нет никакой реальной причины для этого. Просто указывая, что эти переменные имеют тип _list_. – Shash
Можете ли вы восстановить текст для немодифицированной функции? –