Oberon space

General Category => Общий раздел => Тема начата: Romiras от Ноябрь 23, 2014, 01:46:30 pm

Название: Числа в Обероне
Отправлено: Romiras от Ноябрь 23, 2014, 01:46:30 pm
Смотрю в отчёт Оберона 07 ревизии 10.3.2014 (http://www.inf.ethz.ch/personal/wirth/Oberon/Oberon07.Report.pdf)

integer = digit {digit} | digit {hexDigit} "H".
real = digit {digit} "." {digit} [ScaleFactor].
ScaleFactor = ("E" | “D”) ["+" | "-"] digit {digit}.
number = integer | real.
...
expression = SimpleExpression [relation SimpleExpression].
relation = "=" | "#" | "<" | "<=" | ">" | ">=" | IN | IS.
SimpleExpression = ["+" | "-"] term {AddOperator term}.
AddOperator = "+" | "-" | OR.
term = factor {MulOperator factor}.
MulOperator = "*" | "/" | DIV | MOD | "&".
factor = number | string | NIL | TRUE | FALSE |
 set | designator [ActualParameters] | "(" expression ")" | "~" factor.

Правильно ли я понимаю, что отрицательные числа в Обероне не включены в определение number?
Обратите внимание на SimpleExpression. То есть знак минус рассматривается не как часть отрицательного числа, а как математическая операция над неотрицательным числом?!
Название: Re: Числа в Обероне
Отправлено: vlad от Ноябрь 24, 2014, 01:33:18 pm
Правильно ли я понимаю, что отрицательные числа в Обероне не включены в определение number?

Ага. Поэтому, например, нельзя использовать отрицательные числа в CASE.
Название: Re: Числа в Обероне
Отправлено: Romiras от Ноябрь 24, 2014, 08:27:44 pm
Тогда что должно дать в результате выражение
-10 DIV 3
Название: Re: Числа в Обероне
Отправлено: Geniepro от Ноябрь 25, 2014, 04:24:49 am
Тогда что должно дать в результате выражение
-10 DIV 3

-10 DIV 3 = 0 - (10 DIV 3)
Название: Re: Числа в Обероне
Отправлено: valexey_u от Ноябрь 25, 2014, 04:39:09 am
Тогда что должно дать в результате выражение
-10 DIV 3

-10 DIV 3 = 0 - (10 DIV 3)
Это исходя из какого пункта репорта?
Название: Re: Числа в Обероне
Отправлено: Romiras от Ноябрь 25, 2014, 07:23:30 am
Тогда что должно дать в результате выражение
-10 DIV 3

-10 DIV 3 = 0 - (10 DIV 3)
Это исходя из какого пункта репорта?
Из синтаксиса, получается.
Название: Re: Числа в Обероне
Отправлено: igor от Ноябрь 25, 2014, 08:21:53 am
Тогда что должно дать в результате выражение
-10 DIV 3

-10 DIV 3 = 0 - (10 DIV 3)
Это исходя из какого пункта репорта?
Репорты Оберон-2 и КП, п. 8.2
Название: Re: Числа в Обероне
Отправлено: valexey_u от Ноябрь 25, 2014, 11:41:01 pm
Тогда что должно дать в результате выражение
-10 DIV 3

-10 DIV 3 = 0 - (10 DIV 3)
Это исходя из какого пункта репорта?
Репорты Оберон-2 и КП, п. 8.2
Про эти языки в этой теме речь и не шла. С тем же успехом можно ссылаться на стандарт С++
Название: Re: Числа в Обероне
Отправлено: Geniepro от Ноябрь 26, 2014, 04:16:08 am
Тогда что должно дать в результате выражение
-10 DIV 3

-10 DIV 3 = 0 - (10 DIV 3)
Это исходя из какого пункта репорта?

Это исходя из:

SimpleExpression = ["+" | "-"] term {AddOperator term}.
AddOperator = "+" | "-" | OR.
term = factor {MulOperator factor}.
MulOperator = "*" | "/" | DIV | MOD | "&".
factor = number | string | NIL | TRUE | FALSE | set | designator [ActualParameters] | "(" expression ")" | "~" factor.

с учётом приоритетов операций.
Учитывая, что Оберон формально не описан, приходится додумывать...
Название: Re: Числа в Обероне
Отправлено: igor от Ноябрь 26, 2014, 07:12:59 am
Репорты Оберон-2 и КП, п. 8.2
Про эти языки в этой теме речь и не шла. С тем же успехом можно ссылаться на стандарт С++
В этой части в языке никаких изменений нет.
Репорт Оберон-07, рев. 10.3.2014, п.8.2:
Цитировать
The operator ~ has the highest precedence, followed by
multiplication operators, addition operators, and relations. Operators of the same precedence
associate from left to right.
DIV относится к мультипликативным операциям (см. в этом же пункте далее).
Название: Re: Числа в Обероне
Отправлено: Romiras от Ноябрь 26, 2014, 11:52:02 am
Правильно ли я понимаю, что отрицательные числа в Обероне не включены в определение number?

Ага. Поэтому, например, нельзя использовать отрицательные числа в CASE.
Исходя из этого, OberonJs на соответствует описанию языка Оберон?

Т.к. условие
( (-5) DIV 3 ) # ( -5 DIV 3 )не соблюдается.
Название: Re: Числа в Обероне
Отправлено: akron1 от Ноябрь 26, 2014, 03:06:04 pm
Исходя из этого, OberonJs на соответствует описанию языка Оберон?

Т.к. условие
( (-5) DIV 3 ) # ( -5 DIV 3 )не соблюдается.

В языке Оберон DIV и MOD вообще не определены для отрицательных операндов. Даже в Оберон-2. Только в КП такое определение есть.
Название: Re: Числа в Обероне
Отправлено: akron1 от Ноябрь 26, 2014, 03:13:05 pm
Нет, ошибаюсь, не определены только для отрицательного делителя.
Название: Re: Числа в Обероне
Отправлено: vlad от Ноябрь 26, 2014, 06:41:23 pm
Исходя из этого, OberonJs на соответствует описанию языка Оберон?

Он соответствует виртовскому репорту от 1.10.2013. В моей интерпретации (и с помощью Алексея).

Т.к. условие
( (-5) DIV 3 ) # ( -5 DIV 3 )не соблюдается.

Приоритет унарных операций у Вирта не определен. Согласно грамматике унарный минуc применяется "после" DIV (в отличие, например, от унарного "~"). В результате приоритет получается очень странный. Впрочем, например, приоритет логических операций у Вирта тоже странный.

Я бы сказал, что надо сделать так как в референсном компиляторе Вирта. Алексей нам скажет :)
Название: Re: Числа в Обероне
Отправлено: ddn от Декабрь 20, 2014, 05:42:37 pm
Правильно ли я понимаю, что отрицательные числа в Обероне не включены в определение number?
Обратите внимание на SimpleExpression. То есть знак минус рассматривается не как часть отрицательного числа, а как математическая операция над неотрицательным числом?!
Что мешает внести нужные изменения в лексику?

В своей версии Оберона я бы так и сделал, но конечно не стал бы включать знак минуса '-' в числовую лексему. Отрицательные числа можно представлять с помощью суффикса 'M' (minus), в том числе для знака минуса десятичной степени вещественного числа, независимого от знака самого числа, а также добавить INFM вместо -INF. Сначала я предполагал использовать суффикс 'I' (inversion), но для отрицательных вещественных с масштабным множителем это приведет к комбинации букв 'IE' - совершенно незачем рекламировать эту говноподелку мелкософт. Также, пусть это хуже для зрения, я бы заменил десятичную точку на суффикс 'P' (period), тогда все числовые лексемы подобно идентификаторам станут букво-цифровыми, лексика станет более однородной.
integer = (digit {digit} | digit {hexDigit} "H") ["M"].
real = digit {digit} "P" {digit} ["M"] [scaleFactor].
scaleFactor = ("E" | "D") digit {digit} ["M"].
number = integer | real.