Gramáticas Independientes del Contexto
Una gramática es un conjunto de reglas que nos permite generar todas las palabras válidas de un lenguaje. Es como un “recetario” para crear frases correctas.
4.1 Clasificación de Gramáticas
Sección titulada «4.1 Clasificación de Gramáticas»Una gramática se define como: .
- (o ): Variables no terminales (Mayúsculas, ej: ).
- : Terminales (minúsculas, ej: ).
- : Producciones (Reglas ).
- : Axioma inicial.
Chomsky clasificó las gramáticas en 4 niveles (del 0 al 3). La regla de oro: A mayor número, más restricciones tiene la gramática y menos potente es.
4.1.1 Tipo 0: No Restringida (Recursivamente Enumerable)
Sección titulada «4.1.1 Tipo 0: No Restringida (Recursivamente Enumerable)»-
Definición:
- (La izquierda debe tener algo, no puede ser vacío).
- (La derecha puede ser cualquier cosa o vacío).
-
Explicación Práctica:
- En la izquierda puedes tener mezclas de variables y terminales (ej: ).
- Puedes borrar símbolos, añadir cosas de la nada o acortar la cadena.
- Esta gramática genera Lenguajes Recursivamente Enumerables y son reconocidos por la Máquina de Turing
4.1.2 Tipo 1: Sensible al Contexto
Sección titulada «4.1.2 Tipo 1: Sensible al Contexto»-
Definición: tal que
- Formalmente se ve así: y .
- Significa que la variable se transforma en solo si está rodeada por el contexto y .
- , e
-
Explicación Práctica:
- La longitud de lo de la derecha () siempre es mayor o igual que lo de la izquierda (). Nunca se acorta la cadena (excepto quizás para borrar el axioma inicial).
- Necesitas “vecinos” específicos para activar el cambio.
- Esta gramática genera Lenguajes Sensibles al Contexto y son reconocidos por el Autómata Linealmente Acotado (una versión de la Máquina de Turing que tiene una cinta de memoria finita/limitada)
4.1.3 Tipo 2: Independiente del Contexto (GIC / CFG)
Sección titulada «4.1.3 Tipo 2: Independiente del Contexto (GIC / CFG)»-
Definición:
- (¡OJO! La izquierda siempre es una sola Variable/Mayúscula).
- (La derecha es cualquier combinación).
-
Explicación Práctica:
- Es una sustitución simple. No importa qué haya al lado de la variable, si ves una , puedes cambiarla por su regla.
- Ejemplo: .
- Esta gramática genera Lenguajes Independientes del Contexto y son reconocidos por el Autómata con Pila (PDA).
4.1.4 Tipo 3: Regular
Sección titulada «4.1.4 Tipo 3: Regular»-
Definición:
- (Izquierda es una sola Variable).
- tiene varias formas:
-
Explicación Práctica:
- Es una “cola india”. La cadena va creciendo linealmente.
- Se divide en dos subtipos (que NO se pueden mezclar en la misma gramática):
- Lineal por la Derecha: o . (La variable siempre al final).
- Lineal por la Izquierda: o . (La variable siempre al principio).
- Esta gramática genera Lenguajes Regulares y son reconocidos por los Autómatas Finitos (DFA o NFA), que son máquinas sin memoria auxiliar, limitadas a reconocer patrones lineales.
Relación de Conjuntos:
4.4 Lenguaje de una Gramática Independiente del Contexto
Sección titulada «4.4 Lenguaje de una Gramática Independiente del Contexto»
Se lee así: “El lenguaje generado por la gramática es el conjunto de cadenas …”
-
:
- Esto impone la condición principal: la cadena resultante debe estar formada únicamente por símbolos Terminales ().
- El asterisco () es el Cierre de Kleene, que significa “cualquier combinación de terminales”.
- ¿Por qué es importante? Porque durante la derivación intermedia puedes tener cosas como (que mezcla terminales y variables). La fórmula te dice que eso no es parte del lenguaje final todavía; solo lo es cuando desaparecen todas las letras mayúsculas (Variables).
-
:
- Significa “tal que” o “que cumplen la condición de que…”.
-
:
- : Debes empezar obligatoriamente desde el Símbolo Inicial.
- : La flecha doble con asterisco significa “se deriva en cero o más pasos”. Es decir, no importa si tardas 1 paso o 1.000 pasos en llegar.
- : Debes llegar a la palabra final.
Ejemplo:
S → aSb | εT = {a, b}Derivaciones:
- S ⇒ ε → palabra: "" (cadena vacía)
- S ⇒ aSb ⇒ ab → palabra: “ab”
- S ⇒ aSb ⇒ aaSbb ⇒ aabb → palabra: “aabb”
- S ⇒ aSb ⇒ aaSbb ⇒ aaaSbbb ⇒ aaabbb → palabra: “aaabbb”
L(G) = {aⁿbⁿ | n ≥ 0} = {ε, ab, aabb, aaabbb, …}
4.5 Árboles de Derivación vs Derivaciones
Sección titulada «4.5 Árboles de Derivación vs Derivaciones»Derivar es el proceso de construir una cadena de texto válida (una palabra) aplicando las reglas de la gramática paso a paso.
Se empieza con el Símbolo Inicial (generalmente llamado ) y se van sustituyendo las variables (letras mayúsculas) por lo que dictan las reglas (producciones) hasta que solo quedan terminales (letras minúsculas o símbolos finales que ya no se pueden cambiar).
Es básicamente un juego de “buscar y reemplazar”:
- Entrada: El símbolo inicial .
- Acción: Eliges una variable presente en tu cadena actual, buscas una regla que le aplique y la sustituyes.
- Fin: Cuando ya no quedan variables (letras mayúsculas), has terminado la derivación.
Es importante distinguir entre el proceso y la estructura.
-
Derivación (Texto): Es la secuencia de pasos paso a paso.
-
Árbol de Derivación (Gráfico): Es la estructura jerárquica.
- Raíz: .
- Hojas: La palabra final ().
- Nodos: Variables intermedias.
Gramática:
- (donde ‘id’ es un número o variable)
Objetivo: Generar el árbol para la cadena:
Empezamos con el símbolo inicial .
Miramos nuestra cadena objetivo (). Vemos que hay una suma principal (o una multiplicación, depende de cómo decidamos estructurarlo, pero asumamos la suma primero para este ejemplo).
Aplicamos la regla .
- De la raíz salen tres hijos: , y .
Ahora tenemos:
- Un a la izquierda.
- Un en el medio (ya es terminal, se queda quieto).
- Un a la derecha.
Miramos la cadena objetivo: la primera parte es solo id. Así que al de la izquierda le aplicamos la regla .
Para la segunda parte, necesitamos id * id. Así que al de la derecha no lo convertimos en id directamente, sino que le aplicamos la regla de multiplicación:
Ahora el árbol ha crecido. Los nuevos que creamos para la multiplicación se convierten cada uno en id usando la regla .
4.6 Ambigüedad
Sección titulada «4.6 Ambigüedad»Definición de Examen: Una gramática es ambigua si existe al menos una cadena que tiene dos o más árboles de derivación distintos. Pueden tener derivaciones distintas y no ser ambiguas, por ejemplo:
Queremos generar la cadena: Podemos hacerlo con dos “derivaciones” diferentes (cambiando el orden en que sustituimos las letras):
Derivación 1 (Por la izquierda):
- (Sustituyo A primero)
- (Sustituyo B después)
Derivación 2 (Por la derecha):
- (Sustituyo B primero)
- (Sustituyo A después)
¿Son derivaciones diferentes? SÍ. La lista de pasos es distinta. En una escribí la ‘a’ antes y en la otra escribí la ‘b’ antes.
¿Son árboles diferentes? NO. Si dibujas el árbol, el resultado es idéntico en ambos casos:
- La raíz es .
- De salen dos ramas: y .
- De cuelga una .
- De cuelga una .
Caso típico: Operaciones matemáticas sin paréntesis ni precedencia.
3 + 4 * 5¿Es(3+4)*5o3+(4*5)? Si la gramática permite ambos árboles, es mala (ambigua).
4.7 Protips para ejercicios
Sección titulada «4.7 Protips para ejercicios»Patrón 1: El Espejo y la Cebolla (Palíndromos y )
Sección titulada «Patrón 1: El Espejo y la Cebolla (Palíndromos y anbna^n b^nanbn)»Si necesitas que el principio coincida con el final, o que la cantidad de letras del principio sea igual a la del final, usas la recursividad envolvente.
La Regla de Oro: Esto genera a la izquierda y a la derecha, sincronizados.
Ejemplo Práctico Palídromo:
- Si añado una ‘a’ al principio, debo añadir una ‘a’ al final:
- Si añado una ‘b’ al principio, debo añadir una ‘b’ al final:
- ¿Cómo termino? Con el centro. Puede ser ‘a’, ‘b’, o vacío ():
Gramática final:
Patrón 2: Ecuaciones Lineales ( o )
Sección titulada «Patrón 2: Ecuaciones Lineales (k=i+jk = i + jk=i+j o k=i+2jk = i + 2jk=i+2j)»Estos ejercicios te piden relacionar contadores.
- Truco: Traduce la ecuación a “quién consume a quién”.
- Orden: Fíjate MUY bien en el orden de las letras en el alfabeto ().
Caso A: Suma simple ( en ) Significa que por cada ‘a’ hay una ‘c’, Y por cada ‘b’ hay una ‘c’. Pero las ‘a’ están lejos de las ‘c’.
- Solución: Anidamiento. Tratamos la cadena como .
- Las ‘a’ envuelven a todo el bloque de ‘b’ y ‘c’.
- Las ‘b’ se emparejan con las ‘c’ del medio.
Caso B: Multiplicación ( en )
-
Interpretación:
- Por cada 1 ‘a’, genero 1 ‘c’. (Exterior)
- Por cada 1 ‘b’, genero 2 ‘c’s. (Interior)
-
Diseño:
- Estado inicial (): Genera ‘a’ izquierda y ‘c’ derecha. Cuando acaben las ‘a’, pasamos al bloque central ().
- Estado central (): Genera ‘b’ izquierda y dos ‘c’ derecha.
Patrón 3: La “O” Lógica (Unión de Casos)
Sección titulada «Patrón 3: La “O” Lógica (Unión de Casos)»Si ves un “o”, una coma, o condiciones alternativas ( o ), NO intentes hacerlo todo en una sola regla. Divide y vencerás.
Estrategia: El símbolo inicial solo sirve para elegir camino.
Ejemplo ( donde O ):
-
Camino 1 (): (y va por libre). Cadena tipo .
- Empareja ‘a’ y ‘b’. La ‘c’ se genera aparte libremente.
- (pareja a-b)
- (c libre)
-
Camino 2 (): (y va por libre). Cadena tipo .
- La ‘a’ va libre al principio. Luego empareja ‘b’ y ‘c’.
- (a libre)
- (pareja b-c)
Patrón 4: Desigualdades (El Truco del “Sobra Algo”)
Sección titulada «Patrón 4: Desigualdades (El Truco del “Sobra Algo”)»Las gramáticas no saben hacer “mayor que”. Solo saben hacer “igual”. Truco Matemático:
- significa (donde ).
- Es decir: “Hay tantas ‘k’ como ‘i’, y luego sobran más ‘k’”.
Ejemplo ( donde ): Vamos a simplificar llamándolo . La estructura es .
- Parte equilibrada: Por cada ‘a’, pongo una .
- Parte sobrante: Añado más al final (o al lado de las ).
Truco para “Distinto” (). “Distinto” significa “Mayor que” O “Menor que”. Haces dos gramáticas (como en el Patrón 4) y las unes.
Patrón 5: Desorden y Mezcla (Conteo N(a) = N(b))
Sección titulada «Patrón 5: Desorden y Mezcla (Conteo N(a) = N(b))»Aquí NO hay orden . Las letras pueden estar mezcladas “aababb…”. Esto se resuelve con Inserción Relativa.
Regla Maestra para : Si quiero mantener el equilibrio, donde ponga una ‘a’, debo poner una ‘b’. Pero como no hay orden, la ‘b’ puede ir antes, después, o alrededor.
La forma estándar segura es:
Significado: Si pongo ‘a’, debo “deber” una ‘b’ (el estado S intermedio se encarga de resolver esa deuda).
Ejemplo (): Esto es: “Equilibrado + un 1 extra”.
-
Definimos un equilibrio perfecto (mismo nº de 0 y 1). (Ojo: simplificado para el concepto, a veces se requiere más rigor con ).
-
Estado Inicial: Es el equilibrio , pero forzando un ‘0’ extra en algún sitio.
4.7 Simplificación de Gramáticas (GIC)
Sección titulada «4.7 Simplificación de Gramáticas (GIC)»Antes de pasar a formas normales, siempre debes limpiar la gramática en este orden estricto:
1. Eliminar Producciones (Vacías)
Sección titulada «1. Eliminar Producciones ε\varepsilonε (Vacías)»Si , entonces es “anulable”. Método:
- Busca todas las variables que pueden volverse (directa o indirectamente).
- Si tienes , y es anulable, añade una nueva regla (versión donde desaparece).
- Borra las reglas originales (salvo si es necesario para el lenguaje)
2. Eliminar Producciones Unitarias ()
Sección titulada «2. Eliminar Producciones Unitarias (A→BA \to BA→B)»Reglas que solo cambian el nombre de la variable sin añadir terminales. Método:
- Si y , entonces añade .
- Borra .
3. Eliminar Símbolos Inútiles
Sección titulada «3. Eliminar Símbolos Inútiles»Se hace en dos pasadas:
- No Generadores: Variables que entran en bucle y nunca llegan a terminales (). Bórralas.
- Inalcanzables: Variables a las que no puedes llegar empezando desde . Bórralas.
Un símbolo es generador si . Un símbolo X es alcanzable si existe una derivación para algún y . Todo símbolo útil es generador y alcanzableeeeeeeeeee.
Ejemplo que usa los pasos 1 y 2:

4.8 Formas Normales (FNC-Chomsky)
Sección titulada «4.8 Formas Normales (FNC-Chomsky)»Objetivo: Estandarizar la gramática para que todas las reglas sean “cortas” y binarias. Es fundamental para el algoritmo CYK (análisis sintáctico).
Solo se permiten 2 tipos de reglas:
- (Dos variables).
- (Un terminal).
Algoritmo de Conversión a FNC (Práctico)
Sección titulada «Algoritmo de Conversión a FNC (Práctico)»Supongamos que ya has simplificado la gramática (paso 4.8).
Paso 1: Terminales solitarios en reglas mixtas. Si tienes , eso está prohibido (mezcla terminal y variable).
- Crea una variable nueva: .
- Cambia la regla a: .
Paso 2: Acortar cadenas largas. Si tienes (3 variables), es demasiado largo.
- Rompe la cadena creando variables intermedias.
Ejemplo Rápido: Original:
- Crear variables para terminales: , .
- Sustituir: .
- Romper cadena de 3:
Resultado FNC:
4.9 Forma Normal de Greibach (FNG)
Sección titulada «4.9 Forma Normal de Greibach (FNG)»La FNG es otra forma de estandarizar gramáticas (como la de Chomsky), pero con una filosofía distinta: “Producir letra a letra”.
Imagina una máquina expendedora. En la FNG, cada vez que la gramática hace un movimiento (aplica una regla), está obligada a soltar exactamente una moneda (símbolo terminal) y quedarse con el cambio (variables).
La regla siempre tiene esta forma:
- : Variable actual.
- : Un solo terminal (la moneda que suelta).
- : Una cadena de cero o más variables (el cambio que te queda por procesar).
Ejemplo: (Soltó una ‘a’, le queda procesar A y B).
Una cadena de longitud tiene una derivación de pasos. Un analizador sintáctico descendente parará a profundidad y nunca habrá recursividad por la izquierda.