Notación BNF
Las gramáticas de tipo 2 (que incluyen a las gramáticas de tipo 3) tienen métodos alternativos
útiles para desplegar las producciones. Una alternativa que se encuentra con frecuencia es la
notación BNF (forma Backus-Naur). Se sabe que los lados izquierdos de todas las
producciones en una gramática de tipo 2 son símbolos no terminales únicos. Para cada uno de tales
símbolos w, se combina todas las producciones que tienen a w como lado izquierdo.
El símbolo w permanece a la izquierda, y todos los lados derechos asociados con w
son enumerados juntos, separados por el símbolo |. El símbolo
relacional se reemplaza por el símbolo
::=. Por último, los símbolos no terminales, cuando aparezcan, serán encerrados entre paréntesis
agudos < >. Esto tiene la ventaja adicional de que los símbolos no terminales pueden tener
espacios dentro de ellos. Así, <palabra1 palabra2> muestra que la cadena entre paréntesis debe
considerarse como una "palabra", no como dos palabras. Es decir, se puede utilizar el espacio
como una "letra" conveniente y legítima en una palabra, mientras que se utilice los paréntesis
agudos para delimitar las palabras.
Ejemplo 1. En la notación BNF, las producciones del ejemplo 1 de la sección 10.1
aparecen como sigue:
<oración> ::= <sujeto> <predicado>
<sujeto> ::= Juan | Julia
<predicado> ::= <verbo> <adverbio>
<verbo> ::= maneja | corre
<adverbio> ::= descuidadamente | rápido | frecuentemente
Ejemplo 2. En la notación BNF, las producciones del ejemplo 2 de la sección 10.1
aparecen como sigue:
<vo> ::= a<w>
<w> ::= bb<w> | c
Observe que el lado izquierdo de una producción puede aparecer tambén en una de las cadenas del
lado derecho. Así, en la segunda línea del ejemplo 2, <w> aparece a la
izquierda, y aparece en la cadena bb<w> de la derecha. Cuando esto
ocurre, se dice que la producción correspondiente w
bbw es recursiva.
Si una producción recursiva tiene a w
como lado izquierdo, la producción es normal si w aparece sólo una vez en el
lado derecho y es el símbolo del extremo derecho. En el lado derecho también pueden aparecer
otros símbolos no terminales. La producción recursiva w
bbw del ejemplo 2 es normal.
Observe que cualquier producción recursiva que aparezca en una gramática (regular) de tipo 3
es normal, por la definición del tipo 3.
Ejemplo 3. La notación BNF se utiliza con frecuencia para especificar los lenguajes
de programación reales. PASCAL y muchos otros lenguajes tenían dadas sus gramáticas en BNF
inicialmente. En este ejemplo se considerará un pequeño subconjunto de la gramática de PASCAL.
Este subconjunto describe la sintaxixs de los números decimales y se puede ver como una
minigramática cuyo lenguaje correspondiente consta precisamente de todos los números decimales
formados de manera adecuada.
Sea S = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, .}. Sea V la unión de S
con el conjunto
N = {número-decimal, fracción-decimal, entero-sin-signo, dígito}.
Así, sea G la gramática con conjuntos de símbolos V y S, con símbolo
inicial "número decimal" y con las producciones dadas en forma BNF como sigue:
- <número-decimal> ::= <entero-sin-signo> | <fracción-decimal> |
- <fracción-decimal> ::= <entero-sin-signo> <fracción-decimal>
- <entero-sin-signo> ::= <dígito> | <dígito> <entero-sin-signo>
- <dígito> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
La figura 10.4 muestra un árbol de deducción, en esta gramática, del número decimal 23.14.
Observe que el enunciado BNF número 3 es recursivo en la segunda parte de su lado derecho. Es
decir, la producción "entero-sin-signo
dígito entero-sin-signo" es recursiva y también es normal. En general, se sabe que muchas
gramáticas diferentes pueden producir el mismo lenguaje. Si se reemplaza la línea anterior
número 3 con la línea
3'. <entero-sin-signo> ::= <dígito> | <entero-sin-signo> <dígito>
se tendría una gramática diferente que produce exactamente el mismo lenguaje, a saber, los
números decimales formados de manera correcta. Sin embargo, esta gramática contiene una
producción recursiva que no es normal.

Figura 10.4
Ejemplo 4. Como en el ejemplo 3, se proporcionará una gramática que especifique una
parte de varios lenguajes de programación reales. En estos lenguajes, un identificador
(un nombre para una variable, función, subrutina, etcétera) debe estar compuesto por letras
y dígitos y debe comenzar con una letra. La siguiente gramática, con las producciones dadas
en BNF, tiene precisamente estos identificadores como su lenguaje.
G = (V, S, identificador,
)
N = {identificador, resto, dígito, letra}
S = {a, b, c, . . . , z, 0, 1, 2, 3, . . . , 9},
V = N U S
- <identificador> ::= <letra> | <letra> <resto>
- <resto> ::= <letra> | <dígito> | <letra> <resto> | <dígito> <resto>
- <resto> ::= a | b | c . . . | z
- <dígito> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6| 7 | 8 | 9
De nuevo, se observa que las producciones "resto
letra resto" y "resto
dígito resto"
que aparecen en el enunciado 2 BNF, son recursivas y normales.
Alberto Pacheco
http://www.socrates.itch.edu.mx/~apacheco/teoria/bnf.htm
Ultima actualización: Mzo 1, 1999