refal-5-lambda
refal-5-lambda copied to clipboard
Распознавание группового экранирования предложений
Ранее в рамках этой задачи предлагалось ещё и удалять экранированные предложения на стадии оптимизации. Эта деятельность была перенесена в отдельную задачу #346, которая не связана с текущей. Постановка текущей задачи отредактирована.
Введение
В компиляторе уже присутствует механизм распознавания экранируемых предложений — компилятор выдаёт предупреждения (при включённой опции -Wscreening
) на случаи, когда предложение экранируется одним из предшествующих.
Модуль был реализован Александром Барлукой aka @nexterot (#256, #297) под руководством Антонины Николаевны Непейвода aka @TonitaN (теоретический фундамент) и меня (архитектура компилятора).
Мотивация
Групповым экранированием предложений называется ситуация, когда некоторое предложение не выполняется из-за того, что предшествующие предложения в совокупности покрывают то же или большее множество возможных значений, что и само это предложение. Простой пример:
F {
t.1 t.2 e.3 = One;
e.X t.Y = Two;
/* пусто */ = Three;
e.X = "Boom!";
}
Последнее предложение никогда не выполнится, т.к. предшествующие в совокупности его экранируют. Однако, ни одно из предшествующих само по себе не экранирует последнее.
Групповое экранирование в компиляторе уже возникает и возникает давно. Вот есть функция Map
, которая является специализируемой:
https://github.com/bmstu-iu9/refal-5-lambda/blob/db0ccf9cb8ce6548e964381dda6977d3a6e79baf/src/lib/common/LibraryEx.refi#L21-L32
С аварийным предложением функция примет вид
Map {
t.Fn t.Next e.Tail = <Apply t.Fn t.Next> <Map t.Fn e.Tail>;
t.Fn /* пусто */ = /* пусто */;
t.FUNC e.items = <Map@0 t.FUNC e.items>;
}
Аварийное предложение здесь избыточно, поскольку оно экранируется предшествующими предложениями.
Реализация
При реализации нужно решить ряд следующих задач:
- [ ] Проконсультироваться с Антониной Николаевной @TonitaN относительно алгоритма группового экранирования. Она спец в этих алгоритмах (это тема её научной работы), я — полный ноль.
- [ ] Реализовать групповое экранирование в распознавателе экранирования.
В рамках ВКР не обязательно переносить распознавание экранирования предложений на этап оптимизации. Достаточно расширить набор случаев, когда это предупреждение выдаётся.
Задача не была выбрана в качестве ВКР.