Здравствуйте, Sinclair, Вы писали:
S>Непонятно. Что значит "разные блоки"?
Блок с выражениями типа "a = b" испольняется один раз, блок с выражениями типа "a : a + b" исполняется столько раз, сколько есть итераций. Каждый из них не зависит от другого, поэтому оба можно генерировать независимо.
S>Выглядит как-то сложно. Блоки нужно генерировать тогда, когда уже есть все нужные данные.
S>1. Построили полный список ячеек.
S>2. Построили граф зависимостей.
S>3. Отсортировали ячейки в соответствии с топологией зависимостей (тут я немного плаваю, но, судя по всему, вы уже решили эту задачу)
S>4. Породили адреса для каждой ячейки
S>5. Сгенерировали код.
Вот контрпример:
b = 1
a = b
b : a + b
Если не разделять шаг инициализации и шаг итерации, то получается циклическая зависимость и простой топологической сортировкой задача не решается, нужно обрабатывать блоки "=" и ":" отдельно.
S>Опять же, не очень понятно, как должна работать формула вида a = a + b. Берётся значение a с предыдущей итерации, и прибавляется значение b с текущей итерации?
Да, в этом и основная суть DSL. Только с "=" такое не прокатит, потому что это выражение для инициализации. А итеративное вычисление задаётся в виде "a : a + b".