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 son de 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 inicial y ε denota la cadena vacía . Además, ni B ni C pueden ser el símbolo inicial , y la tercera regla de producción sólo puede aparecer si ε está en L ( G ), el lenguaje producido por la gramática libre de contexto G. [4] : 92–93, 106
Cada gramática en forma normal de Chomsky está libre de contexto y, a la inversa, cada gramática libre de contexto se puede transformar en una equivalente [ nota 1] que está en forma normal de Chomsky y tiene 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 orden determinado; 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.
Introducir 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 lenguaje producido por la gramática y S 0 no aparecerá en el lado derecho de ninguna regla.
Para eliminar cada regla
Dado que el símbolo terminal a 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.
Cambia cada regla
a
Si aparecen varios símbolos terminales en el lado derecho, reemplace simultáneamente cada uno de ellos por su símbolo no terminal asociado. Esto no cambia 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 Ai 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 inicial de la gramática.
Para eliminar todas las reglas de esta forma, primero determine el conjunto de todos los no terminales que derivan ε. Hopcroft y Ullman (1979) llaman a estos no terminales anulables y los calculan de la siguiente manera:
Obtener una gramática intermedia reemplazando cada regla
por todas las versiones con alguna X anulable que se omite. Al eliminar en esta gramática cada regla ε, a menos que su lado izquierdo sea el símbolo inicial, se obtiene la gramática transformada. [4] : 90
Por ejemplo, en la siguiente gramática, con el símbolo inicial S 0 ,
el no terminal A , y por tanto también B , es anulable, mientras que ni C ni S 0 lo son. De ahí se obtiene la siguiente gramática intermedia: [nota 3]
En esta gramática, todas las reglas ε se han " integrado en el sitio de llamada". [nota 4] En el siguiente paso, se pueden eliminar, lo que da como resultado 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 , bab , bac , bb , bc , c }, pero no tiene reglas ε.
Una regla unitaria 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 terminales y no terminales, agregue la regla
a menos que se trate de una regla de unidad que ya haya sido (o esté siendo) eliminada. La omisión del símbolo no terminal B en la gramática resultante es posible debido a que B es miembro del cierre unitario 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 logrado por otras. Por ejemplo, START reintroducirá una regla de unidad si se aplica después de UNIT . La tabla muestra qué pedidos 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 | GRAMO | para denotar el tamaño de la gramática original G , el tamaño ampliado en el peor de los casos puede oscilar entre | GRAMO | 2 a 2 2 |G| , dependiendo del algoritmo de transformación utilizado. [8] : 7 La ampliación del tamaño gramatical depende del orden entre DEL y BIN . Puede ser exponencial cuando DEL se realiza primero, pero es lineal en caso contrario. UNIT puede incurrir en una explosión cuadrática en el tamaño de la gramática. [8] : 5 Los ordenamientos INICIO , TERM , BIN , DEL , UNIT y START , BIN , DEL , UNIT , TERM conducen a la mínima explosión (es decir, cuadrática).
La siguiente gramática, con el símbolo inicial 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í por simplicidad, ya que en la interfaz del compilador su estructura interna generalmente no es considerada por el analizador . 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 tiene este aspecto:
Después del paso "BIN", se obtiene la siguiente gramática:
Como no existen reglas ε, el paso "DEL" no cambia la gramática. Después del paso "UNIDAD", se obtiene la siguiente gramática, que está en forma normal de Chomsky:
Los Na introducidos en el paso "TERM" son PowOp , Open y Close . Los Ai introducidos 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 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 . Cuando se utiliza esta definición, o puede ser el símbolo de inicio. Sólo aquellas gramáticas libres de contexto que no generan la cadena vacía pueden transformarse a la forma reducida de Chomsky.
En una carta en la que proponía un término forma Backus-Naur (BNF), Donald E. Knuth implicaba una "sintaxis BNF en la que todas las definiciones tienen esa forma, se puede decir que está en 'forma normal Floyd'",
donde , y son símbolos no terminales, y es un símbolo terminal, porque Robert W. Floyd descubrió que cualquier sintaxis BNF se puede convertir a la anterior en 1961. [11] Pero retiró este término, "ya que sin duda muchas personas han usado este término de forma independiente". Es un hecho simple en su propio trabajo, y el punto es sólo incidental respecto de 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 paso de preprocesamiento, por ejemplo, el algoritmo CYK , un análisis ascendente para gramáticas libres de contexto, y su variante probabilística CKY. [13]
{{cite book}}
: Mantenimiento CS1: nombres numéricos: lista de autores ( enlace ) (páginas 171-183 de la sección 7.1: Forma normal de Chomsky)