LINUX.ORG.RU

Какие бывают преобразования фрагмента кода?

 


1

3

Допустим есть фрагмент кода в виде какого то объекта (в виде AST) - какие есть возможности для его анализа и преобразования? Первое что в голову приходит, это макро подстановка - меняем любой индентификатор на другой фрагмент кода, получаем новый фрагмент. Это просто, но возможности такого преобразования ограничены.

Другая крайность - причесываем AST рекурсивно какой нибудь функцией, функция принимает узел AST, и возвращает eго замену. Так можно делать что угодно, но слишком брутально иногда выходит.

Как еще можно извращаться?:-)

★★★★★
Ответ на: комментарий от tailgunner

Я так понимаю, ничем сложным вроде парсинга DWARF вы не заморачивались?

Я от тебя первого это слово слышу;-)

Шаблоны, разные виды наследования?

Шаблоны безусловно. С наследованием чуть хуже - просто не было таких задач, думаю тоже возможно.

Макрос используется примерно так

struct A{
   int x; double y[3];
   STRUCT_INFO1(x, y);
};
// или
STRUCT_INFO2(A, p.x, p.y);
Есть некоторый объект, накапливающий описание структуры. Макрос перегружает для него внешний оператор << который в заносит в экземпляр объекта в рантайме информацию о полях, типах и прочем. Так что наследование должно как то работать.

Делается это для описания ячейки задампленного массива. Что бы потом в графопостроителе (или при обработке), можно было указать какую функцию из полей ячейки надо собрать. Поскольку структура ячейки меняется относительно редко, то лишнюю строчку написать несложно.

AIv ★★★★★
() автор топика
Ответ на: комментарий от AIv

Шаблоны, разные виды наследования?

Шаблоны безусловно.

Хм. А как вы шаблоны помечаете?

Макрос перегружает для него внешний оператор << который в заносит в экземпляр объекта в рантайме информацию о полях, типах и прочем

А зачем так сложно? Есть же gccxml, pycparser.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от AIv

Это называется категорные семантики — см. Scott (1), Lambek (2), Seely (3, 4). Но не нужно в данном случае :) Нужно переписывать AST функциями, максимально декларативно, по возможности — как это делают в ML-ях и Racket, например.

quasimoto ★★★★
()
Ответ на: комментарий от tailgunner

Хм. А как вы шаблоны помечаете?

template <class T> struct A{
    T x[10];
};
template <class T> STRUCT_INFO(A<T>, p.x);

как то так.

А зачем так сложно? Есть же gccxml, pycparser.

Я про них не знаю;-(

Ну и на самом деле это не сложно + используется еще и для вывода отладочной информации.

AIv ★★★★★
() автор топика
Ответ на: комментарий от quasimoto

Спасибо. Я уже понял что анонимус шутит;-)

AIv ★★★★★
() автор топика
Ответ на: комментарий от Legioner

Сухой остаток - без рекусивного обхода не обойтись, удобнее всего делать посетителя через паттерн-матчинг.

Всем спасибо!

AIv ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.