OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Понедельник, 10 Август, 2020 22:52

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




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

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

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
Сообщения: 913
В исходнике от 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
Сообщения: 913
"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
Сообщения: 913
Ну в общем-то конечная цель состоит в том, чтобы работало. Сейчас пока в задачу включено только написание тестов, но не починка ошибок, если они найдутся. Если есть желание добиться, чтобы работало, в т.ч. на базе другого кода, то можно и так сделать. Тут возникает вопрос о переводе на АО, и о лицензии на приведённый тобой код.

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

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

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


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

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


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

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

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


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

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

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

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


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

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

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

Например понятие "лексический символ" очень важно у Вирта.
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
Сообщения: 913
https://gitlab.com/budden/jaos/-/commit ... c7cfc4407f - CHAR теперь всегда называется знаком.

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

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


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

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

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


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

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

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

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


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

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


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

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

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

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


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

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

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

Вот оно!


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

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 913
В новом описании АО не менее двух разных смыслов слова symbol. Во-первых, лексема. Во-вторых, элемент грамматики (например, условный оператор). Эти смыслы ещё и пересекаются: terminal symbol - это плюс минус лексема, хотя я не уверен в нюансах. non-terminal - это уже точно не лексема. В коде компилятора (FoxSyntaxTree) symbol тоже что-то означает, и вряд ли оно совпадает с любым из этих двух смыслов, потому что оно означает именованный объект, присутствующий в исходном тексте.

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


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

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 913
Получил страницы 31-40, и выложил их вот сюда:

https://gitlab.com/budden/jaos/-/commit ... expanded=1

Посмотреть текст целиком можно тут:

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

等待您的意见


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 05 Август, 2020 22:49 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 913
И сразу ещё вопрос - а как же правильно перевести designator? Я вот давно уже ползаю по исходникам компилятора, но до сих пор очень туманно представляю себе, что это.

Где-то переведено как обозначение. Но это явно какая-то беда, а не перевод.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 05 Август, 2020 22:59 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 913
В общем, будет пока что "именующее выражение", по мотивам http://artlib.osu.ru/Docs/piter/bookcha ... 23928.html

Цитата:
Именующие и значащие выражения — краеугольный камень выражений в языке C++. Если не вдаваться в детали, то именующее выражение (lvalue) — это ссылка на объект, а значащее выражение (rvalue) — это некоторое значение. Разница между именующими и значащими выражениями играет важную роль в понимании того, как записывать и воспринимать выражения.

Именующее выражение — это выражение, результатом которого является ссылка на объект, например имя переменной, ссылка на элемент массива по индексу, разыменованный указатель или вызов функции, возвращающей ссылку. Именующее выражение всегда связано с некоторой областью памяти, адрес которой известен.

Значащее выражение — это выражение, не являющееся именующим. В качестве примера можно привести литералы, результаты большинства операторов и вызовы функций, не возвращающих ссылок. Значащее выражение может не быть привязано к какой-либо области памяти.

Строго говоря, имя функции — это именующее выражение, единственное применение которого заключается в вызове функции или взятии ее адреса. Обычно под именующим выражением понимают объектное именующее выражение, и эта книга следует этой традиции.

Язык C++ заимствовал эти термины из С, где только именующие выражения могли использоваться в левой части инструкции присваивания. Понятие же значащего выражения относится к выражениям, которые могут быть использованы только в правой части такой инструкции, например:

#define rvalue 42



int lvalue;



lvalue = rvalue;

В языке C++ эти простые правила больше не действуют, но названия остались прежними, поскольку они все же близки к истине. Наиболее значимое отступление от традиций C заключается в том, что именующее выражение в C++ может быть константным, и в этом случае ему нельзя ничего присвоить (язык C, также развивавшийся, теперь включает понятие константного именующего выражения).


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 43 ]  На страницу 1, 2, 3  След.

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


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

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


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

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