Mazdaywik / Refal-05

Очень минималистичный компилятор Рефала
https://mazdaywik.github.io/Refal-05/
Other
4 stars 3 forks source link

Нативная поддержка условий и блоков #35

Open Mazdaywik opened 5 years ago

Mazdaywik commented 5 years ago

Эта задача — подзадача #33.

Мотивация

С условиями и блоками проще программировать. Добавить их в back-end и рантайм технически не сложно.

Реализация

Компиляция условий

Рассмотрим компиляцию условия:

P, R1 : P1 = R;

В этом случае псевдокод предложения будет иметь вид:

do {
  〈объявления переменных〉
  〈сопоставление с <F P>〉
  〈построение <F$1 R1> перед закрывающей угловой скобкой〉
  〈рекурсивный вызов рефал-машины〉
  do {
    〈сопоставление с <F$1 P1>〉
    〈построение R〉
    return;
  } while (0);
  〈удаление <F$1 …>〉
} while (0);

Здесь я намеренно написал не 〈сопоставление с P〉, а 〈сопоставление с <F P>〉, дабы подчеркнуть, что первой операцией выделяется аргумент из диапазона [arg_begin, arg_end]. Аналогичное действие применяется к сопоставлению с образцом условия.

Функция F$1, будучи вызванной, прерывает цикл работы рефал-машины.

Компиляция блоков

Рассмотрим блок:

P
  , R
  : {
      P1 = R1;
      P2 = R2;
    };

Псевдокод предложения:

do {
  〈объявления переменных〉
  〈сопоставление с <F P>)
  〈построение <F$1 R> перед закрывающей угловой скобкой〉
  〈рекурсивный вызов рефал-машины〉
  do {
    〈сопоставление с <F$1 P1>〉
    〈построение R1〉
    return;
  } while (0);

  do {
    〈сопоставление с <F$1 P2>〉
    〈построение R2〉
    return;
  } while (0);
  r05_recognition_impossible();
} while (0);

Выводы

Изменения рантайма минимальные — нужна функция для рекурсивного вызова рефал-машины и тело для функций F$1. На этапе кодогенерации потребуется некоторое количество работы. На этапе синтаксического анализа делать ничего не надо — см. #34.

Mazdaywik commented 5 years ago

Задача очень соблазнительная, но с ней придётся повременить.

В ближайшем будущем планируется эксперимент по распараллеливанию Рефала-05, а распараллелить версию с рекурсивным вызовом рефал-машины будет существенно сложнее.