Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет kouzdra ([info]kouzdra)
@ 2013-03-14 09:51:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Забавное
[info]pargentum@lj решил что он мене разоблачил.

Хотя как раз та самая работа и была первым в моей практике "коммерческим" применением ML и purely functional data structure (тогда еще SML/NJ, поскольку только начинал разбираться). Собственно после того реально и проникся - обнаружив насколько резко упростилась казавшаяся сложной задачка.

А задачка была забавная: если делать из gcc тул для интерактивного анализа кода (на проблему 2000 или что еще - не суть важно), привязка препроцессорного текста "с точностью до строчки" не очень устраивает - поскольку хочется иметь возможность ткнуть мышкой в имечко или оператор, ну и подсветить в тексте найденное правильно, а компилятор работает на уровне "послепрепроцессора".

Ну вот предлагаю задачку - как адекватно ее решить не теряя информации вообще (попытки подхачить cpp блестяще обломились - человек, который это делал протрахался с пару месяцев и так и не смог победить ±1 позицию и прочие радости gcc).


(Добавить комментарий)


[info]666
2013-03-14 16:09 (ссылка)
"с точностью до строчки"
надо было сначала сделать вот так

void
main
(
void
)
{
}

а потом собрать обратно

(Ответить)


[info]blue_slonopotam
2013-03-15 07:03 (ссылка)
Na rabote prishlosy nakataty util. Util parse system verilog non-synthesizsble constructs and generstes somethi ng else . Previous version was written by alocal principsl engepineer in perl. Parsing a context free grammar using regular expressions was fun , I guess. The result required manual post-processing. The first version did not even tell whether the result could be trusted - yhey added bullshit detector later.

A mozhno tepery resbenie?

(Ответить) (Ветвь дискуссии)


[info]tristes_tigres
2013-03-15 15:44 (ссылка)
Я думаю, что сама постановка задачи и обсуждение у [info]pargentum@lj содержат ответ. Раз влезать внутрь CPP неперспективно и тонет в многочисленных деталях, остаётся только сама программа. Вместо текстового файла её нужно сделать древовидной такой структурой данных - когда препроцессор делает подстановку, то вместо замены текста, исходный текст становится узлом, а подставленный препроцессором текст - листом. И так далее.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]blue_slonopotam
2013-03-16 09:52 (ссылка)
>purely functional data structure - ... насколько резко упростилась казавшаяся сложной задачка.

Вот это интересный момент, каким именно боком оно тут помогло.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]kouzdra
2013-03-16 11:38 (ссылка)
Ну просто деревяшка как текст, а любое изменение - формирование новой деревяшки - это оно в чистом виде. Подходом кстати я проникся не из ML, а из либы cord.

Там еще есть забавный момент, что надо кластеризовать группы подстановок - иначе O(n^2) получается.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]blue_slonopotam
2013-03-18 21:09 (ссылка)
>Ну просто деревяшка как текст, а любое изменение - формирование новой деревяшки - это оно в чистом виде

А понял, просто метода та же - снизу вверх ползти и новые узлы создавать, если дети поменялись, а что старое дерево целым осталось - не используется.

>иначе O(n^2) получается.
У меня новое деревце экспонента от размера старого, и почти все живы.

(Ответить) (Уровень выше)


[info]kouzdra
2013-03-16 11:35 (ссылка)
Ну собственно коммент от тигров содержит решение - таки да - написать свой препроцессор (это задача простая) и генерить текст как дерево замен - по которому все что надо и отслеживать.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]tristes_tigres
2013-03-16 17:35 (ссылка)
Не имею понятия, как препроцессор выглядит изнутри, но, по идее, там должно быть какое-то представление текста программы, к которому он применяет операции замены. Вот это представление и операции на нём можно же заменить на обращения к функциональтной структуре данных, даже не написав свой препроцессор?

У [info]blue_slonopotam правда это сделано на Перле, так что там всё сложнее. Трудно сказать, как можно что-то сделать с веами типа $line ~= s/<horrible line noise>/<more horrible line noise>/g

(Ответить) (Уровень выше)


[info]ketmar
2013-03-18 20:03 (ссылка)
распидорасить текст на набор токенов, которые помнят, где в исходном файле они живут. и дальше все трансформации и проверки делать уже на этом наборе токенов. таким образом как токен не двигай, а всё равно знаешь, где именно он изначально находился.

дальше уже по желанию — можно AST строить, можно яму копатьсвой препроцессор сделать. поскольку немного людей абузят препроцессор, то достаточно «лобового» варианта хватит для 80% случаев. если не для 98%.

(Ответить) (Уровень выше)


[info]ketmar
2013-03-18 20:08 (ссылка)
p.s. подобным методом я в одном из мини-лиспов делал индикацию места ошибки. каждая cell помнила, откуда она родилась. ну, и при конструкции списков конструктор бережно прописывал свои значения новосозданым cell'ам. таким образом было ясно и кто сконструировал, и где именно наебнулось.

(Ответить) (Уровень выше)