Unicode версия ABNF?
Я хочу написать грамматику для формата файла, содержимое которого может содержать символы, отличные от символов US-ASCII. Так как я привык к ABNF, я пытаюсь использовать его...
Тем не менее, ни один из RFC 5234 и 7405 не очень дружелюбен по отношению к людям, которые НЕ используют US ASCII.
На самом деле, я ищу версию ABNF (и, возможно, некоторые основные правила), которая ориентирована на символы, а не на байты; Единственное, что RFC 5234 должен сказать по этому поводу, это в разделе 2.4:
2.4. External Encodings
External representations of terminal value characters will vary
according to constraints in the storage or transmission environment.
Hence, the same ABNF-based grammar may have multiple external
encodings, such as one for a 7-bit US-ASCII environment, another for
a binary octet environment, and still a different one when 16-bit
Unicode is used. Encoding details are beyond the scope of ABNF,
although Appendix B provides definitions for a 7-bit US-ASCII
environment as has been common to much of the Internet.
By separating external encoding from the syntax, it is intended that
alternate encoding environments can be used for the same syntax.
Это на самом деле не проясняет вопросы.
Есть ли где-нибудь версия ABNF, ориентированная на код, а не на байты?
2 ответа
Если ABNF, который вы пишете, предназначен для чтения человеком, то я бы сказал, просто используйте обычный синтаксис и вместо этого обращайтесь к кодовым точкам вместо байтов. Вы можете взглянуть на различные спецификации языка, которые допускают Unicode в исходном тексте, например, C#, Java, PowerShell и т. Д. Все они имеют грамматику, и все они должны где-то определять символы Unicode (например, для идентификаторов).
Например, грамматика PowerShell имеет следующие строки:
двойные кавычки символов:
"
(U+0022
)
Левая двойная кавычка (U+201C
)
Правая двойная кавычка (U+201D
)
Двойная кавычка 9U+201E
)
Или в спецификации Java:
UnicodeInputCharacter:
UnicodeEscape
RawInputCharacterUnicodeEscape:
\
UnicodeMarker HexDigit HexDigit HexDigit HexDigitUnicodeMarker:
u
UnicodeMarkeru
RawInputCharacter:
любой символ UnicodeHexDigit: один из
0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F
\
,u
и шестнадцатеричные цифры здесь все символы ASCII.
Обратите внимание, что есть окружающий текст, объясняющий намерение - что всегда лучше, чем просто сбросить кучу грамматики на кого-то.
Если это для автоматической генерации парсера, вам лучше найти инструмент, который позволяет вам задавать грамматику как в Unicode, так и в ABNF-подобной форме и публиковать ее вместо этого. Люди, пишущие парсеры, тоже должны понимать, что понимают.
Обратитесь к разделу 2.3 RFC 5234, в котором говорится:
Правила преобразуются в строку значений терминалов, иногда называемых символами. В ABNF символом является просто неотрицательное целое число. В определенных контекстах будет указано конкретное отображение (кодирование) значений в набор символов (например, ASCII).
Unicode - это просто набор неотрицательных целых чисел от U+0000 до U+10FFFF минус суррогатный диапазон D800-DFFF, и существуют различные RFC, которые соответственно используют ABNF. Примером является RFC 3987.