En informática , la forma aumentada de Backus-Naur ( ABNF ) es un metalenguaje basado en la forma de Backus-Naur (BNF) pero que consta de su propia sintaxis y reglas de derivación. La motivación para ABNF es definir una herramienta fácilmente utilizable para definir el formato de los objetos de carga útil de los protocolos de comunicación y las unidades de protocolo. Está definida por el estándar de Internet 68 ("STD 68", tipo case sic), que a partir de diciembre de 2010 fue RFC 5234 , y a menudo sirve como lenguaje de definición para los protocolos de comunicación de la IETF . [ 1 ] [ 2 ]
RFC 5234 reemplaza a RFC 4234 , 2234 y 733. [ 3 ] RFC 7405 lo actualiza, agregando una sintaxis para especificar literales de cadena 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 LFdonde regla es un no terminal que no distingue entre mayúsculas y minúsculas , la definición consiste en 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.
Los nombres de las reglas no distinguen entre mayúsculas y minúsculas: <rulename>, <Rulename>, <RULENAME>, y <rUlENamE>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 obligatorios alrededor de los nombres de las reglas (como sí lo son en la BNF). Sin embargo, pueden usarse para delimitar el nombre de una regla en prosa para identificarla.
Valores terminales
Los símbolos terminales son los componentes básicos de la notación ABNF. Los símbolos no terminales se construyen sobre ellos. Especifican una secuencia de caracteres que se corresponden literalmente. (Técnicamente, el símbolo terminal en ABNF es el carácter individual [que para ABNF no es más que un número entero no negativo], pero para facilitar la escritura, la sintaxis se ha ampliado para permitir la coincidencia de secuencias de caracteres).
Los valores terminales pueden especificarse numéricamente, en cuyo caso corresponden a un código de carácter o una secuencia de códigos. Dicho valor se especifica 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 (indicada por .). Por ejemplo, un retorno de carro se especifica mediante %d13en decimal o %x0Den hexadecimal. Un retorno de carro seguido de un salto de línea puede especificarse con la concatenación como %d13.10.
El texto literal se especifica mediante el uso de una cadena encerrada entre comillas ( "). Estas cadenas no distinguen entre mayúsculas y minúsculas, y el conjunto 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 se podía especificar enumerando los caracteres individuales: para que coincida 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 %iprefijo .
Otro tipo de valor básico es el "prose-val", una cadena entre corchetes que describe con qué texto en lenguaje natural debe coincidir una regla . Sin embargo, las gramáticas ABNF que utilizan prose-vals no se pueden implementar automáticamente en un programa analizador sintáctico sin intervención humana, por lo que generalmente solo se utilizan como último recurso.
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 LWSPes para cero o más caracteres de espacio en blanco con saltos de línea permitidos.
Las definiciones están alineadas a la izquierda. Cuando se requieren varias líneas (para facilitar la lectura), las líneas siguientes se indentan 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 puede definirse enumerando una secuencia de nombres de reglas.
Para que coincida con la cadena “aba”, se podrían utilizar las siguientes reglas:
fu=%x61; abar=%x62; bmumble=fubarfu
Alternativa
Rule1 / Rule2
Una regla puede definirse mediante una lista de reglas alternativas separadas por una barra oblicua ( /).
Para aceptar la regla fu o la regla bar , 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/alt2ruleset=/alt3ruleset=/alt4/alt5
es por lo tanto equivalente a
ruleset=alt1/alt2/alt3/alt4/alt5
Rango de valores
%c##-##
Se puede especificar un rango de valores numéricos mediante el uso de un guion ( -).
La regla
OCTAL=%x30-37
es equivalente a
OCTAL="0"/"1"/"2"/"3"/"4"/"5"/"6"/"7"
Grupo de secuencias
(Rule1 Rule2)
Los elementos pueden colocarse entre paréntesis para agrupar reglas en una definición.
Para que coincida "ab d" o "ac d", se podría construir la siguiente regla:
group=a(b/c)d
Para que coincidan “ab” o “cd”, se podrían construir las siguientes reglas:
group=ab/cdgroup=(ab)/(cd)
Repetición variable
n*nRule
Para indicar la repetición de un elemento, se utiliza la forma. El valor opcional indica el número mínimo de elementos a incluir (por defecto 0). El valor opcional indica el número máximo de elementos a incluir (por defecto infinito).<a>*<b>element<a><b>
Úselo *elementpara cero o más elementos, *1elementpara cero o un elemento, 1*elementpara uno o más elementos y 2*3elementpara dos o tres elementos, cf. expresiones regularese* , e?, e+y e{2,3}.
Repetición específica
nRule
Para indicar un número explícito de elementos, se utiliza la forma y es equivalente a .<a>element<a>*<a>element
Se utiliza 2DIGITpara obtener dos dígitos numéricos y 3DIGITpara obtener tres dígitos numéricos. ( DIGITSe define más abajo en " Reglas básicas ". Véase también el código postal en el ejemplo siguiente).
Secuencia opcional
[Rule]
Para indicar un elemento opcional, las siguientes construcciones son equivalentes:
[fubarsnafu]*1(fubarsnafu)0*1(fubarsnafu)
Prioridad del operador
Los siguientes operadores tienen la precedencia indicada, 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, por lo que se recomienda utilizar la agrupación para crear grupos de concatenación explícitos.
Reglas básicas
Las reglas básicas se definen en el estándar ABNF. Estas reglas proporcionan definiciones para construcciones de uso común. El contenido exacto de las reglas básicas depende de la página de códigos utilizada, pero para la base común de Internet de ASCII de 7 bits (o un superconjunto de la misma), se define como:
LWSP
El lenguaje ABNF se originó en el RFC 733 , el estándar de 1977 para los MENSAJES DE TEXTO DE LA RED ARPA, una forma temprana de correo electrónico . Definía el "espacio en blanco lineal" como un delimitador en los encabezados de correo:
linear-white-space = 1* ([ CRLF ] LWSP - char ) ; similar al LWSP moderno LWSP - char = SPACE / HTAB ; equivalente al WSP modernoEl lenguaje ABNF se describió independientemente del correo electrónico en el RFC 2234 de 1997. Incluía la regla "LWSP" en su forma moderna, que no tiene la parte que especifica la repetición mínima. Esto es bastante inusual porque, lógicamente hablando, se necesita al menos un carácter de espacio en blanco para formar un delimitador entre dos campos. Esta diferencia se observó en la errata del RFC 3096 de 2012 (presentada para el RFC 5234, que heredó esta construcción), pero para entonces ya era demasiado tarde para cambiar la definición, ya que otros estándares ya habían utilizado la regla para sus propios fines. [ 4 ] 1LWSP
El RFC 5234 de 2008 añade una advertencia junto con la definición de LWSP, haciendo referencia a su desviación de los estándares de correo electrónico:
El uso de esta regla de espacios en blanco lineales permite líneas que contienen solo espacios en blanco, lo cual ya no es válido en los encabezados de correo y ha causado problemas de interoperabilidad en otros contextos. No la utilice al definir encabezados de correo y úsela con precaución en otros contextos.
El estándar de correo electrónico contemporáneo, RFC 5322 de 2008, no utiliza el término "espacio en blanco lineal" ni el valor LWSP predefinido. En su lugar, utiliza el espacio en blanco plegable (FWS):
FWS = ([ * WSP CRLF ] 1* WSP ) / obs-FWS ; Espacio en blanco de plegado obs-FWS = 1* WSP * ( CRLF 1* WSP ) ; Espacio en blanco de plegado obsoleto ; equivalente a: LWSP-char [linear-white-space] (reglas RFC 733) ; equivalente a: WSP LWSP (reglas centrales modernas)Ejemplos
Dirección postal de EE. UU.
El ejemplo de dirección postal (de EE. UU.) que se da en la página del formulario Backus-Naur aumentado (ABNF) se puede especificar de la siguiente manera:
dirección postal = parte del nombre calle parte del código postalparte-del-nombre = * ( parte-personal SP ) apellido [ sufijo SP ] CRLF parte-del-nombre =/ parte-personal CRLFparte-personal = nombre / ( inicial "." ) nombre = * ALPHA inicial = ALPHA apellido = * ALPHA sufijo = ( "Jr." / "Sr." / 1* ( "I" / "V" / "X" ))calle = [ apt SP ] número de casa SP nombre de calle CRLF apt = 1*4 DÍGITO número de casa = 1*8 ( DÍGITO / ALFA ) nombre de calle = 1* VCHARparte-zip = nombre-ciudad "," SP estado 1*2 SP código-ciudad CRLF nombre-ciudad = 1* ( ALPHA / SP ) estado = 2 ALPHA código-ciudad = 5 DÍGITOS [ "-" 4 DÍGITOS ]Representación de sí misma por parte de ABNF
La sintaxis de ABNF en sí misma puede representarse con una ABNF como la siguiente:
lista de reglas = 1 * ( regla / ( * WSP c-nl ) )regla = nombre de regla definido-como elementos c-nl ; continúa si la siguiente línea comienza ; con espacio en blanconombre de regla = ALPHA * ( ALPHA / DIGIT / "-" )definido-como = * c-wsp ( "=" / "=/" ) * c-wsp ; definición de reglas básicas y ; alternativas incrementaleselementos = alternancia * WSPc-wsp = WSP / ( c-nl WSP )c-nl = comentario / CRLF ; comentario o salto de líneacomentario = ";" * ( WSP / VCHAR ) CRLFalternancia = concatenación * ( * c-wsp "/" * c-wsp concatenación )concatenación = repetición * ( 1 * repetición c-wsp )repetición = [ repetir ] elementorepetir = 1 * DÍGITO / ( * DÍGITO "*" * DÍGITO )elemento = nombre de regla / grupo / opción / valor de carácter / valor numérico / valor de prosagrupo = "(" * alternancia c-wsp * c-wsp ")"opción = "[" * alternancia c-wsp * c-wsp "]"char-val = DQUOTE * ( %x20-21 / %x23-7E ) DQUOTE ; cadena entrecomillada de SP y VCHAR ; sin DQUOTEvalor-núm = "%" ( valor-bin / valor -dec / valor-hexadecimal )bin-val = "b" 1* BIT [ 1* ( "." 1* BIT ) / ( "-" 1* BIT ) ] ; serie de valores de bits concatenados ; o un único rango ONEOFdec-val = "d" 1* DÍGITO [ 1* ( "." 1* DÍGITO ) / ( "-" 1* DÍGITO ) ]valor-hex = "x" 1* HEXDIG [ 1* ( "." 1* HEXDIG ) / ( "-" 1* HEXDIG ) ]prose-val = "<" * ( %x20-3D / %x3F-7E ) ">" ; cadena entre corchetes de SP y VCHAR ; sin ángulos ; descripción en prosa, para ser utilizada como ; último recursoReferencias
- ↑ "Estándares oficiales del protocolo de Internet" . Editor de RFC. 21 de febrero de 2010. Archivado del original el 9 de febrero de 2010. Consultado el 21 de febrero de 2010 .
- ↑ Crocker, D.; Overell, P. (enero de 2008). "BNF aumentada para especificaciones de sintaxis: ABNF" (texto plano) . Editor de RFC. pág. 16. Recuperado el 21 de febrero de 2010 .
- ↑ "Índice RFC" . Editor de RFC. 19 de febrero de 2010. Archivado del original el 9 de febrero de 2010. Consultado el 21 de febrero de 2010 .
- ↑ Errata RFC 3096 .
- Lenguajes formales
- Metalenguajes