OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 04 Август, 2020 20:38

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 16 ] 
Автор Сообщение
СообщениеДобавлено: Среда, 08 Июль, 2020 20:45 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 897
Вроде здесь нельзя редактировать сообщения, а на соседнем форуме можно, поэтому см. там:

https://zx.oberon.org/forum/viewtopic.p ... 3641#p3641

А ответы можно писать здесь.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 08 Июль, 2020 23:42 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 935
Откуда: Казань
Когда-то писал код для чтения UTF-8. В случае если встречаются некорректные байты, то возвращается символ замены.
Код:
(* Модуль читает поток байт в кодировке UTF-8 и возвращает номер символа в таблице UNICODE.
   В общем случае варианты представления одного символа в кодировке UTF-8 выглядят так:
   (1 байт)  0aaa aaaa
   (2 байта) 110x xxxx 10xx xxxx
   (3 байта) 1110 xxxx 10xx xxxx 10xx xxxx
   (4 байта) 1111 0xxx 10xx xxxx 10xx xxxx 10xx xxxx
   Данная кодировка позволяет кодировать символы в диапозонах: U+0000..U+D7FF и U+E000..U+10FFFF.
   В случае, если встретился неизвестный символ, он будет кодироваться как U+FFFD.
   BOM представляет собой байты EF, BB и BF (что является трёхбайтовой реализацией символа FEFF).
   Символ должен быть закодирован минимально возможным количеством байт, удлиненные коды запрещены.
*)
MODULE UTF8Reader;

  IMPORT Reader;

  CONST bufSize = 7;

  VAR buf: ARRAY bufSize OF CHAR; (* Фактически используется только 4 элемента буфера, 3 элемента нужны чтобы не было выхода
                                     за границы массива при сдвиге элементов массива. *)
    len: INTEGER;

  (* Сдвигает элементы массива. *)
  PROCEDURE Shift(n: INTEGER);
  VAR i: INTEGER;
  BEGIN
    (*PRE: (0 < n) & (n <= 4) & (bufSize >= 4+3) *)
    buf[0] := buf[n];
    buf[1] := buf[n+1];
    buf[2] := buf[n+2];
    len := len - n;
  END Shift;

  (* Проверяет не первый байт символа на то, что он существует и что он находится в заданных интервалах. *)
  PROCEDURE CheckTail(n: INTEGER): BOOLEAN;
  VAR res: BOOLEAN;
    code: INTEGER;
  BEGIN
    (*PRE: (1 <= n) & (n <= 3) *)
    IF len > n THEN
      code := ORD(buf[n]);
      res := (128 <= code) & (code <= 191);
    ELSE
      res := FALSE;
    END;
    RETURN res
  END CheckTail;

  PROCEDURE FillBuffer(r: Reader.Reader);
  BEGIN
    (* Заполняем буфер *) 
    WHILE (len < 4) & ~r.eof DO
      r.GetChar(r, buf[len]);
      IF ~r.eof THEN
        len := len + 1;
      END;
    END;
  END FillBuffer;

  (* Возвращает FALSE, когда нет больше символов для чтения.
    В случае ошибки возвращает символ замены: FFFD. *)
  PROCEDURE Read*(r: Reader.Reader; VAR point: INTEGER): BOOLEAN;
  VAR res, err: BOOLEAN;
    c0, c1: INTEGER;
  BEGIN                   
    (*PRE: len < 4 *)   
    FillBuffer(r);
    IF len > 0 THEN
      res := TRUE;
      err := FALSE;
      c0 := ORD(buf[0]);
      IF c0 < 128 THEN    (* 0000 0000 <= c0 <= 0aaa aaaa *)
        point := c0;
        Shift(1);
      ELSIF (192 <= c0) & (c0 <= 223) THEN (* 1100 0000 <=  c0 <  1101 1111. *)
        IF CheckTail(1) THEN
          point := 64*(c0 MOD 32) + (ORD(buf[1]) MOD 64);
          IF point < 128 THEN (* Избыточное кодирование. *)
            err := TRUE;
          ELSE
            Shift(2);
          END;
        ELSE
          err := TRUE;
        END;
      ELSIF (224 <= c0) & (c0 <= 239) THEN (* 1110 0000 <= c0 <= 1110 1111 *)
        IF CheckTail(1) & CheckTail(2) THEN
          point := 64*64*(c0 MOD 16) + 64*(ORD(buf[1]) MOD 64) + (ORD(buf[2]) MOD 64);
          IF point < 2048 THEN (* Избыточное кодирование *)
            err := TRUE;
          ELSIF (0D800H <= point) & (point <= 0DFFFH) THEN
            err := TRUE;
          ELSE
            Shift(3);
          END;
        ELSE 
          err := TRUE;
        END;
      ELSIF (240 <= c0) & (c0 <= 247) THEN (* 1111 0000 <= c0 <= 1111 0111 *)
        IF CheckTail(1) & CheckTail(2) & CheckTail(3) THEN
          point := 64*64*64*(c0 MOD 8) + 64*64*(ORD(buf[1]) MOD 64) + 64*(ORD(buf[2]) MOD 64) + (ORD(buf[3]) MOD 64);
          IF point < 65536 THEN (* Избыточное кодирование *)
            err := TRUE;
          ELSIF point > 10FFFFH THEN
            err := TRUE;
          ELSE
            Shift(4);
          END;
        ELSE
          err := TRUE;
        END;
      ELSE
        err := TRUE;
      END;
      IF err THEN
        point := 0FFFDH;
        Shift(1);
      END;
    ELSE
      res := FALSE;
    END;
    RETURN res
  END Read;

  (* Сбрасывает буфер *)
  PROCEDURE Init*;
  VAR i: INTEGER;
  BEGIN
    len := 0;
    FOR i:= 0 TO bufSize-1 DO
      buf[i] := 0X;
    END;
    (*POST: (len = 0) *)
  END Init;

BEGIN
  Init;
END UTF8Reader.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 09 Июль, 2020 10:04 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 897
В исходнике от A2 то ли 5, то ли 6 байт максимум, т.е. у тебя точно не весь современный юникод. А так разницы никакой нет - в любом случае такой функционал нужно тестами покрывать. А то получилось так, что я что-то накодил, запустил с чувством глубокой неудовлетворённости, уже совсем другим занимаюсь и периодически красный экран вываливается. Когда я на него в конце-концов посмотрел, выяснилось, что как раз на границе буфера что-то неправильно.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 09 Июль, 2020 11:40 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 935
Откуда: Казань
В Wiki максимум про 4 байта говорится: https://en.wikipedia.org/wiki/UTF-8


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 09 Июль, 2020 11:46 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 897
"https://gitlab.com/budden/jaos/-/blob/яос/source/UCS32.Mod#L570" - этот код не мой, он уже был в A2, я его только перенёс в другое место.

Код:
      (* 0000 0000-0000 007F  0xxxxxxx *)
   FOR init := 0 TO 7FH DO CodeLength[init] := 1X END;
      (* ???? ????-???? ????  10xxxxxx *)
   FOR init := 80H TO 0BFH DO CodeLength[init] := CodeLengthBad END;   (* non-starting byte - never change this w/o grepping for 7X *)
      (* 0000 0080-0000 07FF  110xxxxx 10xxxxxx *)
   FOR init := 0C0H TO 0DFH DO CodeLength[init] := 2X END;
      (* 0000 0800-0000 FFFF  1110xxxx 10xxxxxx 10xxxxxx *)
   FOR init := 0E0H TO 0EFH DO CodeLength[init] := 3X END;
      (* 0001 0000-001F FFFF  11110xxx 10xxxxxx 10xxxxxx 10xxxxxx *)
   FOR init := 0F0H TO 0F7H DO CodeLength[init] := 4X END;
      (* 0020 0000-03FF FFFF  111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx *)
   FOR init := 0F8H TO 0FBH DO CodeLength[init] := 5X END;
      (* 0400 0000-7FFF FFFF  1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx *)
   FOR init := 0FCH TO 0FDH DO CodeLength[init] := 6X END



Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 09 Июль, 2020 14:48 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 935
Откуда: Казань
Да есть и 5-ти байтные и 6-ти байтные. По аналогии можно расширить код на эти последовательности.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 09 Июль, 2020 15:10 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 897
Ну в общем-то конечная цель состоит в том, чтобы работало. Сейчас пока в задачу включено только написание тестов, но не починка ошибок, если они найдутся. Если есть желание добиться, чтобы работало, в т.ч. на базе другого кода, то можно и так сделать. Тут возникает вопрос о переводе на АО, и о лицензии на приведённый тобой код.

Добавил цены ещё для нескольких задач:

https://gitlab.com/budden/jaos/-/issues

Не является офертой :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 19 Июль, 2020 22:34 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 897
На данный момент сумма всех задач составляет 23 тыр, но мне уже начали выполнять перевод описания языка АО, это будет стоить ещё дороже. Поэтому задачки пока снимаются. Цены я оставляю, но они теперь только для справки.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 21 Июль, 2020 20:24 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2806
budden писал(а):
На данный момент сумма всех задач составляет 23 тыр, но мне уже начали выполнять перевод описания языка АО, это будет стоить ещё дороже. Поэтому задачки пока снимаются. Цены я оставляю, но они теперь только для справки.

А тут тебе не понравился перевод?
https://wiki.oberon.org/ao


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 30 Июль, 2020 21:39 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 897
Это перевод очень старой версии, но он есть у нашего коллеги и он им, наверное, пользуется как источником терминов, а может быть, и кусков текста.

Перевели уже 30 страниц из 80, можно делать замечания. Пока там нет русских ключевых слов из ЯОС, равно как и нет названий "ряд" вместо "массив" и "набор" вместо "запись". Сомнения на этот счёт меня пока не покидают, к тому же это лучше сделать отдельным этапом, чтобы не морочить голову исполнителю.

"https://gitlab.com/budden/jaos/-/blob/2d8d9f65595bef65cab4a83e679b7f72d1d24725/док/яп-активный-оберон/описание-языка.md"


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 31 Июль, 2020 07:05 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2806
А заголовок почему-то не про Активный Оберон, а просто про Оберон.

Много терминов отличается от принятых в существующих переводах... Это приводит к путанице сразу.

Например понятие "лексический символ" очень важно у Вирта.
They are called lexical symbols and are composed of sequences of characters. (Note the distinction between symbols and characters.)

А у вас в разделе 2 говорится, что символы — это идентификаторы, числа сроки и т.п. в значении Вирта. А потом сами идентификаторы опять состоят из символов. Получается рекурсия... символы - это символы, которые состоят из символов.
Цитата:
2 Словарь и представление
Представление терминальных символов по соглашениям определяется с помощью набора ASCII. Символы - это идентификаторы, числа, строки, операторы и разделители. Применяется следующее правило: пробелы и разрывы строк не должны встречаться в символах (за исключением комментариев и строковых литералов). Кроме того, что они служат разделителями соседних символов, они игнорируются. Прописные и строчные буквы считаются различными.

2.1 Идентификаторы
Идентификаторы - это последовательность символов, цифр и специальных символов. Первый символ должен быть буквой:


В нашем переводе для Оберона-07 получилась такая формула
Код:
Идентификаторы — это последовательности букв и цифр. Первая литера идентификатора должна быть буквой.


letter — таким образом везде в тексте последовательно дальше переводится как литера, а character — как буква. А symbol как "символ".


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 31 Июль, 2020 14:24 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 897
https://gitlab.com/budden/jaos/-/commit ... c7cfc4407f - CHAR теперь всегда называется знаком.

При разработке терминологии руководствуемся такими принципами в порядке убывания важности:
  • минимизация неоднозначностей. Здесь слову symbol сразу же не повезло - он изначально неоднозначен, и его переводы - тоже.
  • краткость часто применяемых слов. В этом смысле ЗНАК лучше, чем СИМВОЛ
  • минимизация неясностей для новых читателей. Это значит, что либо нужно сохранить привычный термин полностью, либо
    заменить его полностью. Плохо, когда смысл меняется частично, тогда возникает путаница. Здесь символу не повезло второй раз.

Это суровые ограничения, которые в сумме недостижимы. Если к ним ещё добавить полную совместимость с ранее сделанными переводами, будет совсем уж плохо. Поэтому мы смотрим и на прошлые переводы, и на русификацию от Информатики-21, и на Глагол, и на 1С, но не принимаем их за догму.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 01 Август, 2020 00:27 

Зарегистрирован: Пятница, 13 Март, 2015 16:40
Сообщения: 425
Цитата:
symbol как "символ"

"Символ" чего? а ни чего...
"символическое имя"


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 01 Август, 2020 04:42 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2806
Artyemov писал(а):
Цитата:
symbol как "символ"

"Символ" чего? а ни чего...
"символическое имя"

"символ" тут используется в значении "токен", как элемент грамматики. Так что это не "символическое имя", а "символ" как графическое представление составной части языка.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 01 Август, 2020 08:33 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2806
Цитата:
Язык представляет собой бесконечное множество предложений, а именно предложений, правильно оформленных в соответствии с его синтаксисом. В Обероне, эти предложения называются единицами компиляции. Каждая единица представляет собой конечную последовательность символов из конечного словаря. Словарь Оберона состоит из идентификаторов, чисел, строк, операторов, разделителей и комментариев. Они называются лексическими символами и состоят из последовательностей литер. (Обратите внимание на разницу между символами и литерами.)


Вот для понятности в объявлении есть много таких табличек
Вложение:
symbol.png
symbol.png [ 7.41 КБ | Просмотров: 96 ]

Тут символы словаря языка программирования операторы DIV и MOD состоят из трёх литер.

Сам сейчас ещё критично смотрю на перевод наш... надо поправить там тоже есть путаница с character и letter местами...

У Фёдора Васильевича "symbol" переводится как "лексема", что весьма удачно, кстати, передаёт смысл.
http://www.inr.ac.ru/~info21/cpascal/cp ... _rus.htm#2


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 02 Август, 2020 01:34 

Зарегистрирован: Пятница, 13 Март, 2015 16:40
Сообщения: 425
Цитата:
"символ" тут используется в значении "токен"

Поздравляю: определим неизвестное через непонятное.
Цитата:
У Фёдора Васильевича "symbol" переводится как "лексема", что весьма удачно, кстати, передаёт смысл.

Вот оно!


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 16 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2020, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB