Автор Тема: [Oberon-07/11] Странности синтаксиса.  (Прочитано 4619 раз)

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
[Oberon-07/11] Странности синтаксиса.
« : Декабрь 01, 2012, 11:48:29 pm »
Если четко следоваеть EBNF из сообщения о языке, то возможна следующая конструкция:
PROCEDURE foo();
CONST
    c* = 42;
TYPE
    p* = POINTER TO MyRecord;
VAR
    a* : INTEGER;
BEGIN
    a := 0;
END foo
То есть возможны метки экспорта в блоке деклараций у процедуры.

То ли Вирт просто зевнул, то ли намерянно эту пакость заложил ради экономии 40ка строчек описания грамматики...
Y = λf.(λx.f (x x)) (λx.f (x x))

ddn

  • Jr. Member
  • **
  • Сообщений: 59
    • Просмотр профиля
Re: [Oberon-07/11] Странности синтаксиса.
« Ответ #1 : Декабрь 02, 2012, 03:44:32 am »
То есть возможны метки экспорта в блоке деклараций у процедуры.

То ли Вирт просто зевнул, то ли намерянно эту пакость заложил ради экономии 40ка строчек описания грамматики...
Это же только синтаксис. Компиляция не ограничивается проверкой синтаксиса.
Вроде вообще нет четких критериев, какие КС-свойства можно включать в синтаксис, а что относить к семантике.

А что по этому поводу говорит компилятор, игнорирует, выдает ошибку?

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: [Oberon-07/11] Странности синтаксиса.
« Ответ #2 : Декабрь 02, 2012, 03:47:51 am »
То ли Вирт просто зевнул, то ли намерянно эту пакость заложил ради экономии 40ка строчек описания грамматики...

Я думаю эта странность подпадает под "because it is derivable from stated rules of the language" (с). А уж разработчик компилятора сам решит, где ему эту странность проще обработать - непосредственно в EBNF или вообще в бакенде.

ddn

  • Jr. Member
  • **
  • Сообщений: 59
    • Просмотр профиля
Re: [Oberon-07/11] Странности синтаксиса.
« Ответ #3 : Декабрь 02, 2012, 04:14:27 am »
Почему странность. Язык запрещает экспорт из функций, это просто не имеет смысла. А на каком этапе проверки, синтаксическом или семантическом, такая программа будет отсеиваться это не важно. Если компилятор запрещает такую программу. Тогда в этом нет никакой пакости - для программиста некомпиляторо-писателя.

Если разрешает, то компилятор должен игнорировать эти метки в процедурах. Тогда это семантическая перегрузка оператора "*", в модуле она экспорт, а в процедуре - игнорирование. Тогда метка в процедурах это семантически незначимое излишество языка, как комментарии, и в этом будет странность. Тогда это противоречит сложившемуся представлению об "*" как метке экспорта, и в этом тоже будет странность. Хотя с точки зрения формальных спецификаций языка никаких странностей нет.


valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: [Oberon-07/11] Странности синтаксиса.
« Ответ #4 : Декабрь 02, 2012, 01:12:13 pm »
То ли Вирт просто зевнул, то ли намерянно эту пакость заложил ради экономии 40ка строчек описания грамматики...

Я думаю эта странность подпадает под "because it is derivable from stated rules of the language" (с). А уж разработчик компилятора сам решит, где ему эту странность проще обработать - непосредственно в EBNF или вообще в бакенде.
Непосредственно в EBNF не выйдет, потому как раз с точки зрения Виртовской EBNF эти звездочки можно расставлять везде, так что грамматику придется менять, и она уже не будет соответствовать референсной грамматике Оберона.

Меня поразило, что эта мелочь легко в EBNF может быть разрулена (язык из за этого НЕ СТАНОВИТСЯ контекстно-зависимым). Но Вирт не разрулил. Это похоже на элементарную ошибку из за желания сократить описание грамматики.

Я даже не знаю с чем это сравнить... Ну, это все равно что если бы строковые литералы можно было бы объявлять со знаком. Например  +"hello" и там -"hello".

В общем, формальное описание даже грамматики языка у Вирта нифига не формально и содержит явные ошибки.
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: [Oberon-07/11] Странности синтаксиса.
« Ответ #5 : Декабрь 02, 2012, 01:13:13 pm »
То есть возможны метки экспорта в блоке деклараций у процедуры.

То ли Вирт просто зевнул, то ли намерянно эту пакость заложил ради экономии 40ка строчек описания грамматики...
Это же только синтаксис. Компиляция не ограничивается проверкой синтаксиса.
Вроде вообще нет четких критериев, какие КС-свойства можно включать в синтаксис, а что относить к семантике.

А что по этому поводу говорит компилятор, игнорирует, выдает ошибку?
Эмм.. Какой компилятор? Референсного компилятора этого Оберона вроде нет, ну или он простым смертным не доступен.
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: [Oberon-07/11] Странности синтаксиса.
« Ответ #6 : Декабрь 02, 2012, 01:29:47 pm »
Почему странность. Язык запрещает экспорт из функций, это просто не имеет смысла.
Это могло бы иметь смысл. Например можно было бы ЯВНО указывать какие локальные переменные/типы и так далее доступны вложенным процедурам. Это улучшило бы читабельность (но несколько нарушило бы стройность языка).

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

Тогда это противоречит сложившемуся представлению об "*" как метке экспорта, и в этом тоже будет странность.
В language report'e нет упоминаний о сложившихся представлениях.
Y = λf.(λx.f (x x)) (λx.f (x x))

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: [Oberon-07/11] Странности синтаксиса.
« Ответ #7 : Декабрь 03, 2012, 04:34:23 am »
Непосредственно в EBNF не выйдет, потому как раз с точки зрения Виртовской EBNF эти звездочки можно расставлять везде, так что грамматику придется менять, и она уже не будет соответствовать референсной грамматике Оберона.

Я имел ввиду, что Вирт действительно мог схалявить с описанием в EBNF, потому что без дополнительных оговорок (EEBNF) действительно пришлось бы много копипастить в доке. Причем смысла в этом все равно никакого - компиляторостроителю может оказаться проще обработать эту ситуацию не на уровне EBNF, а чуть выше (даже если представть, что у него там DSL, который позволяеть такое делать с EBNF без копипаста).