Subject: Re: Refal+ abstract syntax
From: Sergei M. Abramov (abram@botik.ru)
Date: Tue Nov 23 1999 - 09:54:43 MSK
День добрый, Андрей!
День добрый, всем!
Вот, дополз до "Subject: Refal+ abstract syntax"....
>Ниже прилагается проект описания абстрактного синтаксиса Рефала+
>в виде объектного выражения. За основу взято описание абстрактного
>синтаксиса из статьи Романенко "Компиляция Рефал-программ в
>виртуальный код" (файл rbvcomp.tex). Убедительная просьба всем
>Рефал-гуру посмотреть внимательно на предмет ошибок и прочих замечаний.
>6) Просьба особенно обратить внимание на следующие моменты:
...
>   - действительно ли даннное описание однозначно позволяет
>     произвести разбор программы? (т.е. не нужно ли где-нибудь
>     добавить ключевые слова или лишние скобки)
Мне кажется, что контроль за однозначностью разбора программы сильно
упростится, если нетерминалы снабдить рефальскими типами (s., t., v.,
e.). В этом случае однозначность разбора можно определить как
несовместность клэша двух разных алтернатив описания, что легко
проверяется и формально (можно написать программу), и визуально...
Это и упростит написание (а возможно и генерацию) программ:
можно с каждой переменной x.ZZZZZ связать функцию-предикат
  $func? <ZZZZZ? x.ZZZZZ> = ;
===========================================================
Строчки я пометил "*" (старое), "+" (новое), "#" (изменное)
+ t.ProgramFile ::= (e.Program)
Программа--терм, может быть считана одним <Read ...>
* e.Program ::= t.ProgramItem | t.ProgramItem e.Program--
* t.ProgramItem ::= t.FuncDef | t.BoxDef | t.TableDef | t.VectorDef
*                 | t.StringDef
+                 | t.ConstDef | t.Pragma | t.ImportDef | t.Export
Пропущено:
   -- определение константы (тут возможна большая дискуссия--надо/не надо;
   -- прагмы ($trace, $traceall, думаю может быть полезна поддержка аналога
      #file/#line из Си--сохранять позиционирование на исходный текст, для
      поддержки серьеаных обработчиков/оптимайзеров и/или экранных
      отладчиков--трасировщиков с возможностью остановки брек-поинтов на ",",
      "=", "{" и т.п.;-),
   -- импорт/экспорт.
* t.FuncDef ::= ("Function" s.FunctionName  (e.FunctionFormat)
*                            (t.FunctionBody))
*             | ("Function?" s.FunctionName (e.FunctionFormat)
*                            (t.FunctionBody))
Можно опустить ВСЕ внутренние скобки (формат и так жесткий).
И не только в этом месте.  Это стало видно теперь, когда приписаны
рефальские типы...
*
* e.FunctionFormat ::= (e.InputFormat) (e.OutputFormat)
*
* e.InputFormat ::= e.HardExpression
*
* e.OutputFormat ::= e.HardExpression
*
* e.HardExpression ::= e.HardTerms
*                    | e.HardTerms t.VVar e.HardTerms
*                    | e.HardTerms t.EVar e.HardTerms
*
# e.HardTerms ::= e.Empty | t.HardTerm e.HardTerms
*
+ e.Empty ::= /* empty */
*
* t.HardTerm ::= t.Symbol | (e.HardExpression) | t.SVar | t.TVar
*
* t.FunctionBody ::= t.Sentence | t.PAlt
*
* t.PAlt ::= t.HardPAlt | t.SoftPAlt
*
* t.HardPAlt ::= ("HardPAlt" e.PAltBody)
*
* t.SoftPAlt ::= ("SoftPAlt" e.PAltBody)
*
* e.PAltBody ::= t.Sentence | t.Sentence e.BlockBody
? e.PAltBody : e.Empty может быть ?
* t.Sentence ::= (t.Pattern t.Tail)
*
* t.Pattern ::= ("Left" e.PatternExpression) | ("Right" e.PatternExpression)
*
# e.PatternExpression ::= e.Empty | t.Term PatternExpression
*
* t.Term ::= t.Symbol | (e.PatternExpression) | t.Variable
*
* t.Symbol ::= ("Symbol" SymbolValue)
*
* 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)
*
* t.Tail ::= ("Comma" t.Path) | ("Not" t.Source t.Tail) | ("Stake" t.Path) |
*        ("Cut" t.Path) | ("Fail") | ("Equal" t.Path) | ("Error" t.Path) |
*        ("Trap" t.Path t.PAlt)
*
* t.Path ::= (Source t.Tail) | ("DColon" t.Source (e.HardExpression) t.Tail) |
*         ("Iter" t.Source t.Source (e.HardExpression) t.Tail) |
*         ("Colon" t.Source t.Sentence)
*
* t.Source ::= t.HardBlock | t.SoftBlock | ("Colon" Source PAlt) |
*           (ResultExpression)
*
* t.HardBlock ::= ("HardBlock" e.BlockBody)
*
* t.SoftBlock ::= ("SoftBlock" e.BlockBody)
*
# e.BlockBody ::= t.Path | t.Path e.BlockBody
? e.BlockBody : e.Empty может быть ?
# e.ResultExpression ::= t.ResultTerm | t.ResultTerm e.ResultExpression
? ResultExpression : e.Empty может быть ?  Кажется "да"...
* t.ResultTerm ::= t.Symbol | (e.ResultExpression) | t.Variable |
*                  ("Call" s.FunctionName (e.ResultExpression))
? конечно в этом месте Рефал-?? потребует возможности опускать имя функции:
?    < <GetFname> <GetFarg> > .... ?
* t.BoxDef ::= ("Box" s.BoxName)
*
* t.TableDef ::= ("Table" s.TableName)
*
* t.VectorDef ::= ("Vector" s.VectorName)
*
* t.StringDef ::= ("String" s.StringName)
*
# s.BoxName      ::= s.Name  , <WORD? s.Name>
# s.TableName    ::= s.Name  , <WORD? s.Name>
# s.VectorName   ::= s.Name  , <WORD? s.Name>
# s.StringName   ::= s.Name  , <WORD? s.Name>
# s.FunctionName ::= s.Name  , <WORD? s.Name>
+ s.SymbolValue  ::= s
>Некоторые комментарии к файлу:
>1) круглые скобки в описании - рефальские, то что заключено в кавычки -
>   рефальские "слова".
Да, я еще поддерживаю использование Рефал конструкций в описании
синтаксиса.  В том числе: использование типизации нетерминалов и
уточнений типов за счет предикатов
(см. например: "s.Name  , <WORD? s.Name>").
>2) В файле не определены понятия Name - это по смыслу строка символов,
А мне кажется--это символ-слово ;-)
>   означающая то или иное имя, и SymbolValue - это соответствующий
>   рефальский символ.
>3) Вместо форматного выражения используется жесткое; понятно,
>   что форматное выражение можно получить отбрасыванием у жесткого
>   имен переменных.
Да, конечно.
>4) HardBlock, HardPAlt - это то что начинается с "{",
>   SoftBlock, SoftPAlt - это то что начинается с "\{"
>   Cut и Stake - это \! и \? соответственно (по предложению
>   Аркадия Климова).
Да, конечно.
>5) В конструкциях типа :, ::, $iter ключевое слово вынесено вперед
>   (т.е. ("Colon" Source Sentence) а не (Source "Colon" Sentence))
Да, конечно.
>6) Просьба особенно обратить внимание на следующие моменты:
>   - Нет ли где пропущенной альтернативной записи и что с ней делать
>     (например, тело функции может быть одним предложением; надо ли при
>     генерации абстрактного синтаксиса превращать его в образцовое
>     распутье из одного предложения?).
>   - Где по смыслу может стоять Empty, т.е. "пусто"? Кое-где я
>     Empty вставил, но, возможно, не везде.
>   - Насколько хорошо вписываются другие рефалы в этот синтаксис?
>     Все-таки хотелось бы иметь абстракный синтаксис универсальным;
>     если что - пока описание можно поправить.
>   - действительно ли даннное описание однозначно позволяет
>     произвести разбор программы? (т.е. не нужно ли где-нибудь
>     добавить ключевые слова или лишние скобки)
>
>Буду крайне признателен за всяческую критику. Думаю, что до
>семинара в понедельник можно успеть провести предварительное
>обсуждение по почте, а на семинаре зафиксировать результаты.
Увы, я поздно дополз до текста.
Сергей
П.С. Андрей (Слепухин)!  Я сегодня буду на семинаре в МГУ (18:05, ауд. 1013).
This archive was generated by hypermail 2b25 : Mon Oct 25 2004 - 21:24:58 MSD