Oberon space
General Category => Общий раздел => Тема начата: 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
Вот такие пироги.
-
Да, замечу, что ранее в Обероне это было:
TypeDeclaration = identdef "=" type.
type = qualident | ArrayType | RecordType | PointerType | ProcedureType.
То есть qualident допускался. Таким образом это было удалено намерянно.
-
Ну, всё ближе и ближе к ассемблеру.
Интересно, если Вирт и дальше будет обновлять рапорты о языке, что ещё он оттуда удалит?
-
Только что напоролся на один нюанс, который раньше замечен не был. Вот такой код, с точки зрения грамматики 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.
А о реэкспорте типов придётся забыть. Да и нужен ли он? Вот в хаскелле с его иерархическими модулями реэкспорт полезен, да, а в Обероне зачем?
-
А никому в голову не приходило, что это может быть банальная невнимательность? Ну все эти странности в репорте.
Старый человек уже...
Тут очень полезно было бы посмотреть в авторскую реализацию компилятора.
-
А никому в голову не приходило, что это может быть банальная невнимательность? Ну все эти странности в репорте.
Старый человек уже...
Это намёк на то, что не стоит искать злого умысла там, где имеет место простая глупость? )))
Слишком простое объяснение всё же ))
-
Слишком простое объяснение всё же ))
Но мнительность тоже до добра не доводит :) . Всегда во всем подозревать то, чего нет. Думать, что думает другой человек, неблагодарное занятие, если уж даже "мысль высказанная есть ложь". В реальности с такой же вероятностью может оказаться так, как сказал ilovb , как и все прочее :)
-
А никому в голову не приходило, что это может быть банальная невнимательность? Ну все эти странности в репорте.
Старый человек уже...
Тут очень полезно было бы посмотреть в авторскую реализацию компилятора.
Приходило, но слишком уж эти изменения хорошо вписываются в общую концепцию изменений - Вирт окончательно выпилил в секции TYPE алиасы типов. Для примитивных типов выпилил, и для структурных, как видим, на уровне грамматики выпилил. Отныне в секции TYPE у нас ТОЛЬКО объявление новых типов.
Собственно да, теперь не возможно и такое:
TYPE
Foo = RECORD END;
Bar = Foo;
-
Приходило, но слишком уж эти изменения хорошо вписываются в общую концепцию изменений - Вирт окончательно выпилил в секции TYPE алиасы типов.
Да, это не похоже на банальную описку. Видимо Вирт в очередной раз подошел к своему компилятору с вопросом "чего бы еще отрезать" и увидел, что алиасы используются относительно редко. Ну и выпилил. Какой-то глубокий смысл тут искать бесполезно.
С точки зрения реализации компилятора (моей) для поддержки алиасов вообще ничего не нужно (несколько строк). Более менее интересно оно только с точки зрения пользовательской диагностики (как именовать такой тип при выводе ошибок).