Движок перевода

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

Движок перевода

Сообщение БудДен » 22.09.20 21:56

Только сейчас понял, что перевод может зависеть не только от контекста (области видимости, в к-рой введено имя), но также от типа переменной.

Например, все переменные symbol типа Scanner.Symbol имеет смысл переводить одинаково, независимо от места, где они встречаются.

Таким образом, движок языка заслуживает отдельной темы. Часть рассуждений на эту тему - здесь:

http://вече.программирование-по-русски. ... 170#p17437
Пока не вижу, что ещё не поддерживается движком перевода из конструкций языка. К сожалению, на этом движок перевода ещё далеко не окончен. Нужно, во-первых, обрабатывать блоки препроцессора. Это довольно муторно (и вообще не вполне понятно, как). Во-вторых, тестировать. В-третьих, генерировать заготовку для словаря на этапе разбора из существующего синт. дерева. В-четвёртых, сделать контекстно-независимый словарь по умолчанию, чтобы существовало разумное умолчание для общеупотребимых однозначных слов, таких, как Module. Вероятно, такие слова можно сразу переводить и внутри комментариев и строковых литералов.

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

Re: Движок перевода

Сообщение БудДен » 24.09.20 22:13

Ползучим образом двухъязычность пытается расползаться и на компиляцию. Но это не было предусмотрено. Видимо, придётся заняться препроцессором, чтобы этого избежать. А как? А так:

Перечисляем все конфигурации. Прогоняем модуль в каждой. При этом пропускаем лексемы, попавшие в неактивный процессорный блок, в каждой конфигурации, но запоминаем места, где они попались. Из этих мест потом строим особые псевдо-лексемы "неактивный блок препроцессора" и тоже их учитываем. В итоге получаем столько синт. деревьев и цепочек лексем, сколько есть конфигураций. Переводим каждое дерево и получаются переведённые цепочки лексем. Берём цепочку лексем из любой конфигурации, и вторую цепочку. Идём по обеим цепочкам и накладываем их друг на друга. Если в одной из цепочек попалась лексема "неактивный блок препроцессора", то её не накладываем. При наложении сравниваем лексемы (кроме лексем "неактивный блок препроцессора". Если лексемы после перевода одинаковы или есть лексема только с одной стороны сравнения, то ставим её в итоговую строку. Если есть противоречие, то перевод неудачен. Если в конце перевода остался "неактивный блок препроцессора", то перевод неудачен.

Видимо, поиск неактивных блоков нужно вынести в отдельный этап обработки исходников, отличный от перевода.

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

Re: Движок перевода

Сообщение БудДен » 03.10.20 16:33

Вроде прошёл сценарий перевода на примере пары модулей, зависящих друг от друга.

Код переводится, собирается и потом можно добавить ещё переводов.

Но всё это не учитывает препроцессор...

Процесс описан здесь https://gitlab.com/budden/jaos/-/blob/г ... да-кода.md

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

Re: Движок перевода

Сообщение БудДен » 17.12.20 14:37

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

Вот тут выяснилось, http://вече.программирование-по-русски. ... =210#p1937

что
Метод и все его перекрытые надо переводить одновременно, это идёт поперёк того разреза, который я попытался применить, и ломает всю процедуру.
На самом деле не совсем так плохо - в любом случае нужно переводить модуль со всеми клиентами. Значит, мы делаем:
  • процедура в модуле СборщикВыпускаЯОС, к-рая определяет список клиентов - модулей данного, и также проверяет, агностичен ли этот набор по отношению к препроцессору (если не агностичен, то такое срезание угла не сработает).
  • в движке перевода имена перекрытых методов помечаются как таковые, и переводы в них не вставляются. При переводе ищется перевод от предка.
  • для надёжности в обязательном порядке навязываем модификатор OVERRIDE/перекрыта

Ответить