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
RawInputCharacter

UnicodeEscape:
\ UnicodeMarker HexDigit HexDigit HexDigit HexDigit

UnicodeMarker:
u
UnicodeMarker u

RawInputCharacter:
любой символ Unicode

HexDigit: один из
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.

Другие вопросы по тегам