[Nitra] Проблемы с Unicode
От: pekabon  
Дата: 18.04.16 12:05
Оценка:
Привет,


Почему-то Any ест не весь Unicode.
Вот такая грамматика

syntax test = Any;


Не ест '🐵'. Подозреваю, что проблема в том, что 🐵 — это 4 байта в UTF16 и 6 в UTF8.

Сообщение об ошибке "Unexpected token: '\\uDC35'"
Отредактировано 18.04.2016 12:08 pekabon . Предыдущая версия .
Re: [Nitra] Проблемы с Unicode
От: WolfHound  
Дата: 18.04.16 13:04
Оценка:
Здравствуйте, pekabon, Вы писали:

P>Не ест '??'. Подозреваю, что проблема в том, что ?? — это 4 байта в UTF16 и 6 в UTF8.

Нитра работает с отдельными System.Char и не понимает символы которые состоят из 2х разных System.Char.
В данный момент Any это тупо от char.MinValue до char.MaxValue.
В принципе можно подумать над поддержкой полноценного UTF-16 но до сих пор данная задача не появлялась.
Насколько оно надо?
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: [Nitra] Проблемы с Unicode
От: pekabon  
Дата: 18.04.16 13:19
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Насколько оно надо?


у нас тесты парсинга не проходят Пытаемся распарсить все тесты вот отсюда https://github.com/rust-lang/rust/tree/master/src/test
Re[2]: [Nitra] Проблемы с Unicode
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.04.16 15:46
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>В принципе можно подумать над поддержкой полноценного UTF-16 но до сих пор данная задача не появлялась.

WH>Насколько оно надо?

Можно сделать опциональную поддержку UNICODE-32. Это вызывало бы минимум переделок и работало бы гарантированно надежно.
http://nemerle.org/Banners/?g=dark
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: [Nitra] Проблемы с Unicode
От: s22  
Дата: 18.04.16 16:44
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Можно сделать опциональную поддержку UNICODE-32. Это вызывало бы минимум переделок и работало бы гарантированно надежно.

они могут быть многословными.... 4, 8,12 и т д байт
Re[4]: [Nitra] Проблемы с Unicode
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.04.16 16:47
Оценка:
Здравствуйте, s22, Вы писали:

s22>они могут быть многословными.... 4, 8,12 и т д байт


UNICODE-32? Ты что-то путаешь.
https://ru.wikipedia.org/wiki/UTF-32

UTF-32 (англ. Unicode Transformation Format) или UCS-4 (универсальный набор символов, англ. Universal Character Set) в информатике — один из способов кодирования символов из Юникод, использующий для кодирования любого символа ровно 32 бита. Остальные кодировки, UTF-8 и UTF-16, используют для представления символов переменное число байтов. Символ UTF-32 является прямым представлением его кодовой позиции (Code point (англ.)русск.).
Главное преимущество UTF-32 перед кодировками переменной длины заключается в том, что символы Юникод непосредственно индексируемы. Получение n-ой кодовой позиции является операцией, занимающей одинаковое время. Напротив, коды с переменной длиной требует последовательного доступа к n-ой кодовой позиции. Это делает замену символов в строках UTF-32 простой, для этого используется целое число в качестве индекса, как обычно делается для строк ASCII.

http://nemerle.org/Banners/?g=dark
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: [Nitra] Проблемы с Unicode
От: Don Reba Канада https://stackoverflow.com/users/49329/don-reba
Дата: 18.04.16 17:05
Оценка:
s22>>они могут быть многословными.... 4, 8,12 и т д байт

VD>UNICODE-32? Ты что-то путаешь.


UTF-32 гарантированно кодирует целые code point'ы, но глиф может состоять из нескольких code point'ов.
Ce n'est que pour vous dire ce que je vous dis.
Отредактировано 18.04.2016 17:06 Don Reba . Предыдущая версия .
Re: [Nitra] Проблемы с Unicode
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.04.16 17:05
Оценка:
Здравствуйте, pekabon, Вы писали:

P>Не ест '🐵'. Подозреваю, что проблема в том, что 🐵 — это 4 байта в UTF16 и 6 в UTF8.


P>Сообщение об ошибке "Unexpected token: '\\uDC35'"


Можно попробовать написать аналог Any вручную.
http://nemerle.org/Banners/?g=dark
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: [Nitra] Проблемы с Unicode
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.04.16 17:06
Оценка:
Здравствуйте, Don Reba, Вы писали:

DR>UTF-32 гарантировано кодирует целые code point'ы, но глиф может состоять из нескольких code point'ов.


Что значит глиф и как это влияет на разбор текста?
http://nemerle.org/Banners/?g=dark
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: [Nitra] Проблемы с Unicode
От: s22  
Дата: 18.04.16 17:12
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, Don Reba, Вы писали:


DR>>UTF-32 гарантировано кодирует целые code point'ы, но глиф может состоять из нескольких code point'ов.


VD>Что значит глиф и как это влияет на разбор текста?

например черта над симвлом- это один код и сам символ второй. 8 байт.
Re[7]: [Nitra] Проблемы с Unicode
От: Don Reba Канада https://stackoverflow.com/users/49329/don-reba
Дата: 18.04.16 17:13
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Что значит глиф и как это влияет на разбор текста?


Глиф — это буква, как она видна в тексте. Например, буква ё может быть представлена в виде одного code point'а 0x0451 или двух: 0x0308 (умлаут) и 0x0435 (е). При этом она будет занимать один UTF-32 символ или два, соответственно.
Ce n'est que pour vous dire ce que je vous dis.
Re[8]: [Nitra] Проблемы с Unicode
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.04.16 17:14
Оценка:
Здравствуйте, s22, Вы писали:

s22>например черта над симвлом- это один код и сам символ второй. 8 байт.


Это с точки зрения парсинга — по фиг. Важно только то, что символ там имеет фиксированный размер и не нужно приседаний при его распознавании.
http://nemerle.org/Banners/?g=dark
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: [Nitra] Проблемы с Unicode
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.04.16 17:37
Оценка:
Здравствуйте, Don Reba, Вы писали:

DR>Глиф — это буква, как она видна в тексте. Например, буква ё может быть представлена в виде одного code point'а 0x0451 или двух: 0x0308 (умлаут) и 0x0435 (е). При этом она будет занимать один UTF-32 символ или два, соответственно.


Ты тут ошибешься. То что что-то там выглядит как один символа еще не значит, что это один символ. У умляута просто кернин специальный. Но физически это два разных символа. Я могу его ̈г̈д̈ё̈̈ угодно запихать. Никаких умаляутных "г" нет в природе. Но "̈г" написать вполне можно.

Короче, не нужно забивать тему шумом. UNICODE-32 — это плоский формат который решит проблему из этой темы. И все что нужно сделать для этого — поменять тип представляющий символ.

Проблема только в том, что на практике он нужен крайне редко. Так что нужно сделать так, чтобы ̈UNICODE-32 можно было включить как опцию (при сборке грамматики).

Но это не так просто, так как тип символа указан в 100500 местах. Да и в SourceSnapshot он торчит (а он в стандартной библиотеке). Поддержать текущую версию и UNICODE-32 одновременно будет не просто.
http://nemerle.org/Banners/?g=dark
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: [Nitra] Проблемы с Unicode
От: SlopnyPuratino  
Дата: 21.04.16 15:54
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, pekabon, Вы писали:


P>>Не ест '🐵'. Подозреваю, что проблема в том, что 🐵 — это 4 байта в UTF16 и 6 в UTF8.


P>>Сообщение об ошибке "Unexpected token: '\\uDC35'"


VD>Можно попробовать написать аналог Any вручную.


Не получается вручную, когда в границы диапазона попадают символы ['\uD800'..'\uDFFF'], возникает ошибка:

C:\Program Files (x86)\Nemerle\Net-4.0\Nemerle.MSBuild.targets(289,5): error : internal compiler error: got ArgumentException (Unicode surrogate characters must be written out as pairs together in the same call, not individually. Consider passing in a character array instead.)
       at System.IO.BinaryWriter.Write(Char ch)
       at Nitra.Typing.RegularRuleSymbol.Serialize(BinaryWriter writer, IMetadataWriter metadataWriter)
       at Nitra.Serialization.MetadataWriter.WriteSymbolHeadersAndSerializeSymbols(IEnumerable`1 symbols)
       at Nitra.Serialization.MetadataWriter.WriteSymbols()
       at Nitra.Compiler.CompilingNitraProject._N_writeMetadataCallback__18471.apply_void(ManagerClass _N_wildcard_4726)
       at Nemerle.Compiler.CompilerEventHandler.Invoke(ManagerClass manager)
       at Nemerle.Compiler.ManagerClass.OnBeforeSaveAssembly()
       at Nemerle.Compiler.ManagerClass.Run()
       at Nemerle.CommandlineCompiler.MainClass.main_with_catching()
Отредактировано 21.04.2016 17:41 SlopnyPuratino . Предыдущая версия . Еще …
Отредактировано 21.04.2016 16:03 SlopnyPuratino . Предыдущая версия .
Re[3]: [Nitra] Проблемы с Unicode
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.04.16 19:42
Оценка:
Здравствуйте, SlopnyPuratino, Вы писали:

SP>Не получается вручную, когда в границах диапазона попадают символы ['\uD800'..'\uDFFF'], возникает ошибка:

SP>
SP>       at System.IO.BinaryWriter.Write(Char ch)
SP>


Microsoft перестарался с защитой

Думаем как быть. Надеюсь в ближайшее время что-нибудь придумаем. За одно и Any подправим.

Переводить весь парсер на UNICODE-32 как-то уж больно сурово. Будут индексы с исходной строкой не совпадать. Их в обратку пересчитывать придется.

Попробуем просто в сериализацию вставить костыль, чтобы он сериализовал char как short.
http://nemerle.org/Banners/?g=dark
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: [Nitra] Проблемы с Unicode
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.04.16 21:21
Оценка:
Здравствуйте, SlopnyPuratino, Вы писали:

SP>Не получается вручную, когда в границы диапазона попадают символы ['\uD800'..'\uDFFF'], возникает ошибка: ...


Исключение я устранил (теперь char сериализуется как ushort).

Но поменять реализацию Any пока не удается. У нас была оптимизация рассчитанная на старый Any. (!predicste Any)* переписывалось с изменением типа NSpan* на NSpan. Так как Any изменился (а распознавалась имеен грамматика Any, е не имя) то тип Any изменился и не собираются использующие его библиотеки.

WolfHaund сейчас пытается обобщить оптимизацию. Если у него это удастся, заменим Any на правильную версию и сможете парсить ваших обезьянок.

Так что, ждем комота WolfHaund-а.
http://nemerle.org/Banners/?g=dark
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: [Nitra] Проблемы с Unicode
От: WolfHound  
Дата: 24.04.16 16:54
Оценка: 70 (2)
Здравствуйте, pekabon, Вы писали:

Сделал поддержку суррогатов. Проверяй.
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: [Nitra] Проблемы с Unicode
От: pekabon  
Дата: 25.04.16 10:46
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Сделал поддержку суррогатов. Проверяй.


Все заработало, спасибо!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.