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. Связана с отловом циклического определения типа. Разберёмся на днях. |
Автор: | Дмитрий Дагаев [ Четверг, 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). Это - тот самый случай, где по нескольку раз я запускал свои регрессионные тесты, пока не пришел к приемлемому решению.
|
Автор: | 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; (ловит ошибку 244, хотя если 2 убрать и сделать массив открытым, то компилит)TYPE ArrPtr = POINTER TO Arr; Arr = ARRAY 2 OF ArrPtr; END Ex4. Код: MODULE Ex5; (порождает код со static Arr Ex5_a, где Arr не определено)
TYPE Arr = ARRAY 2 OF POINTER TO Arr; VAR a: Arr; END Ex5. |
Автор: | Илья Ермаков [ Пятница, 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
|
Автор: | 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/ |