En la teoría del lenguaje formal , se dice que una gramática libre de contexto , G , está en la forma normal de Chomsky (descrita por primera vez por Noam Chomsky ) [1] si todas sus reglas de producción tienen la forma: [2] [3]
donde A , B y C son símbolos no terminales , la letra a es un símbolo terminal (un símbolo que representa un valor constante), S es el símbolo de inicio y ε denota la cadena vacía . Además, ni B ni C pueden ser el símbolo de inicio , y la tercera regla de producción solo puede aparecer si ε está en L ( G ), el lenguaje producido por la gramática libre de contexto G . [4] : 92–93, 106
Toda gramática en forma normal de Chomsky es libre de contexto y, a la inversa, toda gramática libre de contexto puede transformarse en una equivalente [ nota 1] que esté en forma normal de Chomsky y tenga un tamaño no mayor que el cuadrado del tamaño de la gramática original.
Para convertir una gramática a la forma normal de Chomsky, se aplica una secuencia de transformaciones simples en un cierto orden; esto se describe en la mayoría de los libros de texto sobre teoría de autómatas . [4] : 87–94 [5] [6] [7] La presentación aquí sigue a Hopcroft, Ullman (1979), pero está adaptada para usar los nombres de transformación de Lange, Leiß (2009). [8] [nota 2] Cada una de las siguientes transformaciones establece una de las propiedades requeridas para la forma normal de Chomsky.
Introduzca un nuevo símbolo de inicio S 0 y una nueva regla
donde S es el símbolo de inicio anterior. Esto no cambia el idioma producido por la gramática y S 0 no aparecerá en el lado derecho de ninguna regla.
Para eliminar cada regla
con un símbolo terminal a que no es el único símbolo en el lado derecho, introduzca, para cada terminal, un nuevo símbolo no terminal N a , y una nueva regla
Cambiar cada regla
a
Si aparecen varios símbolos terminales en el lado derecho, reemplácelos simultáneamente por su símbolo no terminal asociado. Esto no modifica el lenguaje producido por la gramática. [4] : 92
Reemplazar cada regla
con más de 2 no terminales X 1 ,..., X n por reglas
donde A i son nuevos símbolos no terminales. Nuevamente, esto no cambia el lenguaje producido por la gramática. [4] : 93
Una regla ε es una regla de la forma
donde A no es S 0 , el símbolo de inicio de la gramática.
Para eliminar todas las reglas de esta forma, primero se determina el conjunto de todos los no terminales que derivan ε. Hopcroft y Ullman (1979) llaman a estos no terminales nulos y los calculan de la siguiente manera:
Obtenga una gramática intermedia reemplazando cada regla
en todas las versiones se omiten algunos valores nulos de X i . Al eliminar en esta gramática cada regla ε, a menos que su lado izquierdo sea el símbolo de inicio, se obtiene la gramática transformada. [4] : 90
Por ejemplo, en la siguiente gramática, con símbolo de inicio S 0 ,
El no terminal A , y por lo tanto también B , es nulo, mientras que ni C ni S 0 lo son. Por lo tanto, se obtiene la siguiente gramática intermedia: [nota 3]
En esta gramática, todas las reglas ε se han " incorporado en línea en el sitio de la llamada". [nota 4] En el siguiente paso, se pueden eliminar, obteniendo la gramática:
Esta gramática produce el mismo lenguaje que la gramática de ejemplo original, a saber. { ab , aba , abaa , abab , abac , abb , abc , b , ba , baa , bab , bac , bb , bc , c }, pero no tiene reglas ε.
Una regla de unidad es una regla de la forma
donde A , B son símbolos no terminales. Para eliminarlo, para cada regla
donde X 1 ... X n es una cadena de no terminales y terminales, agregue la regla
a menos que se trate de una regla de unidad que ya se ha eliminado (o se está eliminando). La omisión del símbolo no terminal B en la gramática resultante es posible debido a que B es un miembro del cierre de unidad del símbolo no terminal A. [ 9]
Al elegir el orden en el que se aplicarán las transformaciones anteriores, se debe tener en cuenta que algunas transformaciones pueden destruir el resultado obtenido por otras. Por ejemplo, START reintroducirá una regla de unidad si se aplica después de UNIT . La tabla muestra qué ordenaciones se admiten.
Además, el aumento en el tamaño de la gramática en el peor de los casos [nota 5] depende del orden de transformación. Usando | G | para denotar el tamaño de la gramática original G , el aumento de tamaño en el peor de los casos puede variar de | G | 2 a 2 2 |G| , dependiendo del algoritmo de transformación usado. [8] : 7 El aumento en el tamaño de la gramática depende del orden entre DEL y BIN . Puede ser exponencial cuando DEL se hace primero, pero es lineal en caso contrario. UNIT puede incurrir en un aumento cuadrático en el tamaño de la gramática. [8] : 5 Los ordenamientos START , TERM , BIN , DEL , UNIT y START , BIN , DEL , UNIT , TERM conducen al menor aumento (es decir, cuadrático).
La siguiente gramática, cuyo símbolo inicial es Expr , describe una versión simplificada del conjunto de todas las expresiones aritméticas sintácticas válidas en lenguajes de programación como C o Algol60 . Tanto el número como la variable se consideran símbolos terminales aquí para simplificar, ya que en la interfaz de un compilador, el analizador no suele tener en cuenta su estructura interna . El símbolo terminal "^" denota exponenciación en Algol60.
En el paso "INICIO" del algoritmo de conversión anterior, solo se agrega una regla S 0 → Expr a la gramática. Después del paso "TERM", la gramática se ve así:
Después del paso "BIN", se obtiene la siguiente gramática:
Como no existen reglas ε, el paso "DEL" no modifica la gramática. Después del paso "UNIT", se obtiene la siguiente gramática, que está en la forma normal de Chomsky:
Las N a introducidas en el paso "TERM" son PowOp , Open y Close . Las A i introducidas en el paso "BIN" son AddOp_Term , MulOp_Factor , PowOp_Primary y Expr_Close .
Otra forma [4] : 92 [10] de definir la forma normal de Chomsky es:
Una gramática formal está en la forma reducida de Chomsky si todas sus reglas de producción son de la forma:
donde , y son símbolos no terminales, y es un símbolo terminal . Al utilizar esta definición, o puede ser el símbolo de inicio. Solo aquellas gramáticas libres de contexto que no generan la cadena vacía pueden transformarse en la forma reducida de Chomsky.
En una carta en la que propuso un término forma Backus–Naur (BNF), Donald E. Knuth dio a entender una "sintaxis BNF en la que todas las definiciones tienen una forma tal que se puede decir que están en 'forma normal de Floyd'",
donde , y son símbolos no terminales, y es un símbolo terminal, porque Robert W. Floyd encontró que cualquier sintaxis BNF puede convertirse a la anterior en 1961. [11] Pero retiró este término, "ya que sin duda muchas personas han usado independientemente este simple hecho en su propio trabajo, y el punto es solo incidental a las consideraciones principales de la nota de Floyd". [12] Mientras que la nota de Floyd cita el artículo original de Chomsky de 1959, la carta de Knuth no lo hace.
Además de su importancia teórica, la conversión CNF se utiliza en algunos algoritmos como un paso de preprocesamiento, por ejemplo, el algoritmo CYK , un análisis de abajo hacia arriba para gramáticas libres de contexto, y su variante probabilística CKY. [13]
{{cite book}}
: CS1 maint: nombres numéricos: lista de autores ( enlace ) (páginas 171-183 de la sección 7.1: Forma normal de Chomsky)