Subject: [Fwd: Refal+ abstract syntax]
From: Andrey Slepuhin (pooh@msu.ru)
Date: Wed Nov 17 1999 - 19:07:25 MSK
Добрый день!
По просьбе Андрея Климова перепосылаю проект абстрактного
синтаксиса Рефала+ в refal@botik.ru. Просьба всем высказать свои
замечания/предложения. Заранее извиняюсь, если кто получит это
письмо второй раз.
Андрей.
-------- Original Message --------
Subject: Refal+ abstract syntax
Date: Wed, 17 Nov 1999 00:34:40 +0300
From: Andrey Slepuhin <pooh@msu.ru>
Organization: Moscow State University Network (MSUnet)
To: Andrei Klimov <klimov@keldysh.ru>
CC: Arkady Klimov <klark@bagirra.rinet.ru>,Andrei Nemytykh
<nemytykh@math.botik.ru>,Sergei Abramov <abram@botik.ru>,Sergei
Romanenko <roman@integrum.ru>,Victor Kistlerov <kistler@iitp.ru>
References: <025b01bf2f73$f70a11c0$0100a8c0@piii>
День добрый всем!
Ниже прилагается проект описания абстрактного синтаксиса Рефала+
в виде объектного выражения. За основу взято описание абстрактного
синтаксиса из статьи Романенко "Компиляция Рефал-программ в
виртуальный код" (файл rbvcomp.tex). Убедительная просьба всем
Рефал-гуру посмотреть внимательно на предмет ошибок и прочих замечаний.
Некоторые комментарии к файлу:
1) круглые скобки в описании - рефальские, то что заключено в кавычки -
рефальские "слова".
2) В файле не определены понятия Name - это по смыслу строка символов,
означающая то или иное имя, и SymbolValue - это соответствующий
рефальский символ.
3) Вместо форматного выражения используется жесткое; понятно,
что форматное выражение можно получить отбрасыванием у жесткого
имен переменных.
4) HardBlock, HardPAlt - это то что начинается с "{",
SoftBlock, SoftPAlt - это то что начинается с "\{"
Cut и Stake - это \! и \? соответственно (по предложению
Аркадия Климова).
5) В конструкциях типа :, ::, $iter ключевое слово вынесено вперед
(т.е. ("Colon" Source Sentence) а не (Source "Colon" Sentence))
6) Просьба особенно обратить внимание на следующие моменты:
- Нет ли где пропущенной альтернативной записи и что с ней делать
(например, тело функции может быть одним предложением; надо ли при
генерации абстрактного синтаксиса превращать его в образцовое
распутье из одного предложения?).
- Где по смыслу может стоять Empty, т.е. "пусто"? Кое-где я
Empty вставил, но, возможно, не везде.
- Насколько хорошо вписываются другие рефалы в этот синтаксис?
Все-таки хотелось бы иметь абстракный синтаксис универсальным;
если что - пока описание можно поправить.
- действительно ли даннное описание однозначно позволяет
произвести разбор программы? (т.е. не нужно ли где-нибудь
добавить ключевые слова или лишние скобки)
Буду крайне признателен за всяческую критику. Думаю, что до
семинара в понедельник можно успеть провести предварительное
обсуждение по почте, а на семинаре зафиксировать результаты.
Всего доброго,
Андрей.
Refal+ Abstract Syntax
----------------------
Program ::= ProgramItem | Program ProgramItem
ProgramItem ::= FuncDef | BoxDef | TableDef | VectorDef | StringDef
FuncDef ::= ("Function" FunctionName (FunctionFormat) (FunctionBody)) |
("Function?" FunctionName (FunctionFormat) (FunctionBody))
FunctionFormat ::= (InputFormat) (OutputFormat)
InputFormat ::= HardExpression
OutputFormat ::= HardExpression
HardExpression ::= HardTerms | HardTerms VVar HardTerms |
HardTerms EVar HardTerms
HardTerms ::= Empty | HardTerm | HardTerms HardTerm
HardTerm ::= Symbol | (HardExpression) | SVar | TVar
FunctionBody ::= Sentence | PAlt
PAlt ::= HardPAlt | SoftPAlt
HardPAlt ::= ("HardPAlt" PAltBody)
SoftPAlt ::= ("SoftPAlt" PAltBody)
PAltBody ::= Sentence | BlockBody Sentence
Sentence ::= (Pattern Tail)
Pattern ::= ("Left" PatternExpression) | ("Right" PatternExpression)
PatternExpression ::= Empty | Term | PatternExpression Term
Term ::= Symbol | (PatternExpression) | Variable
Symbol ::= ("Symbol" SymbolValue)
Variable ::= EVar | VVar | TVar | SVar
EVar ::= ("EVar" Name)
VVar ::= ("VVar" Name)
TVar ::= ("TVar" Name)
SVar ::= ("SVar" Name)
Tail ::= ("Comma" Path) | ("Not" Source Tail) | ("Stake" Path) |
("Cut" Path) | ("Fail") | ("Equal" Path) | ("Error" Path) |
("Trap" Path PAlt)
Path ::= (Source Tail) | ("DColon" Source (HardExpression) Tail) |
("Iter" Source Source (HardExpression) Tail) |
("Colon" Source Sentence)
Source ::= HardBlock | SoftBlock | ("Colon" Source PAlt) |
(ResultExpression)
HardBlock ::= ("HardBlock" BlockBody)
SoftBlock ::= ("SoftBlock" BlockBody)
BlockBody ::= Path | BlockBody Path
ResultExpression ::= ResultTerm | ResultExpression ResultTerm
ResultTerm ::= Symbol | (ResultExpression) | Variable |
("Call" FunctionName (ResultExpression))
BoxDef ::= ("Box" BoxName)
TableDef ::= ("Table" TableName)
VectorDef ::= ("Vector" VectorName)
StringDef ::= ("String" StringName)
BoxName ::= Name
TableName ::= Name
VectorName ::= Name
StringName ::= Name
FunctionName ::= Name
Program ::= ProgramItem | Program ProgramItem
ProgramItem ::= FuncDef | BoxDef | TableDef | VectorDef | StringDef
FuncDef ::= ("Function" FunctionName (FunctionFormat) (FunctionBody)) |
("Function?" FunctionName (FunctionFormat) (FunctionBody))
FunctionFormat ::= (InputFormat) (OutputFormat)
InputFormat ::= HardExpression
OutputFormat ::= HardExpression
HardExpression ::= HardTerms | HardTerms VVar HardTerms |
HardTerms EVar HardTerms
HardTerms ::= Empty | HardTerm | HardTerms HardTerm
HardTerm ::= Symbol | (HardExpression) | SVar | TVar
FunctionBody ::= Sentence | PAlt
PAlt ::= HardPAlt | SoftPAlt
HardPAlt ::= ("HardPAlt" PAltBody)
SoftPAlt ::= ("SoftPAlt" PAltBody)
PAltBody ::= Sentence | BlockBody Sentence
Sentence ::= (Pattern Tail)
Pattern ::= ("Left" PatternExpression) | ("Right" PatternExpression)
PatternExpression ::= Empty | Term | PatternExpression Term
Term ::= Symbol | (PatternExpression) | Variable
Symbol ::= ("Symbol" SymbolValue)
Variable ::= EVar | VVar | TVar | SVar
EVar ::= ("EVar" Name)
VVar ::= ("VVar" Name)
TVar ::= ("TVar" Name)
SVar ::= ("SVar" Name)
Tail ::= ("Comma" Path) | ("Not" Source Tail) | ("Stake" Path) |
("Cut" Path) | ("Fail") | ("Equal" Path) | ("Error" Path) |
("Trap" Path PAlt)
Path ::= (Source Tail) | ("DColon" Source (HardExpression) Tail) |
("Iter" Source Source (HardExpression) Tail) |
("Colon" Source Sentence)
Source ::= HardBlock | SoftBlock | ("Colon" Source PAlt) |
(ResultExpression)
HardBlock ::= ("HardBlock" BlockBody)
SoftBlock ::= ("SoftBlock" BlockBody)
BlockBody ::= Path | BlockBody Path
ResultExpression ::= ResultTerm | ResultExpression ResultTerm
ResultTerm ::= Symbol | (ResultExpression) | Variable |
("Call" FunctionName (ResultExpression))
BoxDef ::= ("Box" BoxName)
TableDef ::= ("Table" TableName)
VectorDef ::= ("Vector" VectorName)
StringDef ::= ("String" StringName)
BoxName ::= Name
TableName ::= Name
VectorName ::= Name
StringName ::= Name
FunctionName ::= Name
This archive was generated by hypermail 2b25 : Mon Oct 25 2004 - 21:24:58 MSD