En informática , la forma aumentada Backus-Naur ( ABNF ) es un metalenguaje basado en la forma Backus-Naur (BNF), pero que consta de su propia sintaxis y reglas de derivación. El principio del motivo de ABNF es describir un sistema formal de un lenguaje que se utilizará como protocolo de comunicaciones bidireccionales . Está definido por Internet Standard 68 ("STD 68", type case sic), que en diciembre de 2010 [actualizar]es RFC 5234 , y a menudo sirve como lenguaje de definición para los protocolos de comunicación IETF . [1] [2]
RFC 5234 reemplaza a RFC 4234 (que reemplazó a RFC 2234 y RFC 733 ). [3] RFC 7405 lo actualiza, agregando una sintaxis para especificar cadenas literales sensibles a mayúsculas y minúsculas.
Descripción general
Una especificación ABNF es un conjunto de reglas de derivación, escritas como
regla = definición; comentario CR LF
donde regla es un no terminal que no distingue entre mayúsculas y minúsculas , la definición consta de secuencias de símbolos que definen la regla, un comentario para la documentación y termina con un retorno de carro y un salto de línea.
Nombres de las reglas son sensibles a mayúsculas:
,
,
, y
todos se refieren a la misma regla. Los nombres de las reglas constan de una letra seguida de letras, números y guiones.
Los corchetes angulares ( <
, >
) no son necesarios alrededor de los nombres de las reglas (ya que están en BNF). Sin embargo, pueden usarse para delimitar el nombre de una regla cuando se usan en prosa para discernir un nombre de regla.
Valores terminales
Los terminales se especifican con uno o más caracteres numéricos.
Los caracteres numéricos se pueden especificar como el signo de porcentaje %
, seguido de la base ( b
= binario, d
= decimal y x
= hexadecimal), seguido del valor, o la concatenación de valores (indicado por .
). Por ejemplo, un retorno de carro se especifica %d13
en decimal o %x0D
hexadecimal. Un retorno de carro seguido de un salto de línea se puede especificar con concatenación como %d13.10
.
El texto literal se especifica mediante el uso de una cadena entre comillas ( "
). Estas cadenas no distinguen entre mayúsculas y minúsculas y el juego de caracteres utilizado es (US-) ASCII. Por lo tanto, la cadena "abc"
coincidirá con "abc", "Abc", "aBc", "abC", "ABc", "AbC", "aBC" y "ABC". RFC 7405 agregó una sintaxis para cadenas que distinguen entre mayúsculas y minúsculas: %s"aBc"
solo coincidirá con "aBc". Antes de eso, una cadena que distingue entre mayúsculas y minúsculas solo podía especificarse enumerando los caracteres individuales: para coincidir con "aBc", la definición sería %d97.66.99
. Una cadena también se puede especificar explícitamente como que no distingue entre mayúsculas y minúsculas con un %i
prefijo.
Operadores
Espacio en blanco
El espacio en blanco se utiliza para separar elementos de una definición; para que el espacio se reconozca como delimitador, debe incluirse explícitamente. La referencia explícita para un solo carácter de espacio en blanco es WSP
(espacio en blanco lineal) y LWSP
es para cero o más caracteres de espacio en blanco con nuevas líneas permitidas. La LWSP
definición en RFC5234 es controvertida [4] porque se necesita al menos un carácter de espacio en blanco para formar un delimitador entre dos campos.
Las definiciones están alineadas a la izquierda. Cuando se requieren varias líneas (para facilitar la lectura), las líneas de continuación se sangran con espacios en blanco.
Comentario
; comment
Un punto y coma ( ;
) inicia un comentario que continúa hasta el final de la línea.
Concatenación
Rule1 Rule2
Una regla se puede definir enumerando una secuencia de nombres de reglas.
Para hacer coincidir la cadena "aba", se pueden utilizar las siguientes reglas:
fu = %x61 ; a
bar = %x62 ; b
mumble = fu bar fu
Alternativa
Rule1 / Rule2
Una regla se puede definir mediante una lista de reglas alternativas separadas por un solidus ( /
).
Para aceptar la regla fu o la barra de reglas , se podría construir la siguiente regla:
fubar = fu / bar
Alternativas incrementales
Rule1 =/ Rule2
Se pueden agregar alternativas adicionales a una regla mediante el uso de =/
entre el nombre de la regla y la definición.
La regla
ruleset = alt1 / alt2 / alt3 / alt4 / alt5
es equivalente a
ruleset = alt1 / alt2
ruleset =/ alt3
ruleset =/ alt4 / alt5
Rango de valores
%c##-##
Se puede especificar un rango de valores numéricos mediante el uso de un guión ( -
).
La regla
OCTAL = "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7"
es equivalente a
OCTAL = %x30-37
Grupo de secuencia
(Rule1 Rule2)
Los elementos se pueden colocar entre paréntesis para agrupar reglas en una definición.
Para que coincida con "ab d" o "ac d", se podría construir la siguiente regla:
group = a (b / c) d
Para que coincida con "ab" o "cd", se podrían construir las siguientes reglas:
group = a b / c d
group = (a b) / (c d)
Repetición variable
n*nRule
Para indicar la repetición de un elemento, *element
se utiliza el formulario . El opcional da el número mínimo de elementos que se incluirán (con el valor predeterminado de 0). El opcional
da el número máximo de elementos que se incluirán (con el valor predeterminado de infinito).
Se utiliza *element
para cero o más elementos, *1element
para cero o un elemento, 1*element
para uno o más elementos y 2*3element
para dos o tres elementos, cf. expresiones regulares e*
, e?
, e+
y e{2,3}
.
Repetición específica
nRule
Para indicar un número explícito de elementos, element
se utiliza el formulario y es equivalente a *element
.
Úselo 2DIGIT
para obtener dos dígitos numéricos y 3DIGIT
para obtener tres dígitos numéricos. ( DIGIT
se define a continuación en " Reglas básicas ". Consulte también el código postal en el ejemplo siguiente).
Secuencia opcional
[Rule]
Para indicar un elemento opcional, las siguientes construcciones son equivalentes:
[fubar snafu]
*1(fubar snafu)
0*1(fubar snafu)
Precedencia del operador
Los siguientes operadores tienen la prioridad dada desde el enlace más estricto hasta el enlace más flexible:
- Cadenas, formación de nombres
- Comentario
- Rango de valores
- Repetición
- Agrupación, opcional
- Concatenación
- Alternativa
El uso del operador alternativo con concatenación puede resultar confuso y se recomienda que se utilice la agrupación para hacer grupos de concatenación explícitos.
Reglas básicas
Las reglas básicas se definen en el estándar ABNF.
Regla | Definicion formal | Significado |
---|---|---|
ALFA | % x41–5A /% x61–7A | Letras ASCII en mayúsculas y minúsculas (A – Z, a – z) |
DÍGITO | % x30–39 | Dígitos decimales (0 a 9) |
HEXDIG | DÍGITO / "A" / "B" / "C" / "D" / "E" / "F" | Dígitos hexadecimales (0–9, A – F, af) |
DQUOTE | % x22 | Cotización doble |
SP | % x20 | Espacio |
HTAB | % x09 | Pestaña horizontal |
WSP | SP / HTAB | Ficha de espacio y horizontal |
LWSP | * (WSP / CRLF WSP) | Espacio en blanco lineal (última línea nueva) |
VCHAR | % x21–7E | Caracteres visibles (impresos) |
CARBONIZARSE | % x01–7F | Cualquier carácter ASCII, excepto NUL |
OCTETO | % x00 – FF | 8 bits de datos |
CTL | % x00–1F /% x7F | Control S |
CR | % x0D | Retorno de carro |
LF | % x0A | Linea de alimentación |
CRLF | CR LF | Nueva línea estándar de Internet |
UN POCO | "0" / "1" | Dígito binario |
Tenga en cuenta que en el diagrama de reglas básicas, el conjunto de caracteres CHAR2 está incluido en char-val y CHAR3 está incluido en prose-val en la especificación RFC. Se nombran aquí para mayor claridad en el diagrama de sintaxis principal.
Ejemplo
El ejemplo de dirección postal que se da en la página del formulario Backus – Naur aumentado (ABNF) se puede especificar de la siguiente manera:
dirección-postal = nombre-parte calle zip-partenombre-parte = * (parte personal SP ) apellido [ sufijo SP ] CRLF nombre-parte = / parte personal CRLF personal-parte = primero-nombre / ( inicial "" ) primero-nombre = * ALPHA inicial = ALPHA último nombre = * ALPHA sufijo = ( "Jr." / "Sr." / 1 * ( "I" / " V " / " X " ))street = [ apt SP ] house-num SP street-name CRLF apt = 1 * 4 DIGIT house-num = 1 * 8 ( DIGIT / ALPHA ) street-name = 1 * VCHARzip-part = town-name "," SP estado 1 * 2 SP código postal CRLF town-name = 1 * ( ALPHA / SP ) estado = 2 ALPHA código postal = 5 DIGIT [ "-" 4 DIGIT ]
Trampas
RFC 5234 agrega una advertencia junto a la definición de LWSP de la siguiente manera:
El uso de esta regla de espacio en blanco lineal permite líneas que contienen solo espacios en blanco que ya no son legales en los encabezados de correo y han causado problemas de interoperabilidad en otros contextos. No lo utilice al definir encabezados de correo y utilícelo con precaución en otros contextos.
Referencias
- ^ "Estándares oficiales de protocolo de Internet" . Editor de RFC. 2010-02-21. Archivado desde el original el 9 de febrero de 2010 . Consultado el 21 de febrero de 2010 .
- ^ Crocker, D .; Overell, P. (enero de 2008). "BNF aumentado para especificaciones de sintaxis: ABNF" (texto sin formato) . Editor de RFC. pag. 16 . Consultado el 21 de febrero de 2010 .
- ^ "Índice RFC" . Editor de RFC. 2010-02-19. Archivado desde el original el 9 de febrero de 2010 . Consultado el 21 de febrero de 2010 .
- ^ RFC Errata 3096 .