Forma extendida de Backus-Naur
En informática, la forma Backus-Naur extendida (EBNF) es una familia de notaciones metasintácticas, cualquiera de las cuales puede usarse para expresar una gramática independiente del contexto. EBNF se utiliza para hacer una descripción formal de un lenguaje formal, como un lenguaje de programación de computadoras. Son extensiones de la notación metasintáctica básica de la forma Backus-Naur (BNF).
El EBNF más antiguo fue desarrollado por Niklaus Wirth, incorporando algunos de los conceptos (con una sintaxis y una notación diferentes) de la notación sintáctica de Wirth. Hoy en día, se utilizan muchas variantes de EBNF. La Organización Internacional de Normalización adoptó una norma EBNF, ISO/IEC 14977, en 1996. Sin embargo, según Zaytsev, este estándar "solo terminó agregando otros tres dialectos al caos" y, después de señalar su falta de éxito, también señala que ISO EBNF ni siquiera se utiliza en todas las normas ISO. Wheeler se opone al uso de la norma ISO cuando se usa un EBNF y recomienda considerar notaciones EBNF alternativas como la del Lenguaje de marcado extensible (XML) 1.0 (quinta edición) del W3C.
Este artículo utiliza EBNF según lo especificado por la ISO para ejemplos que se aplican a todos los EBNF. Otras variantes de EBNF usan convenciones sintácticas algo diferentes.
Conceptos básicos
EBNF es un código que expresa la sintaxis de un lenguaje formal. Un EBNF consta de símbolos terminales y reglas de producción no terminales, que son las restricciones que rigen cómo los símbolos terminales se pueden combinar en una secuencia legal. Los ejemplos de símbolos de terminal incluyen caracteres alfanuméricos, signos de puntuación y caracteres de espacio en blanco.
El EBNF define reglas de producción donde las secuencias de símbolos se asignan respectivamente a un no terminal:
dígito excluido cero = "1" Silencio "2" Silencio "3" Silencio "4" Silencio "5" Silencio "6" Silencio "7" Silencio "8" Silencio "9" ;dígito = "0" Silencio dígito excluido cero ;
Esta regla de producción define el dígito no terminal que está en el lado izquierdo de la asignación. La barra vertical representa una alternativa y los símbolos de terminal van entre comillas seguidas de un punto y coma como carácter de terminación. Por lo tanto, un dígito es un 0 o un dígito sin cero que puede ser 1 o 2 o 3 y así sucesivamente hasta 9.
Una regla de producción también puede incluir una secuencia de terminales o no terminales, cada uno separado por una coma:
12 = "1", "2" ;200 = "2", "0", "1" ;trescientos doce = "3", 12 ;doce mil doscientos = 12, 200 ;
Las expresiones que se pueden omitir o repetir se pueden representar mediante llaves {... }:
Número natural = dígito excluido cero, {} dígito } ;
En este caso, las cadenas 1, 2,..., 10,..., 10000,... son expresiones correctas. Para representar esto, todo lo que se establece entre llaves puede repetirse arbitrariamente con frecuencia, incluso no repetirse en absoluto.
Una opción se puede representar mediante corchetes [... ]. Es decir, todo lo que se establece entre corchetes puede estar presente solo una vez, o no estar presente en absoluto:
entero = "0" Silencio [ "- ] Número natural ;
Por lo tanto, un número entero es un cero (0) o un número natural que puede estar precedido por un signo menos opcional.
EBNF también proporciona, entre otras cosas, la sintaxis para describir repeticiones (de un número específico de veces), excluir alguna parte de una producción e insertar comentarios en una gramática EBNF.
Tabla de símbolos
Lo siguiente representa una norma ISO/IEC 14977 propuesta por R. S. Scowen, página 7, tabla 1.
Usage | Notación |
---|---|
definición | = |
concatenación | , |
terminación | ; |
alternancia | Silencio |
opcional | [...] |
repetición | {...} |
agrupación | (...) |
cadena terminal | "... |
cadena terminal | '... ' |
comentario | (*... *) |
secuencia especial | ? |
excepción | - |
Ejemplos
Diagrama de sintaxis
EBNF
Incluso EBNF puede describirse usando EBNF. Considere la gramática esbozada a continuación:
carta = "A" Silencio "B" Silencio "C" Silencio "D" Silencio "E" Silencio "F" Silencio "G" Silencio "H" Silencio "Yo" Silencio "J" Silencio "K" Silencio "L" Silencio "M" Silencio "N" Silencio "O" Silencio "P" Silencio "Q" Silencio "R" Silencio "S" Silencio "T" Silencio "U" Silencio "V" Silencio "W" Silencio "X" Silencio "Y" Silencio "Z" Silencio "a" Silencio "b" Silencio "c" Silencio "d" Silencio "e" Silencio "f" Silencio "g" Silencio "h" Silencio "i" Silencio "j" Silencio "k" Silencio "I" Silencio "m" Silencio "n" Silencio "o" Silencio "p" Silencio "q" Silencio "r" Silencio "s" Silencio "t" Silencio "u" Silencio "v" Silencio "w" Silencio "x" Silencio "y" Silencio "z" ;dígito = "0" Silencio "1" Silencio "2" Silencio "3" Silencio "4" Silencio "5" Silencio "6" Silencio "7" Silencio "8" Silencio "9" ;símbolo = "[ Silencio " Silencio "{" Silencio " Silencio "( Silencio ")" Silencio "Seguido" Silencio "No" Silencio " Silencio ' ' Silencio "=" Silencio "Viva" Silencio ". Silencio " Silencio "; ;carácter = carta Silencio dígito Silencio símbolo Silencio "_" ;Identificador = carta , {} carta Silencio dígito Silencio "_" } ;terminal = " , carácter " , {} carácter " } , " Silencio ' ' , carácter ' ' , {} carácter ' ' } , ' ' ;# = Identificador ;rhs = Identificador Silencio terminal Silencio "[ , rhs , " Silencio "{" , rhs , " Silencio "( , rhs , ")" Silencio rhs , "Viva" , rhs Silencio rhs , " , rhs ;Regla = # , "=" , rhs , "; ;gramática = {} Regla } ;
Pascal
Un lenguaje de programación similar a Pascal que solo permite asignaciones se puede definir en EBNF de la siguiente manera:
(* una simple sintaxis del programa en EBNF - Wikipedia *) programa = PROGRAMA ', espacio blanco, Identificador, espacio blanco, 'BEGIN ', espacio blanco, {} asignación, ";, espacio blanco } FIN. ' ; Identificador = carácter alfabético, {} carácter alfabético Silencio dígito } ; Número = [ "- ] dígito, {} dígito } ; cuerda = ' ' , {} Todos los personajes - ' ' } ' ' ; asignación = Identificador , ":=" , () Número Silencio Identificador Silencio cuerda ) ; carácter alfabético = "A" Silencio "B" Silencio "C" Silencio "D" Silencio "E" Silencio "F" Silencio "G" Silencio "H" Silencio "Yo" Silencio "J" Silencio "K" Silencio "L" Silencio "M" Silencio "N" Silencio "O" Silencio "P" Silencio "Q" Silencio "R" Silencio "S" Silencio "T" Silencio "U" Silencio "V" Silencio "W" Silencio "X" Silencio "Y" Silencio "Z" ; dígito = "0" Silencio "1" Silencio "2" Silencio "3" Silencio "4" Silencio "5" Silencio "6" Silencio "7" Silencio "8" Silencio "9" ; espacio blanco = ? caracteres de espacio blanco ? ; Todos los personajes = ? todos los caracteres visibles ? ;
Por ejemplo, un programa sintácticamente correcto podría ser:
PROGRAMA DEMO1 BEGIN A:=3; B:=45; H:=-100023; C:=A; D123:=B34A; BABOON:=GIRAFFE; TEXTO:="Hola. mundo!"; FIN.
El lenguaje se puede ampliar fácilmente con flujos de control, expresiones aritméticas e instrucciones de entrada/salida. Luego se desarrollaría un lenguaje de programación pequeño y utilizable.
Ventajas sobre BNF
Cualquier gramática definida en EBNF también se puede representar en BNF, aunque las representaciones en este último generalmente son más largas. Por ejemplo, las opciones y las repeticiones no pueden expresarse directamente en BNF y requieren el uso de una regla intermedia o producción alternativa definida como nada o la producción opcional para opción, o la producción repetida de sí mismo, recursivamente, para repetición. Las mismas construcciones todavía se pueden usar en EBNF.
La BNF utiliza los símbolos (<
, >
, |
, ::=
) para sí mismo, pero no incluye comillas alrededor de las cadenas terminales. Esto evita que estos caracteres se utilicen en los idiomas y requiere un símbolo especial para la cadena vacía. En EBNF, los terminales se escriben estrictamente entre comillas ("
..."
o '
...'). Se pueden omitir los corchetes angulares ("<
…>
") para los no terminales.
La sintaxis BNF solo puede representar una regla en una línea, mientras que en EBNF un carácter de terminación, el carácter de punto y coma “;
” marca el final de una regla.
Además, EBNF incluye mecanismos de mejora, definiendo el número de repeticiones, excluyendo alternativas, comentarios, etc.
Convenios
- Según la sección 4 de la norma ISO/IEC 14977, se utilizan los siguientes convenios:
- Cada meta-identificador de Extended BNF está escrito como una o más palabras unidas por hyphens. Sin embargo, unirse a las palabras parece aplicarse sólo a referenciar meta-identificadores fuera de la misma metalanguage, como se ve en los ejemplos de la norma.
- Un metaidentificador terminando con - Símbolo es el nombre de un símbolo terminal de Extended BNF.
- El carácter normal que representa a cada operador de Extended BNF y su precedencia implícita es (más alta precedencia en la parte superior):
* repetition-symbol - excepto simbolo , concatenate-symbol Silencio Definición-separador-símbolo = definir-símbolo ; terminator-symbol . terminator-symbol
- La precedencia normal está dominada por los siguientes pares de corchetes:
El primer simbol es el apostrofe definido por ISO/IEC 646:1991, es decir Unicode U+0027 (U+0027)
(* start-comment-symbol end-comment-symbol *) ' first-quote-symbol first-quote-symbol ' () start-group-symbol end-group-symbol ) [ start-option-symbol end-option-symbol ] {} start-repeat-symbol end-repeat-symbol } ? especial-sequence-symbol especial-sequence-symbol ? " Segundo símbolo Segundo símbolo "
'
); la fuente utilizada en ISO/IEC 14977:1996(E) lo hace muy parecido al agudo, Unicode U+00B4 (´
), así que la confusión a veces surge. Sin embargo, la norma ISO Extended BNF invoca ISO/IEC 646:1991, "ISO 7 bits de caracteres codificados para el intercambio de información", como referencia normativa y no menciona ningún otro conjunto de caracteres, por lo que formalmente, no hay confusión con caracteres Unicode fuera del rango ASCII de 7 bits.
Como ejemplos, las siguientes reglas de sintaxis ilustran las facilidades para expresar la repetición:
aa = "A";bb = 3 * aa, "B";cc = 3 * [aa] "C";dd = {}aa} "D";ee = aa, {}aa} "E";ff = 3 * aa, 3 * [aa] "F";gg = {}3 * aa} "G";
Las cadenas de terminales definidas por estas reglas son las siguientes:
aa: A bb: AAAB cc: C AC AAC AAAC DAD AAD AAAD AAAAD etc. ee: AE AAE AAAE AAAAE AAAAAE etc. ff: AAAF AAAAF AAAAAF AAAAF gg: G AAAG AAAAG etc.
Extensibilidad
De acuerdo con el estándar ISO 14977, EBNF debe ser extensible y se mencionan dos instalaciones. El primero es parte de la gramática EBNF, la secuencia especial, que es un texto arbitrario encerrado entre signos de interrogación. La interpretación del texto dentro de una secuencia especial está más allá del alcance del estándar EBNF. Por ejemplo, el carácter de espacio podría definirse mediante la siguiente regla:
espacio = ? ¿ASCII personaje 32?;
La segunda facilidad para la extensión es usar el hecho de que los paréntesis en EBNF no se pueden colocar al lado de los identificadores (deben estar concatenados con ellos). Lo siguiente es EBNF válido:
algo = Foo, () bar );
Lo siguiente es no EBNF válido:
algo = Foo () bar );
Por lo tanto, una extensión de EBNF podría usar esa notación. Por ejemplo, en una gramática Lisp, la aplicación de funciones podría definirse mediante la siguiente regla:
aplicación = lista() símbolo, {} expresión } );
Trabajo relacionado
- El W3C publica una notación EBNF.
- El W3C utilizó un EBNF diferente para especificar la sintaxis XML.
- The British Standards Institution publicó un estándar para un EBNF: BS 6154 en 1981.
- El IETF utiliza BNF aumentada (ABNF), especificada en RFC 5234.
Contenido relacionado
Acceso múltiple con detección de portadora con prevención de colisiones
Yukihiro Matsumoto
Conectivo lógico