OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 11 Август, 2022 15:10

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




Начать новую тему Ответить на тему  [ Сообщений: 310 ]  На страницу Пред.  1 ... 12, 13, 14, 15, 16
Автор Сообщение
СообщениеДобавлено: Понедельник, 14 Март, 2022 00:21 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 483
Откуда: Украина, Днепропетровская обл.
Предлагаю такое исправление.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 14 Март, 2022 19:40 

Зарегистрирован: Вторник, 01 Март, 2011 09:34
Сообщения: 573
Откуда: Москва
Oleg N. Cher писал(а):
Эта ошибка также присутствует в CPfront и в Мульти-Обероне. В Ofront и voc её нет, там такой код просто вызовет ошибку рекурсивного определения.

Я прошу помощи у Дмитрия Викторовича Дагаева, если ему ещё интересна доработка Мульти-Оберона. Тем более, что он уже патчил код, связанный с рекурсивным определением типов.

Код компилируется МультиОбероном, к сожалению, в связи со сменой компа компилятора C нет. Поэтому проверить до конца не могу. В процедуре DefineType у меня есть код.
Код:
IF (obj # NIL) & (Undefined(obj) OR (obj^.linkadr = TEMPORARY_TYPE)) THEN
        ...
   IF (str^.form = fPOINTER) & (str^.base_typ^.comp = CF_ARRAY) THEN
      obj := str.base_typ.strobj;
      IF (obj # NIL) & (obj^.linkadr = RECURSIVE_TYPE) THEN
         obj^.linkadr := TEMPORARY_TYPE;
         DefineType(str^.base_typ);
         obj^.linkadr := RECURSIVE_TYPE;
      END
   END
END

Насколько могу судить, Вы предлагаете аналогичное решение извне DefineType. Возражений против такого не имею.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 16 Март, 2022 00:47 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 483
Откуда: Украина, Днепропетровская обл.
Заинтересованы ли Вы в улучшении совместимости бэк-энда в Си с BlackBox? Я тут заметил, что у нас сломалась (или не работала) компиляция некоторых модулей с рекурсивным определением типов.

Прикладываю эти модули, которые компилируются в BlackBox, но в Мульти-Обероне (бэк-энд в Си) их стоит проверить. Хорошо бы также проверить их компилируемость сишкой.

Когда Вы зайдёте в тупик при определении типа, который ссылается сам на себя, вроде:

Код:
TYPE
  Arr = ARRAY 2 OF POINTER TO Arr;

То я предлагаю в случае определения такого типа подменять тип указателя на самого себя (что не соберётся сишкой) на void*, а потом при разыменовании приводить к нужному типу (для чего детектить тип на присутствие тега RecursiveType):

OPV.design
Код:
-      ELSE OPM.Write(Deref); expr(n^.left, designPrec)
+      ELSE
+         OPM.Write(Deref);
+         IF (n^.typ^.strobj # NIL) & (n^.typ^.strobj^.linkadr = RecursiveType) THEN
+            OPM.Write("("); OPC.Ident(n^.typ^.strobj); OPM.WriteString("*)")
+         END;
+         expr(n^.left, designPrec)

Если рекурсивное определение не слишком дикое (тип массив имеет элементы типа запись, где поля являются массивами этого же типа), то в рекурсивном определении в кольце обязательно есть указатель. И если его нельзя описать в Си через самого себя, то тут сам просится void*. Мне это решение кажется даже в чём-то изящным. Хотя может я что-то упустил.

Дмитрий Викторович, только Вы можете навести в этом порядок. Я конечно пробую, но у меня получается пока не очень — неуклюже и корявенько. Буду пробовать ещё.


Вложения:
Recursive.zip [1.43 КБ]
Скачиваний: 46
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 17 Март, 2022 20:07 

Зарегистрирован: Вторник, 01 Март, 2011 09:34
Сообщения: 573
Откуда: Москва
Понятно, буду смотреть ещё.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 18 Март, 2022 19:31 

Зарегистрирован: Вторник, 01 Март, 2011 09:34
Сообщения: 573
Откуда: Москва
Oleg N. Cher писал(а):
Прикладываю эти модули, которые компилируются в BlackBox, но в Мульти-Обероне (бэк-энд в Си) их стоит проверить. Хорошо бы также проверить их компилируемость сишкой.

Докладываю. Собираются с успешной компиляцией Ex, Ex3, Ex4, Ex7. Не собираются Ex2, Ex5, Ex6, Ex8. Я в один код все объединил.
Код:
      (* Ex.cp + *)
      REx1Rec = RECORD END;
      REx1Ptr = POINTER TO ARRAY OF REx1Rec;
      (* Ex2.cp - *)
      REx2Ptr = POINTER TO ARRAY 3 OF POINTER TO ARRAY 4 OF BOOLEAN;
      (* Ex3.cp + *)
      REx3ArrPtr = POINTER TO REx3Arr;
      REx3Arr = ARRAY 2,3 OF REx3ArrPtr;
      (* Ex4.cp + *)
      REx4ArrPtr = POINTER TO REx4Arr;
      REx4Arr = ARRAY OF REx4ArrPtr;
      (* Ex5.cp - *)
      REx5Arr = ARRAY 2 OF POINTER TO REx5Arr;
      (* Ex6.cp - *)
      REx6ArrPtr = POINTER TO ARRAY OF REx6ArrPtr;
      (* Ex7.cp + *)
      REx7Elem = POINTER TO RECORD
         next: REx7Elem;
         pos: INTEGER;
      END;
      REx7CaseTable = ARRAY 1 OF
           RECORD
            low, high: INTEGER
         END;
      (* Ex8.cp - *)
      REx8Rec0 * = RECORD
      END;
      REx8Arr0 = ARRAY 4 OF REx8Rec0;

   PROCEDURE RExRun;
      VAR a: REx3Arr; p: REx3ArrPtr;
         (*a5: REx5Arr; p5: POINTER TO REx5Arr;*)
   BEGIN
      a := p^;
   END RExRun;
   
   PROCEDURE (VAR r: REx8Rec0) Ex (VAR a: REx8Arr0), NEW;
   BEGIN
   END Ex;

Тесты хорошие. Надо думать над устранением.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 23 Март, 2022 08:32 

Зарегистрирован: Вторник, 01 Март, 2011 09:34
Сообщения: 573
Откуда: Москва
Устранено Ex6. Процедура OmfOPC.DefineType. Старый код закомментирован с пометкой [Ex6].
Код:
            IF obj # NIL THEN (* check for cycles *)
               IF obj^.linkadr = PROCESSING_TYPE THEN
                  IF (str^.form # fPOINTER) OR (str.base_typ.strobj = NIL) (*[Ex6] str^.form # fPOINTER*) THEN
                     obj^.linkadr := RECURSIVE_TYPE
                  END
               ELSE obj^.linkadr := PROCESSING_TYPE
               END
            END ;


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 01 Апрель, 2022 00:16 

Зарегистрирован: Вторник, 22 Май, 2007 15:38
Сообщения: 216
Откуда: Питер
Следующая ошибка.

Код:
MODULE Test;

TYPE
  Rec0 * = RECORD
  END;
  Arr0 = ARRAY 4 OF Rec0;

PROCEDURE (VAR r:Rec0) Ex * (VAR a:Arr0), NEW;
  BEGIN
  END Ex;

END Test.
(этот модуль отличается от предыдущего ошибочного модуля только тем, что процедура Rec0.Ex экспортируется)

Код:
MODULE Main;

IMPORT
  Test;

END Main.


Транслируется в си, но затем не компилируется.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 05 Апрель, 2022 18:32 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 483
Откуда: Украина, Днепропетровская обл.
Дмитрий Дагаев писал(а):
Устранено Ex6. Процедура OmfOPC.DefineType. Старый код закомментирован с пометкой [Ex6].
Код:
IF (str^.form # fPOINTER) OR (str.base_typ.strobj = NIL) (*[Ex6] str^.form # fPOINTER*) THEN
Хорошая правка, устраняет зацикливание. Внёс в Ofront+.

Сейчас пытаюсь разобраться с Ex5 и вклинить определение рекурсивного типа в OPC.DefineType, пока не очень понятно как там всё устроено.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 27 Июнь, 2022 15:56 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 483
Откуда: Украина, Днепропетровская обл.
Торжественно сообщаю, что Ofront+ опять перешёл в статус "все критичные проблемы исправлены". На сей раз серьёзно поправлена обработка определений циклических типов, которая потребовала немало времени, чтобы с этим разобраться.

Дмитрий Викторович, мы с Вами называли такие определения рекурсивными, но по терминологии разработчиков ETH Oberon и BlackBox они называются циклическими. А рекурсивными называются определения вида:
Код:
TYPE Typ = Typ; (* error 58: recursive type definition *)

Получается, что рекурсивные определения типов не имеют смысла, а циклические согласно описания языка Компонентный Паскаль допустимы:
Цитата:
A declaration of a type T containing references to another type T1 may occur at a point where
T1 is still unknown. The declaration of T1 must follow in the same block to which T is local.
Здесь прямо не говорится о циклических определениях, но они и не запрещены.

В связи с чем я изменил константу OPC.RecursiveType на CyclicType.

Итак, сейчас Ofront+ успешно транслирует все примеры, о которых были посты выше, плюс даже такой:

Код:
MODULE Ex111;

TYPE
  Proc = PROCEDURE (b: Proc);

VAR p: Proc;

PROCEDURE Abc (b: Proc); END Abc;

BEGIN
  p := Abc
END Ex111.

А вот если результатом процедуры типа Proc будет Proc, то на таком коде Ofront+ просто выдаст ошибку "not yet implemented":
Код:
TYPE
  Proc = PROCEDURE (): Proc;
Вопрос дискуссионный, но я не знаю как это транслировать в Си. Мы обсудили это в группе по Ofront+ в Telegram и единодушно решили, что польза от этих циклических определений весьма сомнительна.

Да, циклические определения разрешены в Ofront+ только для Компонентного Паскаля.

P.S. Могу посодействовать исправлению этих моментов в МультиОбероне. Напрямую брать моё решение в лоб вряд ли нужно — в Ofront+ работа с массивами устроена несколько иначе, чем в CPfront. Но пока в моей голове свежи все эти моменты, можем заняться, если конечно есть интерес.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 27 Июнь, 2022 21:41 

Зарегистрирован: Вторник, 01 Март, 2011 09:34
Сообщения: 573
Откуда: Москва
Да, Вы правы, RecursiveType оказалось неудачным определением. Очень хорошо, что в Ofront+ эти вопросы закрыты. Циклические определения типов точно нужны, а процедуры через процедуры - экзотика.
Надо внимательно все посмотреть.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 310 ]  На страницу Пред.  1 ... 12, 13, 14, 15, 16

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


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

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


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

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