Oberon space

General Category => Общий раздел => Тема начата: valexey_u от Октябрь 23, 2013, 11:37:49 pm

Название: [Oberon-07/11] Импорт типов.
Отправлено: valexey_u от Октябрь 23, 2013, 11:37:49 pm
Только что напоролся на один нюанс, который раньше замечен не был. Вот такой код, с точки зрения грамматики Oberon'a не валиден оказывается:

MODULE B;
IMPORT A;
TYPE
 Boo = A.Foo;
END B.

Конкретно не валидно вот это:
Boo = A.Foo
Справа тут может быть только StructType:
StrucType = ArrayType | RecordType | PointerType | ProcedureType.
ArrayType = ARRAY length {"," length} OF type.
RecordType = RECORD ["(" BaseType ")"] [FieldListSequence] END.
PointerType = POINTER TO type.
ProcedureType = PROCEDURE [FormalParameters].

Ибо:
TypeDeclaration = identdef "=" StrucType.

DeclarationSequence = [CONST {ConstDeclaration ";"}]
[TYPE {TypeDeclaration ";"}]
[VAR {VariableDeclaration ";"}]
{ProcedureDeclaration ";"}.

И никак не может быть qualident:
qualident = [ident "."] ident

Вот такие пироги.
Название: Re: [Oberon-07/11] Импорт типов.
Отправлено: valexey_u от Октябрь 23, 2013, 11:41:27 pm
Да, замечу, что ранее в Обероне это было:

TypeDeclaration = identdef "=" type.
type = qualident | ArrayType | RecordType | PointerType | ProcedureType.

То есть qualident допускался. Таким образом это было удалено намерянно.
Название: Re: [Oberon-07/11] Импорт типов.
Отправлено: Geniepro от Октябрь 24, 2013, 05:53:28 am
Ну, всё ближе и ближе к ассемблеру.
Интересно, если Вирт и дальше будет обновлять рапорты о языке, что ещё он оттуда удалит?
Название: Re: [Oberon-07/11] Импорт типов.
Отправлено: Geniepro от Октябрь 24, 2013, 05:58:49 am
Только что напоролся на один нюанс, который раньше замечен не был. Вот такой код, с точки зрения грамматики Oberon'a не валиден оказывается:
MODULE B;
IMPORT A;
TYPE
 Boo = A.Foo;
END B.

Ну значит придётся делать типа того:
MODULE B;
IMPORT A;
TYPE
 Boo = RECORD
   foo: A.Foo
 END;
END B.

А о реэкспорте типов придётся забыть. Да и нужен ли он? Вот в хаскелле с его иерархическими модулями реэкспорт полезен, да, а в Обероне зачем?
Название: Re: [Oberon-07/11] Импорт типов.
Отправлено: ilovb от Октябрь 24, 2013, 07:35:47 am
А никому в голову не приходило, что это может быть банальная невнимательность? Ну все эти странности в репорте.
Старый человек уже...
Тут очень полезно было бы посмотреть в авторскую реализацию компилятора.
Название: Re: [Oberon-07/11] Импорт типов.
Отправлено: Geniepro от Октябрь 24, 2013, 08:37:06 am
А никому в голову не приходило, что это может быть банальная невнимательность? Ну все эти странности в репорте.
Старый человек уже...

Это намёк на то, что не стоит искать злого умысла там, где имеет место простая глупость? )))
Слишком простое объяснение всё же ))
Название: Re: [Oberon-07/11] Импорт типов.
Отправлено: adva от Октябрь 24, 2013, 08:51:56 am
Слишком простое объяснение всё же ))
Но мнительность тоже до добра не доводит :) . Всегда во всем подозревать то, чего нет. Думать, что думает другой человек, неблагодарное занятие, если уж даже "мысль высказанная есть ложь". В реальности с такой же вероятностью может оказаться так, как сказал ilovb , как и все прочее :)
Название: Re: [Oberon-07/11] Импорт типов.
Отправлено: valexey_u от Октябрь 24, 2013, 09:00:16 am
А никому в голову не приходило, что это может быть банальная невнимательность? Ну все эти странности в репорте.
Старый человек уже...
Тут очень полезно было бы посмотреть в авторскую реализацию компилятора.
Приходило, но слишком уж эти изменения хорошо вписываются в общую концепцию изменений - Вирт окончательно выпилил в секции TYPE алиасы типов. Для примитивных типов выпилил, и для структурных, как видим, на уровне грамматики выпилил. Отныне в секции TYPE у нас ТОЛЬКО объявление новых типов.

Собственно да, теперь не возможно и такое:
TYPE
   Foo = RECORD END;
   Bar = Foo;
Название: Re: [Oberon-07/11] Импорт типов.
Отправлено: vlad от Октябрь 24, 2013, 04:17:49 pm
Приходило, но слишком уж эти изменения хорошо вписываются в общую концепцию изменений - Вирт окончательно выпилил в секции TYPE алиасы типов.

Да, это не похоже на банальную описку. Видимо Вирт в очередной раз подошел к своему компилятору с вопросом "чего бы еще отрезать" и увидел, что алиасы используются относительно редко. Ну и выпилил. Какой-то глубокий смысл тут искать бесполезно.

С точки зрения реализации компилятора (моей) для поддержки алиасов вообще ничего не нужно (несколько строк). Более менее интересно оно только с точки зрения пользовательской диагностики (как именовать такой тип при выводе ошибок).