OberonCore
https://forum.oberoncore.ru/

19: WITH ELSE END
https://forum.oberoncore.ru/viewtopic.php?f=131&t=457
Страница 1 из 1

Автор:  Евгений Темиргалеев [ Четверг, 10 Май, 2007 12:51 ]
Заголовок сообщения:  19: WITH ELSE END

viewtopic.php?p=4664#p4664
Wlad писал(а):
...
WITH END

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

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

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

Автор:  Александр Ильин [ Четверг, 10 Май, 2007 12:59 ]
Заголовок сообщения: 

Евгений Темиргалеев писал(а):
Код:
WITH END
Грамматически правильно, согласно синтаксису в документации к 1.5. Однако, ничего не происходит.

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

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

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

Автор:  Евгений Темиргалеев [ Четверг, 10 Май, 2007 13:43 ]
Заголовок сообщения: 

Александр Ильин писал(а):
Евгений Темиргалеев писал(а):
Код:
WITH END
Грамматически правильно, согласно синтаксису в документации к 1.5. Однако, ничего не происходит.

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

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

Автор:  Евгений Темиргалеев [ Четверг, 10 Май, 2007 15:03 ]
Заголовок сообщения:  WITH ELSE END

Подредактировал фронт-енд компилятора. Вроде ошибка исправилась. Код на 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.

Автор:  PGR [ Четверг, 10 Май, 2007 17:05 ]
Заголовок сообщения: 

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


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

Автор:  Пётр Кушнир [ Понедельник, 11 Октябрь, 2010 20:47 ]
Заголовок сообщения:  Баг в компиляторе ББ

Используемая версия: ББ 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]

Автор:  Сергей Губанов [ Вторник, 12 Октябрь, 2010 11:01 ]
Заголовок сообщения:  Re: WITH ELSE END

Евгений Темиргалеев писал(а):
Код на WITH ELSE END не генерируется.
Но это противоречит генеральной линии партии :roll:. Компилятор не должен оптимизировать то, что может оптимизировать программист. В частности, пустой блок WITH ELSE END программист может убрать сам. А уж если программист его не убрал, значит он ему зачем-то понадобился. Например, программист пожелал измерить скорость работы холостого блока.

Автор:  Евгений Темиргалеев [ Вторник, 12 Октябрь, 2010 11:36 ]
Заголовок сообщения:  Re: WITH ELSE END

Это предотвращение трэпа, про который выше написал Пётр.

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

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

Автор:  Евгений Темиргалеев [ Понедельник, 04 Декабрь, 2017 15:13 ]
Заголовок сообщения:  Re: 19: WITH ELSE END

Допили в Центре: https://redmine.blackboxframework.org/issues/125
---
К вопросу выше о "скорости работы пустого блока". Генерировать вообще нечего по этой записи.

Автор:  Trurl [ Вторник, 05 Декабрь, 2017 10:17 ]
Заголовок сообщения:  Re: 19: WITH ELSE END

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

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

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