Re: Refal+ abstract syntax


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