OberonCore https://forum.oberoncore.ru/ |
|
предложение подработки по ЯОС (A2) - 7000 руб https://forum.oberoncore.ru/viewtopic.php?f=22&t=6634 |
Страница 1 из 5 |
Автор: | budden [ Среда, 08 Июль, 2020 20:45 ] |
Заголовок сообщения: | предложение подработки по ЯОС (A2) - 7000 руб |
Вроде здесь нельзя редактировать сообщения, а на соседнем форуме можно, поэтому см. там: https://zx.oberon.org/forum/viewtopic.p ... 3641#p3641 А ответы можно писать здесь. |
Автор: | Rifat [ Среда, 08 Июль, 2020 23:42 ] |
Заголовок сообщения: | Re: предложение подработки по ЯОС (A2) - 7000 руб |
Когда-то писал код для чтения 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. |
Автор: | budden [ Четверг, 09 Июль, 2020 10:04 ] |
Заголовок сообщения: | Re: предложение подработки по ЯОС (A2) - 7000 руб |
В исходнике от A2 то ли 5, то ли 6 байт максимум, т.е. у тебя точно не весь современный юникод. А так разницы никакой нет - в любом случае такой функционал нужно тестами покрывать. А то получилось так, что я что-то накодил, запустил с чувством глубокой неудовлетворённости, уже совсем другим занимаюсь и периодически красный экран вываливается. Когда я на него в конце-концов посмотрел, выяснилось, что как раз на границе буфера что-то неправильно. |
Автор: | Rifat [ Четверг, 09 Июль, 2020 11:40 ] |
Заголовок сообщения: | Re: предложение подработки по ЯОС (A2) - 7000 руб |
В Wiki максимум про 4 байта говорится: https://en.wikipedia.org/wiki/UTF-8 |
Автор: | budden [ Четверг, 09 Июль, 2020 11:46 ] |
Заголовок сообщения: | Re: предложение подработки по ЯОС (A2) - 7000 руб |
"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 |
Автор: | Rifat [ Четверг, 09 Июль, 2020 14:48 ] |
Заголовок сообщения: | Re: предложение подработки по ЯОС (A2) - 7000 руб |
Да есть и 5-ти байтные и 6-ти байтные. По аналогии можно расширить код на эти последовательности. |
Автор: | budden [ Четверг, 09 Июль, 2020 15:10 ] |
Заголовок сообщения: | Re: предложение подработки по ЯОС (A2) - 7000 руб |
Ну в общем-то конечная цель состоит в том, чтобы работало. Сейчас пока в задачу включено только написание тестов, но не починка ошибок, если они найдутся. Если есть желание добиться, чтобы работало, в т.ч. на базе другого кода, то можно и так сделать. Тут возникает вопрос о переводе на АО, и о лицензии на приведённый тобой код. Добавил цены ещё для нескольких задач: https://gitlab.com/budden/jaos/-/issues Не является офертой |
Автор: | budden [ Воскресенье, 19 Июль, 2020 22:34 ] |
Заголовок сообщения: | Re: предложение подработки по ЯОС (A2) - 7000 руб |
На данный момент сумма всех задач составляет 23 тыр, но мне уже начали выполнять перевод описания языка АО, это будет стоить ещё дороже. Поэтому задачки пока снимаются. Цены я оставляю, но они теперь только для справки. |
Автор: | Иван Денисов [ Вторник, 21 Июль, 2020 20:24 ] |
Заголовок сообщения: | Re: предложение подработки по ЯОС (A2) - 7000 руб |
budden писал(а): На данный момент сумма всех задач составляет 23 тыр, но мне уже начали выполнять перевод описания языка АО, это будет стоить ещё дороже. Поэтому задачки пока снимаются. Цены я оставляю, но они теперь только для справки. А тут тебе не понравился перевод? https://wiki.oberon.org/ao |
Автор: | budden [ Четверг, 30 Июль, 2020 21:39 ] |
Заголовок сообщения: | Re: предложение подработки по ЯОС (A2) - 7000 руб |
Это перевод очень старой версии, но он есть у нашего коллеги и он им, наверное, пользуется как источником терминов, а может быть, и кусков текста. Перевели уже 30 страниц из 80, можно делать замечания. Пока там нет русских ключевых слов из ЯОС, равно как и нет названий "ряд" вместо "массив" и "набор" вместо "запись". Сомнения на этот счёт меня пока не покидают, к тому же это лучше сделать отдельным этапом, чтобы не морочить голову исполнителю. "https://gitlab.com/budden/jaos/-/blob/2d8d9f65595bef65cab4a83e679b7f72d1d24725/док/яп-активный-оберон/описание-языка.md" |
Автор: | Иван Денисов [ Пятница, 31 Июль, 2020 07:05 ] |
Заголовок сообщения: | Re: предложение подработки по ЯОС (A2) - 7000 руб |
А заголовок почему-то не про Активный Оберон, а просто про Оберон. Много терминов отличается от принятых в существующих переводах... Это приводит к путанице сразу. Например понятие "лексический символ" очень важно у Вирта. 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 как "символ". |
Автор: | budden [ Пятница, 31 Июль, 2020 14:24 ] |
Заголовок сообщения: | Re: предложение подработки по ЯОС (A2) - 7000 руб |
https://gitlab.com/budden/jaos/-/commit ... c7cfc4407f - CHAR теперь всегда называется знаком. При разработке терминологии руководствуемся такими принципами в порядке убывания важности:
Это суровые ограничения, которые в сумме недостижимы. Если к ним ещё добавить полную совместимость с ранее сделанными переводами, будет совсем уж плохо. Поэтому мы смотрим и на прошлые переводы, и на русификацию от Информатики-21, и на Глагол, и на 1С, но не принимаем их за догму. |
Автор: | Artyemov [ Суббота, 01 Август, 2020 00:27 ] |
Заголовок сообщения: | Re: предложение подработки по ЯОС (A2) - 7000 руб |
Цитата: symbol как "символ" "Символ" чего? а ни чего... "символическое имя" |
Автор: | Иван Денисов [ Суббота, 01 Август, 2020 04:42 ] |
Заголовок сообщения: | Re: предложение подработки по ЯОС (A2) - 7000 руб |
Artyemov писал(а): Цитата: symbol как "символ" "Символ" чего? а ни чего... "символическое имя" "символ" тут используется в значении "токен", как элемент грамматики. Так что это не "символическое имя", а "символ" как графическое представление составной части языка. |
Автор: | Иван Денисов [ Суббота, 01 Август, 2020 08:33 ] |
Заголовок сообщения: | Re: предложение подработки по ЯОС (A2) - 7000 руб |
Цитата: Язык представляет собой бесконечное множество предложений, а именно предложений, правильно оформленных в соответствии с его синтаксисом. В Обероне, эти предложения называются единицами компиляции. Каждая единица представляет собой конечную последовательность символов из конечного словаря. Словарь Оберона состоит из идентификаторов, чисел, строк, операторов, разделителей и комментариев. Они называются лексическими символами и состоят из последовательностей литер. (Обратите внимание на разницу между символами и литерами.) Вот для понятности в объявлении есть много таких табличек Вложение: symbol.png [ 7.41 КБ | Просмотров: 6667 ] Тут символы словаря языка программирования операторы DIV и MOD состоят из трёх литер. Сам сейчас ещё критично смотрю на перевод наш... надо поправить там тоже есть путаница с character и letter местами... У Фёдора Васильевича "symbol" переводится как "лексема", что весьма удачно, кстати, передаёт смысл. http://www.inr.ac.ru/~info21/cpascal/cp ... _rus.htm#2 |
Автор: | Artyemov [ Воскресенье, 02 Август, 2020 01:34 ] |
Заголовок сообщения: | Re: предложение подработки по ЯОС (A2) - 7000 руб |
Цитата: "символ" тут используется в значении "токен" Поздравляю: определим неизвестное через непонятное. Цитата: У Фёдора Васильевича "symbol" переводится как "лексема", что весьма удачно, кстати, передаёт смысл. Вот оно! |
Автор: | budden [ Среда, 05 Август, 2020 08:57 ] |
Заголовок сообщения: | Re: предложение подработки по ЯОС (A2) - 7000 руб |
В новом описании АО не менее двух разных смыслов слова symbol. Во-первых, лексема. Во-вторых, элемент грамматики (например, условный оператор). Эти смыслы ещё и пересекаются: terminal symbol - это плюс минус лексема, хотя я не уверен в нюансах. non-terminal - это уже точно не лексема. В коде компилятора (FoxSyntaxTree) symbol тоже что-то означает, и вряд ли оно совпадает с любым из этих двух смыслов, потому что оно означает именованный объект, присутствующий в исходном тексте. Таким образом, складывая это с описанием, получаем уже три смысла одного слова. |
Автор: | budden [ Среда, 05 Август, 2020 19:08 ] |
Заголовок сообщения: | Re: предложение подработки по ЯОС (A2) - 7000 руб |
Получил страницы 31-40, и выложил их вот сюда: https://gitlab.com/budden/jaos/-/commit ... expanded=1 Посмотреть текст целиком можно тут: https://gitlab.com/budden/jaos/-/blob/c ... b16b918cc/док/яп-активный-оберон/описание-языка.md 等待您的意见 |
Автор: | budden [ Среда, 05 Август, 2020 22:49 ] |
Заголовок сообщения: | Re: предложение подработки по ЯОС (A2) - 7000 руб |
И сразу ещё вопрос - а как же правильно перевести designator? Я вот давно уже ползаю по исходникам компилятора, но до сих пор очень туманно представляю себе, что это. Где-то переведено как обозначение. Но это явно какая-то беда, а не перевод. |
Автор: | budden [ Среда, 05 Август, 2020 22:59 ] |
Заголовок сообщения: | Re: предложение подработки по ЯОС (A2) - 7000 руб |
В общем, будет пока что "именующее выражение", по мотивам http://artlib.osu.ru/Docs/piter/bookcha ... 23928.html Цитата: Именующие и значащие выражения — краеугольный камень выражений в языке C++. Если не вдаваться в детали, то именующее выражение (lvalue) — это ссылка на объект, а значащее выражение (rvalue) — это некоторое значение. Разница между именующими и значащими выражениями играет важную роль в понимании того, как записывать и воспринимать выражения.
Именующее выражение — это выражение, результатом которого является ссылка на объект, например имя переменной, ссылка на элемент массива по индексу, разыменованный указатель или вызов функции, возвращающей ссылку. Именующее выражение всегда связано с некоторой областью памяти, адрес которой известен. Значащее выражение — это выражение, не являющееся именующим. В качестве примера можно привести литералы, результаты большинства операторов и вызовы функций, не возвращающих ссылок. Значащее выражение может не быть привязано к какой-либо области памяти. Строго говоря, имя функции — это именующее выражение, единственное применение которого заключается в вызове функции или взятии ее адреса. Обычно под именующим выражением понимают объектное именующее выражение, и эта книга следует этой традиции. Язык C++ заимствовал эти термины из С, где только именующие выражения могли использоваться в левой части инструкции присваивания. Понятие же значащего выражения относится к выражениям, которые могут быть использованы только в правой части такой инструкции, например: #define rvalue 42 int lvalue; lvalue = rvalue; В языке C++ эти простые правила больше не действуют, но названия остались прежними, поскольку они все же близки к истине. Наиболее значимое отступление от традиций C заключается в том, что именующее выражение в C++ может быть константным, и в этом случае ему нельзя ничего присвоить (язык C, также развивавшийся, теперь включает понятие константного именующего выражения). |
Страница 1 из 5 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |