OberonCore
https://forum.oberoncore.ru/

Compiler Construction на русском
https://forum.oberoncore.ru/viewtopic.php?f=80&t=730
Страница 2 из 3

Автор:  PGR [ Понедельник, 12 Ноябрь, 2007 03:04 ]
Заголовок сообщения:  Re: Compiler Construction на русском

GUEST писал(а):
Всё там в порядке с унарными операциями. Как и у всех.

В порядке, но унарный минус не относится к операциям :mrgreen:
Oberon Language Report писал(а):
The syntax of expressions distinguishes between four classes of operators with different precedences (binding strengths). The operator ~ has the highest precedence, followed by multiplication operators, addition operators, and relations. Operators of the same precedence associate from left to right.

Автор:  Евгений Темиргалеев [ Понедельник, 12 Ноябрь, 2007 10:33 ]
Заголовок сообщения:  Re: Compiler Construction на русском

PGR писал(а):
GUEST писал(а):
Всё там в порядке с унарными операциями. Как и у всех.

В порядке, но унарный минус не относится к операциям :mrgreen:

Вот вот. Там, у кого в порядке можно написать так:
Код:
-------------------------------x + ++++++++++++++++++++++++++++++x

В Обероне КП нет унарных + -, есть возможность указать + - в начале выражения:
Код:
Expr    =   SimpleExpr [Relation SimpleExpr].
SimpleExpr   =   ["+" | "-"] Term {AddOp Term}.
Term    =   Factor {MulOp Factor}.
Factor    =   "(" Expr ")" | ... .

Такие правила требуют записи + - как в математике:
Код:
-5 + (-x), но не -5 + -x

Автор:  AVC [ Понедельник, 12 Ноябрь, 2007 13:28 ]
Заголовок сообщения:  Re: Compiler Construction на русском

GUEST писал(а):
AVC писал(а):
[NB в Обероне нет трактовки минуса как унарной операции]
Всё там в порядке с унарными операциями. Как и у всех.

Я имел в виду (прежде всего), что у "унарного" минуса нет особого (более высокого, чем у "бинарного") приоритета. Вот простой подтверждающий пример:
Код:
MODULE AvcUn;
   IMPORT Log;
   PROCEDURE Do*; (* (!) AvcUn.Do *)
   BEGIN
      Log.Int(-3 DIV 2); Log.Int((-3) DIV 2); Log.Int(-(3 DIV 2)); Log.Ln
   END Do;
END AvcUn.

Т.е. в выражении -3 DIV 2 не -3 делится на 2, а сначала 3 делится на 2, а затем полученное частное вычитается из нуля (в полном соответствии с приоритетами обероновских операций: у мультипликативных операций приоритет выше).

Автор:  AVC [ Понедельник, 12 Ноябрь, 2007 13:39 ]
Заголовок сообщения:  Re: Compiler Construction на русском

kreol писал(а):
AVC писал(а):
Насколько я понимаю, речь идет о выражении в грамматике уровней приоритетов операций...

Спасибо! Теперь стало гораздо проще читать :D

Если ответ хотя бы немного помог, спрашивайте дальше! :)

Автор:  PGR [ Понедельник, 12 Ноябрь, 2007 14:51 ]
Заголовок сообщения:  Re: Compiler Construction на русском

Евгений Темиргалеев писал(а):
Вот вот. Там, у кого в порядке можно написать так:
Код:
-------------------------------x + ++++++++++++++++++++++++++++++x

Нельзя

Автор:  AVC [ Понедельник, 12 Ноябрь, 2007 15:14 ]
Заголовок сообщения:  Re: Compiler Construction на русском

PGR писал(а):
Евгений Темиргалеев писал(а):
Вот вот. Там, у кого в порядке можно написать так:
Код:
-------------------------------x + ++++++++++++++++++++++++++++++x

Нельзя
Верно, так нельзя. (Результат инкремента уже не есть lvalue.)
А вот немного "скромнее" написать можно:
Код:
x+++x
или так
Код:
x+++x++
или даже
Код:
x+++ + + + + + + ++x

Автор:  PGR [ Понедельник, 12 Ноябрь, 2007 15:58 ]
Заголовок сообщения:  Re: Compiler Construction на русском

AVC писал(а):
Верно, так нельзя. (Результат инкремента уже не есть lvalue.)

Здесь проблема не в декременте, а именно в унарном отрицании.
Если исправить на
Код:
- ------------------------------x
, то будет работать.

Автор:  AVC [ Понедельник, 12 Ноябрь, 2007 16:14 ]
Заголовок сообщения:  Re: Compiler Construction на русском

PGR писал(а):
AVC писал(а):
Верно, так нельзя. (Результат инкремента уже не есть lvalue.)

Здесь проблема не в декременте, а именно в унарном отрицании.

Что касается унарного минуса, то его приоритет в некоторых языках отличается от приоритета бинарного брата и даже может быть выше, чем у мультипликативных операций. Например, в языке Си:
K&R, 2.5 писал(а):
The binary + and - operators have the same precedence, which is lower than the precedence of
*, / and %, which is in turn lower than unary + and -.
См. также таблицу в K&R, 2.12. Там у унарных + и - 2-й уровень приоритета, а у бинарных -- 4-й.
Когда я говорил об отсутствии в Обероне "трактовки" минуса как унарного (возможно, это неудачное выражение), я имел в виду, что в нем нет таких "тонкостей".

Автор:  PGR [ Понедельник, 12 Ноябрь, 2007 16:28 ]
Заголовок сообщения:  Re: Compiler Construction на русском

-------------------------------x компилятором понимается, как -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -x и выполняется в соответствии с приоритетами сначала унарный минус, результатом этого является выражение, а не lvalue, которым дожен быть аргумент декремента. Здесь и возникает ошибка.

Автор:  Info21 [ Понедельник, 12 Ноябрь, 2007 16:50 ]
Заголовок сообщения:  Re: Compiler Construction на русском

Борис Валерьевич, может, часть сообщений отсюда перенести в ветку насчет почему нельзя использовать С в начальных курсах? :)

Автор:  Евгений Темиргалеев [ Понедельник, 12 Ноябрь, 2007 17:53 ]
Заголовок сообщения:  Re: Compiler Construction на русском

PGR писал(а):
Евгений Темиргалеев писал(а):
Вот вот. Там, у кого в порядке можно написать так:
Код:
-------------------------------x + ++++++++++++++++++++++++++++++x

Нельзя
Поставьте пробелы везде между + - и будет можно. Я имел ввиду префиксные +-, а про инкремент/декремент совсем забыл :lol:
AVC писал(а):
Результат инкремента уже не есть lvalue...
Если я еще не совсем забыл Си :), то результат постинкремента не есть lvalue.

Автор:  PGR [ Понедельник, 12 Ноябрь, 2007 18:35 ]
Заголовок сообщения:  Re: Compiler Construction на русском

Евгений Темиргалеев писал(а):
Поставьте пробелы везде между + - и будет можно. Я имел ввиду префиксные +-, а про инкремент/декремент совсем забыл :lol:

Ну тогда и в Обероне можно
Код:
a := ~~~~~~~~~~~~~~~~b & ~~~~~~~~~~c;

Пробелов добавить по вкусу :lol:

Автор:  Сергей Оборотов [ Понедельник, 12 Ноябрь, 2007 19:27 ]
Заголовок сообщения:  О приоритетах

PGR писал(а):
GUEST писал(а):
Всё там в порядке с унарными операциями. Как и у всех.

В порядке, но унарный минус не относится к операциям :mrgreen:
Не относится. Это её знак.
AVC писал(а):
Когда я говорил об отсутствии в Обероне "трактовки" минуса как унарного (возможно, это неудачное выражение), я имел в виду, что в нем нет таких "тонкостей".
Мне кажется, что если писать что думаешь, то будет больше порядка с извлечением смысла высказываний собеседниками по ходу дела.Кстати, понять что именно хочется знать вопрошавшему означает наполовину решить его вопрос.

Автор:  AVC [ Понедельник, 12 Ноябрь, 2007 23:52 ]
Заголовок сообщения:  Re: Compiler Construction на русском

Евгений Темиргалеев писал(а):
AVC писал(а):
Результат инкремента уже не есть lvalue...
Если я еще не совсем забыл Си :), то результат постинкремента не есть lvalue.

А насчет ++x есть сомнения?
Давайте проверим. Напишем
Код:
int x = 0;
++x = 2;
и подсунем это компилятору Си. :)
Так что... завидую! :)

Автор:  AVC [ Понедельник, 12 Ноябрь, 2007 23:56 ]
Заголовок сообщения:  Re: О приоритетах

GUEST писал(а):
Мне кажется, что если писать что думаешь, то будет больше порядка с извлечением смысла высказываний собеседниками по ходу дела.Кстати, понять что именно хочется знать вопрошавшему означает наполовину решить его вопрос.

Писать, что думаешь, не так уж и просто.
Надо же еще слова подобрать. :)
Я стараюсь, но получается не всегда.

Автор:  Info21 [ Вторник, 13 Ноябрь, 2007 00:05 ]
Заголовок сообщения:  Re: О приоритетах

AVC писал(а):
GUEST писал(а):
Мне кажется, что если писать что думаешь, то будет больше порядка ...

Писать, что думаешь, не так уж и просто.
Надо же еще слова подобрать. :)
Я стараюсь, но получается не всегда.

А у меня не всегда получается понять, что же из <i>этого</i> я на самом деле думаю... 8(

Автор:  AVC [ Вторник, 13 Ноябрь, 2007 00:24 ]
Заголовок сообщения:  Re: Compiler Construction на русском

PGR писал(а):
Евгений Темиргалеев писал(а):
Поставьте пробелы везде между + - и будет можно. Я имел ввиду префиксные +-, а про инкремент/декремент совсем забыл :lol:

Ну тогда и в Обероне можно
Код:
a := ~~~~~~~~~~~~~~~~b & ~~~~~~~~~~c;

Пробелов добавить по вкусу :lol:

Честно говоря, думаю, что в отношении ~ Вирт просто не досмотрел. :)
А может, он не захотел усложнять грамматику ради устранения совершенно безобидного исключения из правил. (По сути, ~ есть единственная "всамделишная" унарная операция в Обероне.)

Автор:  kreol [ Вторник, 13 Ноябрь, 2007 00:40 ]
Заголовок сообщения:  Re: Compiler Construction на русском

AVC писал(а):
Если ответ хотя бы немного помог, спрашивайте дальше! :)

Ну пока что из того, что читаю, всё более менее понятно (не сразу, но после 5-7-ого прочтения точно :D ). Хотя я медленно продвигаюсь - в день максимум могу уделить времени час-полтора. Так сказать как сказку на ночь :) К тому же приходится многие вещи переосмысливать, как это было с factor. Но основную тенденцию докумнета вроде бы понял. Если что, обязательно спрошу, спасибо =)
AVC писал(а):
...или даже
Код:
x+++ + + + + + + ++x

Недавно как раз разбирался с классической "заморочкой" Си (не помню, где её увидел, может быть даже здесь, извините за дублирование, если это так):
Код:
i = 1;
i += i++ + ++i;
i == ?

и с её продвинутым вариантом :D :
Код:
i= i++ + ++i + i++ + ++i + i++ + ++i + i++ + ++i;

И ведь действительно так пишут, в самых настоящий программах. А потом лазят по отладчикам...

Автор:  Сергей Оборотов [ Вторник, 13 Ноябрь, 2007 05:58 ]
Заголовок сообщения:  Действующее описание грамматики.

AVC писал(а):
А может, он не захотел усложнять грамматику ради устранения совершенно безобидного исключения из правил. (По сути, ~ есть единственная "всамделишная" унарная операция в Обероне.)
Суть грамматики в её описании. Суть того, что хотел считать операцией Вирт - личное дело Вирта.

Автор:  AVC [ Вторник, 13 Ноябрь, 2007 08:02 ]
Заголовок сообщения:  Re: Действующее описание грамматики.

GUEST писал(а):
AVC писал(а):
А может, он не захотел усложнять грамматику ради устранения совершенно безобидного исключения из правил. (По сути, ~ есть единственная "всамделишная" унарная операция в Обероне.)
Суть грамматики в её описании. Суть того, что хотел считать операцией Вирт - личное дело Вирта.

Допустим. А что хотели сказать Вы? :)
(Просто мне кажется, Вы с чем-то не согласны. Если так, то, пожалуйста, критикуйте, не стесняйтесь. :) )

Страница 2 из 3 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/