Re: Refal+ abstract syntax


Subject: Re: Refal+ abstract syntax
From: Arkady Klimov (klimovark@mail.ru)
Date: Fri Nov 26 1999 - 12:43:12 MSK


Прошу прощения за RTF, действительно, надо было использовать плоский
текст.
Предлагаю ориентироваться на вариант моего предлложения, помещенный в
ответе С.Абрамова. Спасибо, Сергей. С изменениями внизу вполне
согласен, можно также убрать кавычки с "Iter" (это я виноват) и лишнее
= (нижнее). Или оно преднамеренно?

Сразу постараюсь ответить на вопросы Андрея С.

----- Original Message -----
From: Andrey Slepuhin <pooh@msu.ru>
To: Arkady Klimov <klark@bagirra.rinet.ru>
Cc: Sergei M. Abramov <abram@botik.ru>; <refal@botik.ru>
Sent: Friday, November 26, 1999 12:02 AM
Subject: Re: Refal+ abstract syntax

> Arkady Klimov wrote:
> >
> > Посылаю attached свои замечания/предложения
> > Аркадий.
>
> День добрый!
>
> Спасибо за предложения, я еще буду с ними подробно разбираться,
> но сразу же несколько вопросов:
> 1) Чего в исходном синтаксисе не хватает для отображения Рефала-6?
В рефале 6 допускается произвольная последовательность образцов и
результатов, в частности образец после образца и предложение может
оканчиваться на образец. Отсюда - пункты 5-6:

Пункт 7 - оператор типа NoFail нужен для отображения семантики знака =
как она определена в Рефале-6. Не откат до верхнего уровня, как в Р+,
а полная блокировка неуспеха.

Пункт 11 - В Рефале-6 расширен список предопределенных типов объектов
и имеется возможность расширять их дальше (прямо на рефале).

Остальные изменения нацелены на общее улучшение и упрощение.

Приведу некоторые мотивировки.

") 1. Тело функции путь (не обязательно блок).
Формально, путь можно свести к блоку, а блок к пути. По этому это
вопрос скорее эстетический. Блок (или PAlt) - это ветвление. Поэтому,
считать тело блоком означает считать существенным, что на самом
верхнем уровне тело функции начинается с ветвления. Мне это не кажется
правильным.

") 2. Путь последовательность операторов вытянут по-
") горизонтали через конкатенацию, а не через cons

Обидно не использовать возможность рефала вытягивать
последовательности "по-горизонтали". К тому же я некоторые операторы
сознательно описал как e (а не как t), в частности для Not.

Впрочем, сейчас вижу, что тут я немного неправ: все-таки Not относится
именно к одному action, а не ко всему хвосту. Надо исправить.
Например, взять Not t.Action в скобки. Больше e-операторов нет, можно
было бы и заменить здесь e на t. Но первый аргумент остается.

И еще: посмотрим на пункт 6. Видим, что последовательность из двух и
более действий тоже имеет семантику того же вида, что и отдельное
действие. Подозреваю, что семантику действия можно формально
определить так, что композиция действий будет ассоциативна. А тогда
использование конкатенации станет более чем оправданной.

") 3. Все скобки, включая образующие термы, имеют впереди теги.
В прежнем AS скобки, образующие термы, были без тегов. Полагаю, это
создало бы напряженность с однозначностью. Теперь же мы можем
позволить себе роскошь символы изображать самими собой.

") 4. Я не стал здесь брать теги в кавычки.
Вообще не понимаю, зачем были кавычки в прежнем варианте.

") 5. Сложные конструкции (перестройки, присваивания) разбиты на
") составляющие действия.

") 6. Семантика действия состоит в пополнении среды и выработке
") нового форматного значения (объектного выражения со
") статическим форматом). Действия бывают простые (образцы,
") результаты, форматы) и сложные (блоки).

Все это, на мой взгляд, привносит большое упрощение.

") 7. Есть отдельный оператор NoFail, непроницаемый для $Fail, и
") CUTALL, выражающий семантику равенства рефала +.
") Непрозрачный блок выражается так: NoFail
") (Block e.Branches).

NoFail как блокировка неуспеха позволяет обходиться без блока там, где
не требуется ветвления. При этом блок как таковой считается
прозрачным, а если нужен непрозрачный, надо поставить перед ним
NoFail. Оператор CUTALL в принципе является избыточным, поскольку
статически известно, скольким CUT он равносилен. Однако он введен для
облегчения трансляции знака = Рефала Плюс.
При этом знак = Рефала-6 транслируется в оператор NoFail с другой
семантикой.
Между прочим, отдельный оператор Fail тоже является избыточным: он
эквивалентен пустому блоку:
(Block).

") 8. $iter может быть разложен в более элементарные понятия
") (Label sl) и (Loop sl) см.ниже. В операторе Loop метка
") sl должна быть определенной (оператором Label) выше на
") пути от начала функции к данному оператору Loop.
") Ищется ближайшая точка Label с тем же символом-меткой.

Все-таки метка семантически более прозрачна, чем Iter, в определении
которого задействованы аж два источника, одно жесткое выражение и один
хвост.

") 9. Вместо трех понятий: Tail, Path, Source одно: e.Sentence.
Наличие "трех источников и составных частей" еще оправдано во внешнем,
конкретном синтаксиса, где идет борьба за однозначность распознавание.
Здесь, в AS, это уже становится лишним.

") 10. Констант нет: они уже подставлены. Но вопрос: что такое
") имя функции? И как выглядит внутри выражения ссылка на
") функцию? Другие символы ссылки? Возможный ответ: как (Ref
") s.Word). Определяющие вхождения задаются просто как s.Word.
В
") вызове функции используется (Ref s.Word)
На мой взгляд, само понятие константы в Рефал Плюс введено главным
образом для того, чтобы иметь механизм для введения символа-ссылки,
который никак иначе нельзя изобразить. Если константы убраны, то
проблема ссылок остается. Другой путь - оставить константы, а вместо
(Ref X) писать более общее (Const X), которое последующий анализ
должен заменять на соответствующее значение. При этом определения
констант для функций и других определенных объектов должны генериться
автоматически.

") 11. Определения символов-ссылок должна быть возможность
") расширять список типов ссылок.
См.выше.

") 12. Объектные символы (в отличие от символов-ссылок)
") представляются сами собой, а не как (Symbol s)
Не вижу необходимисти в дополнительном теге, с учетом того, что тег
(Par... ) есть у скобочного терма и у всех остальных скобок в AS.

") 13. Операторы Error и Trap имеют неявный дополнительный
") аргумент продолжение справа от оператора.
Это дело вкуса. Иначе нужно отдельно говорить, что после этих
операторов продолжение игнорируется. Впрочем, возможны варианты. Уж
все равно пришлось сказать, что

") 14. Остаток после операторов Fail и Loop игнорируется.

") 15. Конкретная реализация может не поддерживать какие-то
") элементы (или сочетания элементов) абстрактного синтаксиса.
В
") этом случае должно выдаваться внятное сообщение.
С учетом того, что сейчас у нас несколько рефалов и мы решаем задачу
их унификации, считаю это важным на сегодня. Для того, чтобы сообщения
можно было сделать действительно внятными, введены операторы (Line n
m), отмечающие номер строки-позиции исходного текста.

КОНЕЦ некоторых мотивировок.

> 2) Предлагаемый синтаксис несколько ближе к виртуальному коду. По
> крайней мере конструкций типа "Label s" в абстрактном синтаксисе
> иметь не хотелось бы.
Вопрос спорный. Но это конечно же еще далеко не виртуальный код. Более
того, предложение ввести метки в AS есть как бы заявка на возможность
в будущем ввести их и в исходный язык. Например для генерации
программ. Причем вопрос не чисто эстетический, поскольку метки,
очевидно, шире чем Iter.

> 3) Есть ощущение (хотя не проверенное), что предлагаемый синтаксис
> позволяет описать конструкции, которые семантически некорректны.

Замечу, что то же можно сказать и об исходном синтаксисе, в частности
по форматам: должно ведь выполняться дополнительное семантическое
условие по согласованию форматов. Если у меня и есть новые
семантические недосказаннасти, то в основном они того же толка.
Например, есть вопрос: должен ли блок быть либо образцовым (все ветви
начинаются с образца), либо результатным (все ветви начинаются с
результатного действия? Может ли ветвь начинаться с жесткого образца?
Можно наложить ограничение, но можно ведь и не накладывать. Ведь если
окажется, что в реализации они снимаются легко, то не будет смысла их
накладывать. Да, они вытекают из внешнего синтаксиса - но это свойство
и особенности именно внешнего синтаксиса, не более того. Что касается
семантики, то в упомянутых случаях обобщение семантики выглядит
достаточно прямолинейно.

А вот некоторые другие "сомнительные" места:

Некоторые сочетания, хотя и корректны, но бессмысленны. Например,
применение Not к жесткому образцу. В принципе это легко можно
исключить, модифировав абстрактный синтаксис.

Метки должны быть определены и не где-нибудь, а выше и на прямом пути
от корня. (Вопрос: может ли этот путь входить внутрь Not и проходить
через Trap?)

Среда после Not: думаю, надо считать ее нетронутой (такой же как и
перед Not).

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

Repr (Not t.A) e.S =
        Stake
        (Block
                (Branch <Repr t.A> Cut Fail)
                (Branch <Repr e.S>)
        )

Кстати, чтобы данный перевод был всегда корректным, нужно, чтобы не
было ограничения на то, что все ветви блока должны быть "одного типа".
Легко убедиться, что как и для Iter, этот перевод является
прямолинейным, в том смысле, что после трансляции в виртуальный код
результат будет таким же.

Убрав Not из AS, можно убрать и отдельное понятие action, которое есть
частный случай statement. Оно использутся только для того, чтобы
описание для Not сделать короче.

Если будут выявлены другие проблемы, буду рад услышать.

Всего наилучшего

Аркадий.

>
> Всего доброго,
> Андрей.
>
> P.S. Убедительная просьба не присылать MS Word/RTF документы - у
меня
> нету Windows на компьютере :-).
>
>
PS. Только что получил новые реплики от Андрея и Сергея. Это письмо
писалось без учета этих реплик. Щас отвечу и на них.



This archive was generated by hypermail 2b25 : Mon Oct 25 2004 - 21:24:58 MSD