Oberon space
General Category => Общий раздел => Тема начата: 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. То есть знак минус рассматривается не как часть отрицательного числа, а как математическая операция над неотрицательным числом?!
-
Правильно ли я понимаю, что отрицательные числа в Обероне не включены в определение number?
Ага. Поэтому, например, нельзя использовать отрицательные числа в CASE.
-
Тогда что должно дать в результате выражение
-10 DIV 3
-
Тогда что должно дать в результате выражение
-10 DIV 3
-10 DIV 3 = 0 - (10 DIV 3)
-
Тогда что должно дать в результате выражение
-10 DIV 3
-10 DIV 3 = 0 - (10 DIV 3)
Это исходя из какого пункта репорта?
-
Тогда что должно дать в результате выражение
-10 DIV 3
-10 DIV 3 = 0 - (10 DIV 3)
Это исходя из какого пункта репорта?
Из синтаксиса, получается.
-
Тогда что должно дать в результате выражение
-10 DIV 3
-10 DIV 3 = 0 - (10 DIV 3)
Это исходя из какого пункта репорта?
Репорты Оберон-2 и КП, п. 8.2
-
Тогда что должно дать в результате выражение
-10 DIV 3
-10 DIV 3 = 0 - (10 DIV 3)
Это исходя из какого пункта репорта?
Репорты Оберон-2 и КП, п. 8.2
Про эти языки в этой теме речь и не шла. С тем же успехом можно ссылаться на стандарт С++
-
Тогда что должно дать в результате выражение
-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.
с учётом приоритетов операций.
Учитывая, что Оберон формально не описан, приходится додумывать...
-
Репорты Оберон-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 относится к мультипликативным операциям (см. в этом же пункте далее).
-
Правильно ли я понимаю, что отрицательные числа в Обероне не включены в определение number?
Ага. Поэтому, например, нельзя использовать отрицательные числа в CASE.
Исходя из этого, OberonJs на соответствует описанию языка Оберон?
Т.к. условие
( (-5) DIV 3 ) # ( -5 DIV 3 )
не соблюдается.
-
Исходя из этого, OberonJs на соответствует описанию языка Оберон?
Т.к. условие
( (-5) DIV 3 ) # ( -5 DIV 3 )
не соблюдается.
В языке Оберон DIV и MOD вообще не определены для отрицательных операндов. Даже в Оберон-2. Только в КП такое определение есть.
-
Нет, ошибаюсь, не определены только для отрицательного делителя.
-
Исходя из этого, OberonJs на соответствует описанию языка Оберон?
Он соответствует виртовскому репорту от 1.10.2013. В моей интерпретации (и с помощью Алексея).
Т.к. условие
( (-5) DIV 3 ) # ( -5 DIV 3 )
не соблюдается.
Приоритет унарных операций у Вирта не определен. Согласно грамматике унарный минуc применяется "после" DIV (в отличие, например, от унарного "~"). В результате приоритет получается очень странный. Впрочем, например, приоритет логических операций у Вирта тоже странный.
Я бы сказал, что надо сделать так как в референсном компиляторе Вирта. Алексей нам скажет :)
-
Правильно ли я понимаю, что отрицательные числа в Обероне не включены в определение 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.