OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 29 Март, 2024 00:46

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




Начать новую тему Ответить на тему  [ Сообщений: 332 ]  На страницу Пред.  1 ... 5, 6, 7, 8, 9, 10, 11 ... 17  След.
Автор Сообщение
СообщениеДобавлено: Четверг, 30 Январь, 2020 01:44 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 520
Откуда: Украина, Днепропетровская обл.
Тэкс. Для начала извиняюсь перед Дмитрием Викторовичем. Упомянутые выше правки в Stars действительно не Ваши, а оригинальные. Просто я заглянул в файл OPC вместо CPC, они же там в исходном архиве все в куче. Это отличия реализации Stars в Ofront и CPfront. Так что вопрос снят.

По новой ошибке. Она присутствует и в оригинальном Ofront, и в CPfront. Связана с отловом циклического определения типа. Разберёмся на днях.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 30 Январь, 2020 08:39 
Аватара пользователя

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

Код:
MODULE Ex4;

TYPE
  ArrPtr = POINTER TO Arr;
  Arr = ARRAY OF ArrPtr;

END Ex4.

Ofront и Ofront+ зависают, а CPfront впадает в безконечную рекурсию внутри процедуры CPC.Universal.


Вложения:
Infinite.png
Infinite.png [ 165.92 КБ | Просмотров: 5733 ]
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 30 Январь, 2020 19:02 

Зарегистрирован: Вторник, 01 Март, 2011 09:34
Сообщения: 583
Откуда: Москва
Oleg N. Cher писал(а):
Ofront и Ofront+ зависают, а CPfront впадает в безконечную рекурсию внутри процедуры CPC.Universal.

Снять рекурсию можно, добавив условие typ.comp IN {array, dynArray, record}, но тогда на UniversalArrayName такая же петрушка. Надо аккуратно смотреть, как разрывать этот круг. И да, после этого регрессионные тесты.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 05 Февраль, 2020 14:51 

Зарегистрирован: Вторник, 01 Март, 2011 09:34
Сообщения: 583
Откуда: Москва
Исправлена проблема для бесконечной рекурсии. Модифицированы функции Universal, UniversalArrayName, появились UniversalEx, UniversalArrayNameEx (где определены корректные условия выхода из рекурсии). Также снято сообщение об ошибке OPM.Mark(244, str^.txtpos) в DefineType (может, и зря - у меня нет теста на этот case).
Это - тот самый случай, где по нескольку раз я запускал свои регрессионные тесты, пока не пришел к приемлемому решению.


Вложения:
OPC_Univ.txt [51.71 КБ]
Скачиваний: 296
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 19 Февраль, 2020 20:43 
Аватара пользователя

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

GameHunter, я хотел подождать, что ответит Йозеф Темпл, но он молчит. Судя по идеологии Ofront'а, я так думаю, что он предпочтёт вообще запретить такое рекурсивное определение. Ведь код:
Код:
TYPE ArrPtr = POINTER TO Arr; Arr = ARRAY OF ArrPtr;

это просто чуть замаскированное определение:
Код:
TYPE ArrPtr = POINTER TO ARRAY OF ArrPtr;
Изначально в Ofront'е это циклическое определение типа, и оно запрещено. Есть ещё рекурсивное определение типа, т.е.:
Код:
TYPE Arr = Arr;
И оно тоже запрещено, что логично.

Но BlackBox разрешает такое циклическое определение типа. Мне бы хотелось увидеть практический случай применения такого подхода.

Самое простое, что я могу сделать, просто применить решение Дмитрия Викторовича. Но я ещё думаю. Конечно надо разрешить, хотя бы для совместимости с BlackBox.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 20 Февраль, 2020 14:31 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Ну так страничное дерево, например...
Каждый уровень дерева - Arr.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 21 Февраль, 2020 01:59 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 520
Откуда: Украина, Днепропетровская обл.
Для дерева логичнее использовать указатели на записи, а не на массивы, разве нет?)

Дмитрий Викторович, Ваш фикс не проходит такие тесты:
Код:
MODULE Ex4;

TYPE
  ArrPtr = POINTER TO Arr;
  Arr = ARRAY 2 OF ArrPtr;

END Ex4.
(ловит ошибку 244, хотя если 2 убрать и сделать массив открытым, то компилит)

Код:
MODULE Ex5;

TYPE
  Arr = ARRAY 2 OF POINTER TO Arr;

VAR
  a: Arr;

END Ex5.
(порождает код со static Arr Ex5_a, где Arr не определено)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 21 Февраль, 2020 07:05 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Ну так если рекурсивно можно определять POINTER TO RECORD, то почему же нельзя POINTER TO ARRAY?

Если оборачивать каждый POINTER TO ARRAY в RECORD, то это лишняя косвенность, опять же - доп. поля не всегда нужны.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 11 Март, 2020 08:36 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 520
Откуда: Украина, Днепропетровская обл.
Реализовал в Ofront'е+ возможность вставок из Оберон-процедуры в генерируемый текст на Си в виде комментария специального вида. Сделано, главным образом, для того, чтобы было можно писать код на встроенном в Си-компилятор ассемблере:
Код:
PROCEDURE Code;
BEGIN
(*@
    __asm
        LD A, B
    __endadm;
*)
END Code;
Код:
static void Mod_Code (void)
{
    __asm
        LD A, B
    __endadm;
}

P.S. По рекурсивным определениям: решение Дмитрия Дагаева в репозиторий Ofront+ внедрено в предложенном виде. Пара случаев некорректной отработки таких определений, описанных мной выше, ещё в процессе.


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

Зарегистрирован: Вторник, 01 Март, 2011 09:34
Сообщения: 583
Откуда: Москва
Oleg N. Cher писал(а):
Реализовал в Ofront'е+ возможность вставок из Оберон-процедуры в генерируемый текст на Си в виде комментария специального вида. Сделано, главным образом, для того, чтобы было можно писать код на встроенном в Си-компилятор ассемблере:
Код:
PROCEDURE Code;
BEGIN
(*@
    __asm
        LD A, B
    __endadm;
*)
END Code;
Код:
static void Mod_Code (void)
{
    __asm
        LD A, B
    __endadm;
}

P.S. По рекурсивным определениям: решение Дмитрия Дагаева в репозиторий Ofront+ внедрено в предложенном виде. Пара случаев некорректной отработки таких определений, описанных мной выше, ещё в процессе.

А стандартный механизм кода в Ofront+ через не получался?
Код:
PROCEDURE \[code\] Code* ()
      '__asm
                LD A, B
                __endadm';

Я просто не пробовал.

Про некорректные обработки я помню, обязательно еще посмотрю.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 11 Март, 2020 10:15 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 520
Откуда: Украина, Днепропетровская обл.
Да, в Ofront'е есть такой механизм. Но он весьма ограничен — не понимает многострочных вставок. Есть и другой механизм: опция "-i": include header and body prefix files (Module.h0/.c0), которая добавляет .h0 и .c0-файлы в начало .h и .c-файлов.

Но эта возможность больше для процедурных вставок по месту. Для большей выразительности Си- и асм-вставок, ну и чтобы не плодить лишних файлов.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 29 Март, 2020 03:04 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 520
Откуда: Украина, Днепропетровская обл.
Получилось собрать код на Обероне для игровой приставки Nintendo/NES/Dendy/Famicom. Через компилятор cc65 с помощью Ofront+.

Изображение

Изображение

Подсистема NesDev включена в XDev. В ближайшее время буду её обновлять и наверное даже вынесу в отдельный репозиторий.

Спасибо Shiru за помощь и консультации.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 01 Апрель, 2020 10:39 

Зарегистрирован: Вторник, 01 Март, 2011 09:34
Сообщения: 583
Откуда: Москва
Oleg N. Cher писал(а):
Пара случаев некорректной отработки таких определений, описанных мной выше, ещё в процессе.

Исправил в новой версии для МультиОберона рекурсивные определения типов (прилагается). Более глубокое тестирование показало наличие в старой версии еще проблемы с некорректностью генерации .h - файла: те же тесты при импортировании из другого файла не собирались. Изменения следующие:
1. Расширены константы типов (RECURSIVE_TYPE TEMPORARY_TYPE), вместо безобразия 3+OPG.currFile поставлено MAX_TYPE+OPG.currFile.
2. Изменена обработка в DefineType - и для .h, и для .c. Ошибка 244 заменена на обработчик рекурсивных определений.
3. Изменено условие Undefined с учетом RECURSIVE_TYPE


Вложения:
OPC.txt [51.07 КБ]
Скачиваний: 205
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 07 Май, 2020 05:31 

Зарегистрирован: Вторник, 22 Май, 2007 15:38
Сообщения: 220
Откуда: Питер
Олег, что вы решили по рекурсивным объявлениям массивов - будете реализовывать, или оставите запрет?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 08 Май, 2020 05:50 

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

Код:

MODULE Ex2;

TYPE
  R00 * = RECORD
  END;

END Ex2.

MODULE Ex1;

IMPORT
  Ex2;

TYPE
  R00 * = Ex2.R00;

END Ex1.

MODULE Ex0;

IMPORT
  Ex1;

TYPE
  R00 = Ex1.R00;

PROCEDURE Proc ();
  VAR
    r00 : R00;
  BEGIN
  END Proc;

END Ex0.



Они компилирутся Ofront+'ом, но затем не компилирутся коспилятором C.
Вот что у меня выдаёт MinGW-w64-gcc:

Цитата:
Ex0.c: In function 'Ex0_Proc':
Ex0.c:15:2: error: unknown type name 'Ex2_R00'
Ex2_R00 r00;


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 08 Май, 2020 11:37 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
Дмитрий Дагаев писал(а):
У меня есть набор тестов >400, которые используются. Они в скомпилированном виде прогоняются для всех Omb, Omf, Oml. В принципе, можно и опубликовать, наверное ...
Опубликуете?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 08 Май, 2020 15:32 

Зарегистрирован: Вторник, 01 Март, 2011 09:34
Сообщения: 583
Откуда: Москва
Да, с новой версией.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 09 Май, 2020 13:51 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 520
Откуда: Украина, Днепропетровская обл.
GameHunter писал(а):
Олег, что вы решили по рекурсивным объявлениям массивов - будете реализовывать, или оставите запрет?
Думаю, надо реализовать. Хотя бы для совместимости с BlackBox. Первая часть-то уже реализована на основе фикса Дм. Дагаева. Надо только поправить найденные мной пару ошибок. Постараюсь сделать сегодня или завтра.

GameHunter писал(а):
Ещё одна ошибка.
Выкатываю решение.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 09 Май, 2020 22:03 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Oleg N. Cher писал(а):
Хотя бы для совместимости с BlackBox.
Это правильно, чтобы в сторону всеобщей совместимости делать шажки при каждом удобном случае.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 15 Май, 2020 21:31 

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

Код:
MODULE Test;

TYPE
  Rec * = EXTENSIBLE RECORD
  END;

PROCEDURE (VAR r:Rec) Do * (), NEW;
  BEGIN
  END Do;

END Test.


MODULE Main;

IMPORT
  Test, C:=Console;

TYPE
  Rec = RECORD (Test.Rec)
  END;

BEGIN
  C.String('Done'); C.Ln; C.Flush;
END Main.


Всё успешно компилируется и линкуется в конечный исполняемый файл. Но при запуске происходит какая-то системная ошибка. Если убрать объявление Main.Rec либо процедуру Do, ошибки не возникает, и я вижу на экране "Done".


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 332 ]  На страницу Пред.  1 ... 5, 6, 7, 8, 9, 10, 11 ... 17  След.

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


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

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


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

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