Skip to content

Распознавание группового экранирования предложений #341

@Mazdaywik

Description

@Mazdaywik

Ранее в рамках этой задачи предлагалось ещё и удалять экранированные предложения на стадии оптимизации. Эта деятельность была перенесена в отдельную задачу #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, которая является специализируемой:

/**
<Map t.Closure t.Item*> == e.ItemRes*
<Apply t.Closure t.Item> == e.ItemRes
*/
Map {
t.Fn t.Next e.Tail = <Apply t.Fn t.Next> <Map t.Fn e.Tail>;
t.Fn /* пусто */ = /* пусто */;
}
$SPEC Map t.FUNC e.items;

С аварийным предложением функция примет вид

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 относительно алгоритма группового экранирования. Она спец в этих алгоритмах (это тема её научной работы), я — полный ноль.
  • Реализовать групповое экранирование в распознавателе экранирования.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions