Чиним продвинутый редактор для A2: TFPET/TFXRef

Только технические вопросы по ЯОС и MINOS. Терминология и прочее - в других форумах.
Ответить
БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Чиним продвинутый редактор для A2: TFPET/TFXRef

Сообщение БудДен » 24.08.19 16:22

TFXRef - утилита, с помощью которой создан сайт http://bbos.org/
Она раньше работала, а теперь не работает.
Соответственно, была взята версия от 2012-10-22 и гоняем на ней.
Примерный алгоритм создания перекрёстных ссылок (пути относительно корня репозитория, который нужно взять с https://gitlab.com/budden/a2os-since-2008
  • git checkout 8f3ed154f7234deb8779ab730b8452dc55da4366
  • Запускаем WinAos/Aos.exe
  • PET.Open TFXRef.Mod
  • Создаём директорию WinAos/Xref
  • Создаём директорию xrefsource и копируем в неё все из Source, кроме FoxArrayBase.Mod
  • В конце файла TFXRef.Mod есть порядок действий, у меня он заработал в таком виде
    (вам понадобится заменить директорию, где развёрнут репозиторий)

    Код: Выделить всё

    TFAOParser.MakeSymbolFiles "C:/ob/a28/source" "*Oberon*"~ (* d:/release/*.Mod *)
    
    SystemTools.Free TFXRef TFDocGenerator~
    (* Eshho vykinutq FoxArrayBase.Mod *)
    TFXRef.MakeXRef "C:/ob/a28/xrefsource" "*Oberon*"~
    TFXRef.Generate HelloWorld.Mod ~
    TFXRef.Generate I386.VMWareTools.Mod ~
     TFXRef.Generate TFModuleTrees.Mod ~
      TFXRef.Generate String.Mod ~
    
Последний раз редактировалось БудДен 29.09.19 16:22, всего редактировалось 1 раз.

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: Чиним TFXRef

Сообщение БудДен » 24.08.19 17:15

Надо править BimboScanner, но похоже, что на сегодня всё.
Пытался найти, где в TFPET переход к определению, но нашёл только Control-Пробел - автодополнение, и к тому же нужно совершить какие-то магические действия для генерации и подключения инфы.

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: Чиним TFXRef

Сообщение БудДен » 21.09.19 15:48

Денис Будяк, [25.08.19 14:33]
А где-нибудь есть описание, как пользоваться TFPET? Явно нужны магические действия по созданию и поддержанию файлов ссылок, соответственно должна быть и инструкция.

Денис Будяк, [25.08.19 14:34]
Также неясна причина, по которой существует и TFPET, и PET.

Денис Будяк, [25.08.19 15:42]
Как проверить существование директории или как гарантировать существование директории?

Sergej Durmanov, [25.08.19 18:03]
[In reply to Денис Будяк]
Смотри FSTools

Sergej Durmanov, [25.08.19 18:04]
[In reply to Денис Будяк]
Вполне возможно, что это был очередной эксперимент

Денис Будяк, [25.08.19 22:09]
Чёй-то как-то не решается задачка про директорию.

Денис Будяк, [25.08.19 22:11]
Есть WinFS.CheckPath только, для других платформ не искал, но оно не обобщено.

Денис Будяк, [25.08.19 22:12]
Вероятно, придётся допиливать. Я всего-то навсего хотел создавать xref культурно, а не чтобы возникал красный экран, если сначала не создать директорию руками

Денис Будяк, [25.08.19 22:12]
Можно создат наугад и потом не проверять код возврата, но это непрофессионально :)

Ярослав, [25.08.19 22:15]
FSTools.Mod:
(* returns if a file or directory exists. If yes, then fullname is set to filename *)
PROCEDURE Exists*(CONST name: ARRAY OF CHAR; VAR fullName: ARRAY OF CHAR; VAR flags: SET): BOOLEAN;

Денис Будяк, [25.08.19 22:17]
Спасибо! Но в 12-м году её ещё не было. Значит, выход пока в том, чтобы создавать руками или смотреть на красный экран.

Денис Будяк, [25.08.19 22:18]
А блин, она появилась в ноябре 12-го, а я - в октябре

Денис Будяк, [25.08.19 22:18]
Значит, надо попробовать переехать в ноябрь :)

Денис Будяк, [25.08.19 23:08]
Уф, вроде получилось. На децл улучшил работу TFXRef, но ничего существенного

Денис Будяк, [25.08.19 23:08]
https://gitlab.com/budden/jaos/commits/ ... %8F-TFXRef

Денис Будяк, [25.08.19 23:08]
Спасибо за помощь!

Денис Будяк, [25.08.19 23:10]
Теперь есть гораздо более серьёзный вопрос: есть парсер в Fox, а есть отдельный парсер TF... . Соответственно, логично переделать TFXRef, чтобы он пользовался парсером от Fox. Но я пока не смотрел, что это может означать. Например, TF... включает комментарии и переносы строк в лексемы, это очень правильно. Делает ли так Fox - я пока не знаю.

Денис Будяк, [25.08.19 23:10]
Вероятно, это будет уже не в ближайшие дни...

Денис Будяк, [27.08.19 19:50]
Немного поизучал зависимости в файлах TF*, чтобы понять, как проще переделать. Вот что обнаружилось:

Денис Будяк, [27.08.19 19:50]
* FoxScanner менялся около 60 раз
* TFXRef - 976 строк. Мало зависит от S=BimboScanner (4+50), сильно зависит от
TS=TFTypeSys (больше 100), от TFScopeTools - (15)
* TFTypeSys - абстрактное от языка синт. дерево - 1063 строки - ни от чего не зависит в данной компании! Пишет символьные файлы.
Используется в TFDocGenerator, TFCheck, TFAOParser, TFDumpTS, TFTypeSys
* TFScopeTools - 167 строк - используется в TFPET, TFCheck, TFModuleTrees, TFXRef
* BimboScanner - 545 строк
* TFAOParser - 1316 строк - зависит от TS=TFTypeSys (202), S=BimboScanner(276)

Денис Будяк, [27.08.19 19:51]
Модуль TFTypeSys хочется оставить, т.к. он центральный в этой инфраструктуре и от него всё зависит. Но TFAOParser тоже от него зависит. Если мы хотим выкинуть TFAOParser и оставить FoxParser, то возникает проблема: мы не можем менять FoxParser.

Денис Будяк, [27.08.19 19:59]
Т.е. похоже, что заменив TFAOParser на FoxParser, придётся и TFTypeSys заменить на FoxParserTree, причём объём работы получается немалым.

Денис Будяк, [27.08.19 20:00]
Знатоки, что скажете на тему целесообразности такого плана?

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: Чиним TFXRef

Сообщение БудДен » 28.09.19 11:29

Выяснилось, что FoxParser пропускает комментарии, вместо того, чтобы включать их в дерево. Это затруднительная ситуация, поскольку он менялся много раз и мы пока не знаем, какие версии нам интересны. Похоже, что нет иного выхода, кроме как поддерживать два парсера. Печально.

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: Чиним TFXRef

Сообщение БудДен » 29.09.19 14:47

TFPET - переход к определению по Ctrl-мышь. Но к импортированным модулям как-то не совсем переходит. Или вообще не.

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: Чиним продвинутый редактор для A2: TFPET/TFXRef

Сообщение БудДен » 29.09.19 16:22

Записал небольшое видео про TFPET.

https://youtu.be/-n19nX_-Umc

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: Чиним продвинутый редактор для A2: TFPET/TFXRef

Сообщение БудДен » 05.10.19 00:39

Немного почитал код PET и TFPET.
PET использует ModuleTrees, которая использует FoxScanner и ModuleParser.

FTPET использует TFModuleTrees, которая использует TFAOParser. Последний иногда падает по ассерту. Далее есть такой фрагмент кода:

Код: Выделить всё

			done := TRUE;
		(* Need to catch errors to release locks and let the editing continue*)
		FINALLY
Вероятно, что код недоотлажен, поэтому так. В этом месте, когда TFAOParser падает, появляется красный экран. ModuleParser, видимо, никогда не падает, поэтому и красного экрана не бывает. Например, функция Check там выставляет флаг ошибки, а HALT там был, но теперь он закомментирован.

Видимо, нужно поменять TFAOParser, чтобы он тоже не падал. Надо только, чтобы он к тому ещё умел не зависать.

И ещё я понял, что поскольку нет возможности сейчас менять код собственно ModuleParser, то наличие третьего отдельного парсера специально для FTPET является как раз удачным стечением обстоятельств - оно делает код независимым.

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: Чиним продвинутый редактор для A2: TFPET/TFXRef

Сообщение БудДен » 09.10.19 15:46

Сделал ещё микро-улучшение. Теперь TFPET не падает на TextUtilities.Mod. Раньше он не понимал type guards. Теперь он их тоже не понимает, но хотя бы пропускает.

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: Чиним продвинутый редактор для A2: TFPET/TFXRef

Сообщение БудДен » 10.10.19 19:13

Остановился в WITH - пока не понимаю, как делать. Там есть некий SCOPE, и, видимо, при обходе WITHStatement должен быть какой-то другой scope. Но когда генерируются эти scope? И, видимо, они должны как-то вписываться в WITHStatement.

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: Чиним продвинутый редактор для A2: TFPET/TFXRef

Сообщение БудДен » 10.10.19 20:22

Перешло в вики
Последний раз редактировалось БудДен 16.10.19 16:45, всего редактировалось 1 раз.

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: Чиним продвинутый редактор для A2: TFPET/TFXRef

Сообщение БудДен » 10.10.19 20:26

Код: Выделить всё

 TFAOParser.Parser.Parse
   Module
     Body
       StatementBlock
         StatementSequence
           (* и там такой кусок: *)

					|S.with : Next; designator := Designator(); Eat(S.colon); designator2 := Designator(); Eat(S.do);
						sequence := StatementSequence(); Eat(S.end);
						Add(TS.CreateWith(designator, designator2, sequence)) (* TS = TFTypeSys *)
  Или же
  Module
    DeclSeq(m.scope)
      S.procedure
        ProcDecl(scope)
          (DeclSeq - внутренние процедуры)
          Body - о как. 
      S.operator
      
           
Где-то здесь надо создать scope и записать его в WITHStatement? Нужно смотреть по аналогии с процедурой.
Последний раз редактировалось БудДен 10.10.19 21:11, всего редактировалось 1 раз.

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: Чиним продвинутый редактор для A2: TFPET/TFXRef

Сообщение БудДен » 10.10.19 20:46

Э-э, похоже, что Scope нужно протягивать через все процедуры, к-рые разбирают тело, или же нужно завести переменную в самом объекте Parser, где этот текущий Scope будет храниться. Её там нет и это удивительно (и подозрительно). Видимо, надёжнее будет на данном этапе протянуть через все процедуры.

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: Чиним продвинутый редактор для A2: TFPET/TFXRef

Сообщение БудДен » 13.10.19 15:08

Есть какое-то внутреннее чувство, что у Scope обязательно должно быть имя. Процедура GetSourceReference учит нас, что NamedObject содержит сслыку на свой контекст и своё имя - звено в цепочке ИмяОбласти1.ИмяОбласти2.ИмяОбласти3 и т.п. Очевидно, что имена должны быть уникальны. Видимо, придётся сделать Gensym (вот такой http://filonenko-mikhail.github.io/cltl ... x71-108004)

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: Чиним продвинутый редактор для A2: TFPET/TFXRef

Сообщение БудДен » 14.10.19 00:06

Перенёс массу инфы в Wiki http://xn---115-f4d0bap3j.xn-----6kcaje ... 1%84%D0%B0

(Хотя зря оно в Wiki, нужно в Markdown и положить в репозиторий, а вообще нужно расширить язык до того, чтобы хранить доку в нём. Но пока некогда, поэтому пусть будет в Wiki).

Исходя из всего понятого, план теперь примерно такой:

* Переменная в WITH должна быть именованным объектом, причём её имя должно быть Модуль.Процедура.Body.With<Номер>.ИмяПеременной, а место определения, видимо, должно указывать на тип. TFAOParser.VarDecl отвечает за разбор переменной и, наверное, содержит достаточно информации, чтобы синтезировать переменную. Мы синтезируем переменную в SynthesizeVariableForWithStatement по аналогии с TFAOParser.VarDecl
* Соответственно, scope должен знать номер своего WITH и при разборе следующего WITH этот номер должен увеличиваться на 1. Будем хранить в поле counterOfWithStatements. Имя будет создаваться в CreateScopeForWithStatement и пополняться в CreateWith (ownerScope становится известен позже). Когда мы создаём Scope для WITH, мы заполняем его так:
parent - охватывающий scope, cs, ownerBody - тело операторов внутри данного WITH? owner - это будет переменная с именем от переменной и типом из WITH, к-рую мы должны будем синтезировать из того, что нам дали. superQualident не нужен (он не для тех). Вроде всё.
* Возможно, надо поменять TraverseScope, чтобы показывать WITH-ы в дереве кода. Думаю, что надо, т.к. без этого сломается переход к определению - он пытаеся раскрыть дерево в нужном месте, а если узла нет, то и раскрывать негде.
* В SearchUses меняем SearchStatements - там для WITHStatement нужно проходить не в scope, а в нашем scope, взятом из WITHStatement.
* А затем нужно протянуть Scope в любое Expression? Хотя вроде нет. В SearchUses мы управляем текущим scope, а в TraverseScope управляем обходом. Поэтому по идее не должно быть нужно.

разметил все эти места меткой todowith

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: Чиним продвинутый редактор для A2: TFPET/TFXRef

Сообщение БудДен » 01.11.19 13:50

Вчерне реализовал работу внутри WITH. Она недоделана, например, не поддерживается более одного WITH в процедуре, а некорректный код будет ронять редактор. Но главное сделано.

Ответить