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