Re: Refal+ abstract syntax


Subject: Re: Refal+ abstract syntax
From: Sergei M. Abramov (abram@botik.ru)
Date: Fri Nov 26 1999 - 09:15:29 MSK


День добрый!

>P.S. Убедительная просьба не присылать MS Word/RTF документы - у меня
>нету Windows на компьютере :-).

У меня есть Ворд, но в данном случае действительно его применение не оправдано,
потому, что текст который мы все вместе вырабатываем после шлифоеки пойдет в
производство (в производство программ, ТеХ-ов и т.п.) и формат Ворда будет
помехой.

Давайте ориентироваться на плоский текст.

Есть к содержимому (не форме) ряд вопросов, но пока реплику закончу...

Сергей
П.С. Я почти не трогал (по смыслу) текст Аркадия--кроме последних 13 строк...

                     Абстрактный синтаксис Рефала

                            Акрадий Климов

Предлагаю более абстрактный синтаксис. Он несколько шире прежнего, но
не намного. Примерно настолько, чтобы объять как Рефал Плюс так и
Рефал 6.

За основу я взял ответ С.Абрамова.

Основные изменения состоят в следующем.

    1. Тело функции путь (не обязательно блок).

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

    3. Все скобки, включая образующие термы, имеют впереди теги.

    4. Я не стал здесь брать теги в кавычки.

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

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

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

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

    9. Вместо трех понятий: Tail, Path, Source одно: e.Sentence.

   10. Констант нет: они уже подставлены. Но вопрос: что такое
       имя функции? И как выглядит внутри выражения ссылка на
       функцию? Другие символы ссылки? Возможный ответ: как (Ref
       s.Word). Определяющие вхождения задаются просто как s.Word. В
       вызове функции используется (Ref s.Word)

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

   12. Объектные символы (в отличие от символов-ссылок)
       представляются сами собой, а не как (Symbol s)

   13. Операторы Error и Trap имеют неявный дополнительный
       аргумент продолжение справа от оператора.

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

   15. Конкретная реализация может не поддерживать какие-то
       элементы (или сочетания элементов) абстрактного синтаксиса. В
       этом случае должно выдаваться внятное сообщение.

======================================================================

t.ProgramFile ::= (Program t.Source t.Import e.Program)

t.Import ::= (Use e.Names)

t.Source ::= (Source s.FileName)

s.FileName ::= s.Name

e.Program ::= t.ProgramItem
                      | e.Program t.ProgramItem
                      | t.Line

t.ProgramItem ::= t.FuncDef | t.ObjectDef | t.Initializer

t.FuncDef ::= (s.FuncKey s.FunctionName t.InputFormat
                                   t.OutputFormat e.Sentence)

s.FuncKey ::= Func | Func?

t.InputFormat ::= t.Format

t.OutputFormat ::= t.Format

t.Format ::= (Form e.HardExpression)

e.HardExpression ::= e.HardTerms
                      | e.HardTerms t.VVar e.HardTerms
                      | e.HardTerms t.EVar e.HardTerms

e.HardTerms ::= /* empty */
                      | t.HardTerm e.HardTerms

t.HardTerm ::= t.Symbol
                      | (Par e.HardExpression)
                      | t.SVar
                      | t.Tvar

t.Block ::= (Block e.Branches)

e.Branches ::= /* empty */
                      | t.Branch e.Branches

t.Branch ::= (Branch e.Sentence)
e.Sentence ::= /* empty */
                      | e.Statement e.Sentence

e.Statement ::= t.Action
                      | Not t.Action
                      | (Label s)
                      | (Loop s)
                      | Cut
                      | CutAll
                      | Stake
                      | NoFail
                      | Fail
                      | Error
                      | (Trap e.Sentence-Catch)
                      | t.Line

t.Action ::= t.Pattern
                      | t.Result
                      | t.Format
                      | t.Block

t.Pattern ::= (Left e.PatternExpression)
                      | (Right e.PatternExpression)

e.PatternExpression ::= /* empty */
                      | t.PatternTerm e.PatternExpression

t.PatternTerm ::= t.Symbol
                      | (e.PatternExpression)
                      | t.Variable

t.Variable ::= t.EVar
                      | t.VVar
                      | t.TVar
                      | t.Svar

t.EVar ::= (EVar s.Name)
t.VVar ::= (VVar s.Name)
t.TVar ::= (TVar s.Name)
t.SVar ::= (SVar s.Name)

e.ResultExpression ::= /* empty */
                      | t.ResultTerm e.ResultExpression

t.ResultTerm ::= t.Symbol
                      | (Par e.ResultExpression)
                      | t.Variable
                      | (Call e.ResultExpression)

t.Symbol ::= s.ObjectSymbol
                      | (Ref s.Name)

t.ObjectDef ::= (s.Type s.Name)

t.Initializer ::= (Exec e.ResultExpression)

s.Type ::= Table
                      | Box
                      | String
                      | Vector
                      | Channel
                      | s.OtherType

s.FunctionName ::= s.Name

e.Names ::= /* empty */
                      | s.Name e.Names

s.Name ::= s.name, <WORD? s.name>

t.Line ::= (Line s.LineNumber s.PosNumber)
                      | (Line s.LineNumber)

s.LineNumber ::= s.Number

s.PosNumber ::= s.Number

s.Number ::= s.number, <INT? s.number>

Представление для $Iter

Repr ("Iter" t.Source1 t.Source2 (e.HardExpression) e.Tail)
     = *-----------------------------------------------------
       <NewLabel> :: s.lab,
     =
       <Repr t.Source1>
       (Label s.lab)
       (Form e.HardExpression)
       (Block
              (Branch <Repr e.Tail>)
              (Branch <Repr t.Source2> (Loop s.lab) )
       )



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