OberonCore
https://forum.oberoncore.ru/

B40: CASE не до конца совмещает прилегающие отрезки?
https://forum.oberoncore.ru/viewtopic.php?f=116&t=6184
Страница 1 из 1

Автор:  Евгений Темиргалеев [ Среда, 29 Ноябрь, 2017 17:43 ]
Заголовок сообщения:  B40: CASE не до конца совмещает прилегающие отрезки?

Товарищи, если этот вопрос ещё не обсуждался, посмотрите DevCPDump от этой процедуры в своих сборках.
Код:
(*"DevCompiler.CompileOpt('@')"*)
MODULE Mod;
   PROCEDURE UrlChar2 (ch: CHAR): BOOLEAN;
      VAR   res: BOOLEAN;
   BEGIN
      CASE ch OF
      | "a".."z", "A".."Z", "0".."9", ";", "/", "?", ":", "@", "=", "&", "$", "-", "_", ".", "+", "!", "*", "'", "(", ")", ",", '"', "#", "%":
         res := TRUE
      ELSE
         res := FALSE
      END;
      RETURN res
   END UrlChar2;
END Mod.

Код:
MODULE Mod


   PROCEDURE UrlChar2
      VAR ch: CHAR
      VAR res: BOOLEAN
   BEGIN
      CASE ch OF
      | 33..35, 36..37, 38..41, 42..44, 45..46, 47..58, 59, 61, 63..64, 65..90, 95, 97..122:
         res := TRUE;
      ELSE
         res := FALSE;
      END;
      RETURN (res);
   END UrlChar2

BEGIN
CLOSE
END Mod

Автор:  Rifat [ Среда, 29 Ноябрь, 2017 18:13 ]
Заголовок сообщения:  Re: CASE не до конца совмещает прилегающие отрезки?

Если CASE реализуется как массив, в которых содержится адрес кода, то на производительности это не должно никак сказываться. Выборка за O(1) должна делаться.

Автор:  Евгений Темиргалеев [ Среда, 29 Ноябрь, 2017 18:14 ]
Заголовок сообщения:  Re: CASE не до конца совмещает прилегающие отрезки?

Прилегающие отрезки A и B склеиваются. Результат может прилегать к следующему отрезку -- это склеивание не выполняется.
Код:
(*^Q"DevCompiler.CompileOpt('@')"*)
MODULE Mod;
   PROCEDURE Proc (ch: CHAR);
   BEGIN
      CASE ch OF
      | "A", "C", "B":
      ELSE
      END;
   END Proc;
END Mod.

MODULE Mod

   PROCEDURE Proc
      VAR ch: CHAR
   BEGIN
      CASE ch OF
      | 65..66, 67:
      END;
   END Proc

BEGIN
CLOSE
END Mod

Автор:  Евгений Темиргалеев [ Среда, 29 Ноябрь, 2017 18:16 ]
Заголовок сообщения:  Re: CASE не до конца совмещает прилегающие отрезки?

Rifat писал(а):
Если CASE реализуется как массив, в которых содержится адрес кода, то на производительности это не должно никак сказываться. Выборка за O(1) должна делаться.

Так делается, не во всех случаях.

Но вопрос-то в причине, а не в том, что медленно работает.

Автор:  Kemet [ Среда, 29 Ноябрь, 2017 18:22 ]
Заголовок сообщения:  Re: CASE не до конца совмещает прилегающие отрезки?

это оптимизатор должен делать

Автор:  Rifat [ Среда, 29 Ноябрь, 2017 18:59 ]
Заголовок сообщения:  Re: CASE не до конца совмещает прилегающие отрезки?

Причина в том, что так не было задумано или же было задумано, но неправильно реализовано. Всё просто)

Автор:  Евгений Темиргалеев [ Четверг, 30 Ноябрь, 2017 16:45 ]
Заголовок сообщения:  Re: CASE не до конца совмещает прилегающие отрезки?

Евгений Темиргалеев писал(а):
Прилегающие отрезки A и B склеиваются. Результат может прилегать к следующему отрезку -- это склеивание не выполняется.
При добавлении нового отрезка (не пересекается с существующими) в список/дерево он объединяется с одним из имеющихся, если прилегает к нему.
[a, A - 1] -> [A, B] ---> [a, B] (1)
[B + 1, b] -> [A, B] ---> [A, b] (2)
После объединения новый отрезок может достичь соседнего с "выросшего" конца, и должен быть объединён с ним, что не выполняется. Случай (2):
[B + 1, C - 1] -> [A, B] [C, D] ---> [A, C - 1] [C, D] ---> [A, D]

Результат для процедуры UrlChar2 (строки дампа):
Код:
      CASE ch OF
      | 33..35, 36..37, 38..41, 42..44, 45..46, 47..58, 59, 61, 63..64, 65..90, 95, 97..122:

      CASE ch OF
      | 33..59, 61, 63..90, 95, 97..122:
Полное описание исправления в дельте.

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