OberonCore
https://forum.oberoncore.ru/

Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x86
https://forum.oberoncore.ru/viewtopic.php?f=30&t=6344
Страница 8 из 17

Автор:  Oleg N. Cher [ Четверг, 30 Январь, 2020 01:44 ]
Заголовок сообщения:  Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8

Тэкс. Для начала извиняюсь перед Дмитрием Викторовичем. Упомянутые выше правки в Stars действительно не Ваши, а оригинальные. Просто я заглянул в файл OPC вместо CPC, они же там в исходном архиве все в куче. Это отличия реализации Stars в Ofront и CPfront. Так что вопрос снят.

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

Автор:  Oleg N. Cher [ Четверг, 30 Январь, 2020 08:39 ]
Заголовок сообщения:  Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8

Когда меняю исходник так:

Код:
MODULE Ex4;

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

END Ex4.

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

Вложения:
Infinite.png
Infinite.png [ 165.92 КБ | Просмотров: 5790 ]

Автор:  Дмитрий Дагаев [ Четверг, 30 Январь, 2020 19:02 ]
Заголовок сообщения:  Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8

Oleg N. Cher писал(а):
Ofront и Ofront+ зависают, а CPfront впадает в безконечную рекурсию внутри процедуры CPC.Universal.

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

Автор:  Дмитрий Дагаев [ Среда, 05 Февраль, 2020 14:51 ]
Заголовок сообщения:  Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8

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

Вложения:
OPC_Univ.txt [51.71 КБ]
Скачиваний: 298

Автор:  Oleg N. Cher [ Среда, 19 Февраль, 2020 20:43 ]
Заголовок сообщения:  Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8

Дмитрию Викторовичу спасибо за решение.

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 ]
Заголовок сообщения:  Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8

Ну так страничное дерево, например...
Каждый уровень дерева - Arr.

Автор:  Oleg N. Cher [ Пятница, 21 Февраль, 2020 01:59 ]
Заголовок сообщения:  Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8

Для дерева логичнее использовать указатели на записи, а не на массивы, разве нет?)

Дмитрий Викторович, Ваш фикс не проходит такие тесты:
Код:
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 ]
Заголовок сообщения:  Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8

Ну так если рекурсивно можно определять POINTER TO RECORD, то почему же нельзя POINTER TO ARRAY?

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

Автор:  Oleg N. Cher [ Среда, 11 Март, 2020 08:36 ]
Заголовок сообщения:  Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8

Реализовал в 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 ]
Заголовок сообщения:  Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8

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';

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

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

Автор:  Oleg N. Cher [ Среда, 11 Март, 2020 10:15 ]
Заголовок сообщения:  Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8

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

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

Автор:  Oleg N. Cher [ Воскресенье, 29 Март, 2020 03:04 ]
Заголовок сообщения:  Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8

Получилось собрать код на Обероне для игровой приставки Nintendo/NES/Dendy/Famicom. Через компилятор cc65 с помощью Ofront+.

Изображение

Изображение

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

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

Автор:  Дмитрий Дагаев [ Среда, 01 Апрель, 2020 10:39 ]
Заголовок сообщения:  Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8

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 КБ]
Скачиваний: 207

Автор:  GameHunter [ Четверг, 07 Май, 2020 05:31 ]
Заголовок сообщения:  Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8

Олег, что вы решили по рекурсивным объявлениям массивов - будете реализовывать, или оставите запрет?

Автор:  GameHunter [ Пятница, 08 Май, 2020 05:50 ]
Заголовок сообщения:  Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8

Ещё одна ошибка. Вот 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;

Автор:  Comdiv [ Пятница, 08 Май, 2020 11:37 ]
Заголовок сообщения:  Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8

Дмитрий Дагаев писал(а):
У меня есть набор тестов >400, которые используются. Они в скомпилированном виде прогоняются для всех Omb, Omf, Oml. В принципе, можно и опубликовать, наверное ...
Опубликуете?

Автор:  Дмитрий Дагаев [ Пятница, 08 Май, 2020 15:32 ]
Заголовок сообщения:  Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8

Да, с новой версией.

Автор:  Oleg N. Cher [ Суббота, 09 Май, 2020 13:51 ]
Заголовок сообщения:  Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8

GameHunter писал(а):
Олег, что вы решили по рекурсивным объявлениям массивов - будете реализовывать, или оставите запрет?
Думаю, надо реализовать. Хотя бы для совместимости с BlackBox. Первая часть-то уже реализована на основе фикса Дм. Дагаева. Надо только поправить найденные мной пару ошибок. Постараюсь сделать сегодня или завтра.

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

Автор:  Info21 [ Суббота, 09 Май, 2020 22:03 ]
Заголовок сообщения:  Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8

Oleg N. Cher писал(а):
Хотя бы для совместимости с BlackBox.
Это правильно, чтобы в сторону всеобщей совместимости делать шажки при каждом удобном случае.

Автор:  GameHunter [ Пятница, 15 Май, 2020 21:31 ]
Заголовок сообщения:  Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8

Следующая ошибка.
Вот два модуля:

Код:
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".

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