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). Верно, все верно. Я забыл выгрузить старую версию модуля |
Автор: | Евгений Темиргалеев [ Четверг, 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 не генерируется. Но это противоречит генеральной линии партии . Компилятор не должен оптимизировать то, что может оптимизировать программист. В частности, пустой блок 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/ |