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