Здравствуйте, 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) А. Эйнштейн
Здравствуйте, WolfHound, Вы писали:
WH>В принципе можно подумать над поддержкой полноценного UTF-16 но до сих пор данная задача не появлялась. WH>Насколько оно надо?
Можно сделать опциональную поддержку UNICODE-32. Это вызывало бы минимум переделок и работало бы гарантированно надежно.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Можно сделать опциональную поддержку UNICODE-32. Это вызывало бы минимум переделок и работало бы гарантированно надежно.
они могут быть многословными.... 4, 8,12 и т д байт
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.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, pekabon, Вы писали:
P>Не ест '🐵'. Подозреваю, что проблема в том, что 🐵 — это 4 байта в UTF16 и 6 в UTF8.
P>Сообщение об ошибке "Unexpected token: '\\uDC35'"
Можно попробовать написать аналог Any вручную.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Don Reba, Вы писали:
DR>>UTF-32 гарантировано кодирует целые code point'ы, но глиф может состоять из нескольких code point'ов.
VD>Что значит глиф и как это влияет на разбор текста?
например черта над симвлом- это один код и сам символ второй. 8 байт.
Здравствуйте, VladD2, Вы писали:
VD>Что значит глиф и как это влияет на разбор текста?
Глиф — это буква, как она видна в тексте. Например, буква ё может быть представлена в виде одного code point'а 0x0451 или двух: 0x0308 (умлаут) и 0x0435 (е). При этом она будет занимать один UTF-32 символ или два, соответственно.
Здравствуйте, Don Reba, Вы писали:
DR>Глиф — это буква, как она видна в тексте. Например, буква ё может быть представлена в виде одного code point'а 0x0451 или двух: 0x0308 (умлаут) и 0x0435 (е). При этом она будет занимать один UTF-32 символ или два, соответственно.
Ты тут ошибешься. То что что-то там выглядит как один символа еще не значит, что это один символ. У умляута просто кернин специальный. Но физически это два разных символа. Я могу его ̈г̈д̈ё̈̈ угодно запихать. Никаких умаляутных "г" нет в природе. Но "̈г" написать вполне можно.
Короче, не нужно забивать тему шумом. UNICODE-32 — это плоский формат который решит проблему из этой темы. И все что нужно сделать для этого — поменять тип представляющий символ.
Проблема только в том, что на практике он нужен крайне редко. Так что нужно сделать так, чтобы ̈UNICODE-32 можно было включить как опцию (при сборке грамматики).
Но это не так просто, так как тип символа указан в 100500 местах. Да и в SourceSnapshot он торчит (а он в стандартной библиотеке). Поддержать текущую версию и UNICODE-32 одновременно будет не просто.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, 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()
Здравствуйте, SlopnyPuratino, Вы писали:
SP>Не получается вручную, когда в границах диапазона попадают символы ['\uD800'..'\uDFFF'], возникает ошибка: SP>
SP> at System.IO.BinaryWriter.Write(Char ch)
SP>
Microsoft перестарался с защитой
Думаем как быть. Надеюсь в ближайшее время что-нибудь придумаем. За одно и Any подправим.
Переводить весь парсер на UNICODE-32 как-то уж больно сурово. Будут индексы с исходной строкой не совпадать. Их в обратку пересчитывать придется.
Попробуем просто в сериализацию вставить костыль, чтобы он сериализовал char как short.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, SlopnyPuratino, Вы писали:
SP>Не получается вручную, когда в границы диапазона попадают символы ['\uD800'..'\uDFFF'], возникает ошибка: ...
Исключение я устранил (теперь char сериализуется как ushort).
Но поменять реализацию Any пока не удается. У нас была оптимизация рассчитанная на старый Any. (!predicste Any)* переписывалось с изменением типа NSpan* на NSpan. Так как Any изменился (а распознавалась имеен грамматика Any, е не имя) то тип Any изменился и не собираются использующие его библиотеки.
WolfHaund сейчас пытается обобщить оптимизацию. Если у него это удастся, заменим Any на правильную версию и сможете парсить ваших обезьянок.
Так что, ждем комота WolfHaund-а.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.