[Fwd: Refal+ abstract syntax]


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