Вот продолжение -- промежуточный этап (пока не очень полезный) создания переписывателя GNU C extensions. На этом этапе он должен ставить вложенные функции на верхний уровень (без какой-либо проверки и переписывания параметров и т.п.; но с точки зрения внутреннего устройства это приближает к реализации цели). Представлен в репозитории: http://hub.darcs.net/imz/language-c_1_process_analyze-printAST (1 -- по номеру сообщения; в предыдущем сообщении уже было в основном описано, как производить его запуск и пр. это сообщение сохранено как [ann1.md](http://hub.darcs.net/imz/cuglify/browse/ann1.md).) Сборка: ======= На этот раз изменённую библиотеку стоит поставить в свой отдельный sandbox, собрать с ней examples/Process (в этом случае такой порядок действий darcs проверен, а при другом можно наткнуться на неприятности, к сожаленью): [imz@vb2 ~]$ cd public/cuglify-WIP/ [imz@vb2 cuglify-WIP]$ darcs clone language-c_process_analyze-printAST language-c_1_process_analyze-printAST [imz@vb2 cuglify-WIP]$ cd language-c_1_process_analyze-printAST [imz@vb2 language-c_1_process_analyze-printAST]$ darcs pull -a http://hub.darcs.net/imz/language-c_1_process_analyze-printAST [imz@vb2 language-c_1_process_analyze-printAST]$ cabal sandbox init [imz@vb2 language-c_1_process_analyze-printAST]$ cabal install [imz@vb2 language-c_1_process_analyze-printAST]$ cabal exec -- make -C examples Process Тестирование: ============= [imz@vb2 language-c_1_process_analyze-printAST]$ cd ../cuglify/ [imz@vb2 cuglify]$ ./run-tests.sh ../language-c_1_process_analyze-printAST/examples/Process PROCESSING ex-nested.c... * with gcc -c: 0 * with ../language-c_1_process_analyze-printAST/examples/Process: int g(int x) { return b + x + a; } void f(int a) { int b = 5; g(0); g(1); g(2); } 0 * diff against gcc -E: --- /dev/fd/63 2016-01-11 21:09:08.920889328 +0300 +++ /dev/fd/62 2016-01-11 21:09:08.920889328 +0300 @@ -1,11 +1,10 @@ -# 1 "ex-nested.c" -# 1 "" -# 1 "ex-nested.c" -void f(int a) { - int b = 5; - int g(int x) { +int g(int x) +{ return b + x + a; - } +} +void f(int a) +{ + int b = 5; g(0); g(1); g(2); TEST OK on ex-nested.c PROCESSING ex-nested_typemismatch.c... * with gcc -c: ex-nested_typemismatch.c: In function ‘f’: ex-nested_typemismatch.c:7:4: error: called object ‘b’ is not a function 1 * with ../language-c_1_process_analyze-printAST/examples/Process: Process: user error (ex-nested_typemismatch.c:7: (column 3) [ERROR] >>> AST invariant violated attempt to call non-function of type int ) 1 TEST OK on ex-nested_typemismatch.c PROCESSING ex-nested_undef.c... * with gcc -c: 0 * with ../language-c_1_process_analyze-printAST/examples/Process: ex-nested_undef.c:7: (column 3) [WARNING] >>> AST invariant violated unknown function: h int g(int x) { return b + x + a; } void f(int a) { int b = 5; g(0); h(1); g(2); } 0 * diff against gcc -E: ex-nested_undef.c:7: (column 3) [WARNING] >>> AST invariant violated unknown function: h --- /dev/fd/63 2016-01-11 21:09:09.069878241 +0300 +++ /dev/fd/62 2016-01-11 21:09:09.070878166 +0300 @@ -1,11 +1,10 @@ -# 1 "ex-nested_undef.c" -# 1 "" -# 1 "ex-nested_undef.c" -void f(int a) { - int b = 5; - int g(int x) { +int g(int x) +{ return b + x + a; - } +} +void f(int a) +{ + int b = 5; g(0); h(1); g(2); TEST OK on ex-nested_undef.c PROCESSING ex-nested-with-id-collisions.c... * with gcc -c: ex-nested-with-id-collisions.c: In function ‘g’: ex-nested-with-id-collisions.c:10:5: warning: return makes integer from pointer without a cast [enabled by default] 0 * with ../language-c_1_process_analyze-printAST/examples/Process: void f(int x); void g(int x); void h(int x); int b = 11; int g(int x) { return f + x + a; } void f(int a) { int b = 5; g(0); g(1); g(2); } void f(int y); void g(int y); void h(int y); 0 * diff against gcc -E: --- /dev/fd/63 2016-01-11 21:09:09.178870130 +0300 +++ /dev/fd/62 2016-01-11 21:09:09.178870130 +0300 @@ -1,23 +1,18 @@ -# 1 "ex-nested-with-id-collisions.c" -# 1 "" -# 1 "ex-nested-with-id-collisions.c" void f(int x); void g(int x); void h(int x); - int b = 11; - -void f(int a) { - int b = 5; - int g(int x) { +int g(int x) +{ return f + x + a; - } - +} +void f(int a) +{ + int b = 5; g(0); g(1); g(2); } - void f(int y); void g(int y); void h(int y); TEST OK on ex-nested-with-id-collisions.c [imz@vb2 cuglify]$ Вопросы: ======== Остаются вопросы помимо реализации задуманного преобразования, как я писал, про встройку программы с таким интерфейсом в gcc, clang и т.п., обнаружение ошибок. Best regards, Ivan