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

Операционная система, написанная на языке Оберон и проект её перевода на русский язык. Только технические вопросы.
БудДен
Сообщения: 942
Зарегистрирован: 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 раз.

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

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

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

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

БудДен
Сообщения: 942
Зарегистрирован: 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)

БудДен
Сообщения: 942
Зарегистрирован: 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

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

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

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

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

Ответить