OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 15 Декабрь, 2017 20:45

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
 Заголовок сообщения: 19: WITH ELSE END
СообщениеДобавлено: Четверг, 10 Май, 2007 12:51 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4476
Откуда: Россия, Орёл
viewtopic.php?p=4664#p4664
Wlad писал(а):
...
WITH END

но это - гарантированный эксэпшн, потому, что, по логике, не один из вариантов не подошёл, а ELSE - тоже нету... :о)
Мне интересно, это прокатывает на компиляции? (Я сегодня только вечером рц5 намереваюсь скачать...)

Грамматически правильно, согласно синтаксису в документации к 1.5. Однако, ничего не происходит. Логика, возможно, в том, что раз нету никаких вариантов, то и нет ошибки в том, что ни однин не подошел. Хотя смысла в ентой конструкции не видать. Как и в
Код:
WITH ELSE END

Однако, последняя срубает компилятор ББ1.5. Как я понял, в кодогенераторе не находится первая последовательность операторов (которая как написал Трурль, в ОО2 является обязательной) и этот вариант не предусмотрен.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 10 Май, 2007 12:59 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2284
Откуда: Россия, Санкт-Петербург
Евгений Темиргалеев писал(а):
Код:
WITH END
Грамматически правильно, согласно синтаксису в документации к 1.5. Однако, ничего не происходит.

У меня происходит трэп "invalid WITH", как и должно быть в таких случаях (BB1.5).
Евгений Темиргалеев писал(а):
Код:
WITH ELSE END

... срубает компилятор ББ1.5. Как я понял, в кодогенераторе не находится первая последовательность операторов (которая как написал Трурль, в ОО2 является обязательной) и этот вариант не предусмотрен.

"NIL dereference (read)". Да, компилятор такого не ожидает... : )


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 10 Май, 2007 13:43 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4476
Откуда: Россия, Орёл
Александр Ильин писал(а):
Евгений Темиргалеев писал(а):
Код:
WITH END
Грамматически правильно, согласно синтаксису в документации к 1.5. Однако, ничего не происходит.

У меня происходит трэп "invalid WITH", как и должно быть в таких случаях (BB1.5).

Верно, все верно. Я забыл выгрузить старую версию модуля :oops:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: WITH ELSE END
СообщениеДобавлено: Четверг, 10 Май, 2007 15:03 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4476
Откуда: Россия, Орёл
Подредактировал фронт-енд компилятора. Вроде ошибка исправилась. Код на WITH ELSE END не генерируется. Делал все на основе общих знаний по структуре компилятора OO2 и интуиции :), так что... в общем прошу опробовать тех, у кого найдется время и сказать что получится.
Код:
MODULE DevCPP;
...
   PROCEDURE StatSeq(VAR stat: DevCPT.Node);
   ...
      ELSIF sym = with THEN
      ...
         IF x # NIL THEN (* new *)
            DevCPB.Construct(Nwith, x, s)
         END;
         CheckSym(end);
         IF x # NIL THEN (* new *)
            IF e THEN x.subcl := 1 END
         END;
      ELSIF sym = exit THEN
      ...
END DevCPP.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 10 Май, 2007 17:05 

Зарегистрирован: Понедельник, 29 Январь, 2007 19:00
Сообщения: 370
Откуда: Украина, Запорожье
Александр Ильин писал(а):
"NIL dereference (read)". Да, компилятор такого не ожидает... : )


Так это ж баг в компиляторе. По БНФ такое допустимо. Надо в OM Inc. сообщить


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Баг в компиляторе ББ
СообщениеДобавлено: Понедельник, 11 Октябрь, 2010 20:47 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2448
Откуда: Россия, Ярославль
Используемая версия: ББ 1.6 rc6

При компиляции подобной конструкции WITH:
Код:
MODULE PrivTestBug;

   PROCEDURE Init*;
   BEGIN
      WITH
      
      ELSE END;
   END Init;
   
BEGIN
   Init;
END PrivTestBug.


имеем тряп:
Код:
NIL dereference (read)

 DevCPV486.CondStat   [00004AF2H]
   .cond   DevCPT.Node   NIL
   .else   INTEGER   0
   .end   INTEGER   0
   .hint   INTEGER   2287864
   .if   DevCPT.Node   NIL
   .last   DevCPT.Node   NIL
   .lcond   DevCPT.Node   NIL
   .local   INTEGER   0
   .x   DevCPL486.Item   fields
 DevCPV486.IfStat   [00004D95H]
   .else   INTEGER   2288016
   .end   INTEGER   0
   .hint   INTEGER   2287864
   .if   DevCPT.Node   NIL
   .last   DevCPT.Node   NIL
   .local   INTEGER   0
   .n   DevCPT.Node   [016559D0H]
   .withtrap   BOOLEAN   FALSE
 DevCPV486.stat   [000066CAH]
   .end   INTEGER   0
   .fact   INTEGER   0
   .local   INTEGER   0
   .loop   INTEGER   0
   .n   DevCPT.Node   [016559D0H]
   .next   INTEGER   0
   .nofel   DevCPL486.Item   fields
   .prevExit   INTEGER   0
   .sx   INTEGER   0
   .sz   INTEGER   0
   .ux   SET   {}
   .uz   SET   {}
   .x   DevCPL486.Item   fields
   .y   DevCPL486.Item   fields
 DevCPV486.procs   [00006B1BH]
   .ch   SHORTCHAR   "d"
   .end   INTEGER   0
   .i   INTEGER   1690639720
   .j   INTEGER   0
   .n   DevCPT.Node   [01657970H]
   .name   DevCPT.Name   ""   ...
   .obj   DevCPT.Object   NIL
   .proc   DevCPT.Object   [015C6E10H]
   .useFpu   BOOLEAN   FALSE
 DevCPV486.Module   [00006F7AH]
   .aAd   INTEGER   2288360
   .end   INTEGER   10
   .n   DevCPT.Node   [0164C120H]
   .name   DevCPT.Name   "$$"   ...
   .obj   DevCPT.Object   NIL
   .p   DevCPT.Object   NIL
   .prog   DevCPT.Node   [016AF6D0H]
   .rAd   INTEGER   2288408
   .typ   DevCPT.Struct   NIL
   .useFpu   BOOLEAN   FALSE
 DevCompiler.Module   [000000D9H]
   .error   BOOLEAN   FALSE
   .ext   BOOLEAN   FALSE
   .log   TextModels.Model   [016A58F0H]
   .new   BOOLEAN   TRUE
   .opt   SET   {0, 2..6, 8}
   .p   DevCPT.Node   [016AF6D0H]
   .source   TextModels.Reader   [015C67C0H]
 DevCompiler.Do   [00000418H]
   .beg   INTEGER   0
   .error   BOOLEAN   FALSE
   .log   TextModels.Model   [016A58F0H]
   .opt   SET   {0, 2..6, 8}
   .s   TextMappers.Scanner   fields
   .source   TextModels.Model   [015C85E0H]
 DevCompiler.CompileAndUnload   [00000776H]
   .error   BOOLEAN   FALSE
   .mod   POINTER   NIL
   .n   ARRAY 256 OF CHAR   "ઘ懏"   ...
   .t   TextModels.Model   [015C85E0H]


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: WITH ELSE END
СообщениеДобавлено: Вторник, 12 Октябрь, 2010 11:01 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Евгений Темиргалеев писал(а):
Код на WITH ELSE END не генерируется.
Но это противоречит генеральной линии партии :roll:. Компилятор не должен оптимизировать то, что может оптимизировать программист. В частности, пустой блок WITH ELSE END программист может убрать сам. А уж если программист его не убрал, значит он ему зачем-то понадобился. Например, программист пожелал измерить скорость работы холостого блока.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: WITH ELSE END
СообщениеДобавлено: Вторник, 12 Октябрь, 2010 11:36 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4476
Откуда: Россия, Орёл
Это предотвращение трэпа, про который выше написал Пётр.

Сам с этим сталкивался и где-то писал, но не нашел где...

Upd: нашел и отрезал сюда... тема старая, авось.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 19: WITH ELSE END
СообщениеДобавлено: Понедельник, 04 Декабрь, 2017 15:13 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4476
Откуда: Россия, Орёл
Допили в Центре: https://redmine.blackboxframework.org/issues/125
---
К вопросу выше о "скорости работы пустого блока". Генерировать вообще нечего по этой записи.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 19: WITH ELSE END
СообщениеДобавлено: Вторник, 05 Декабрь, 2017 10:17 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1019
У меня такое впечатление, что вся эта история с пустым with - результат опечатки в документации.
Если сравнить описание КП и О-2, то видно, что разделы 9.11 With Statements отличаются только парой скобочек
Цитата:
WithStatement = WITH [ Guard DO StatementSequence ] {"|" Guard DO StatementSequence} [ELSE StatementSequence] END.

Буквами написано то же самое.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2017, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB