Ir al contenido

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.

Una gramática se define como: G=(NT,T,P,S)G = (NT, T, P, S).

  • NTNT (o VV): Variables no terminales (Mayúsculas, ej: A,BA, B).
  • TT: Terminales (minúsculas, ej: a,ba, b).
  • PP: Producciones (Reglas IzquierdaDerecha\text{Izquierda} \to \text{Derecha}).
  • SS: 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: xyx \to y

    • x(NT/T)+x \in (NT/T)^+ (La izquierda debe tener algo, no puede ser vacío).
    • y(NT/T)y \in (NT/T)^* (La derecha puede ser cualquier cosa o vacío).
  • Explicación Práctica:

    • En la izquierda puedes tener mezclas de variables y terminales (ej: aAbaAb \to \dots).
    • 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
  • Definición: αβ\alpha \to \beta tal que αβ|\alpha| \le |\beta|

    • Formalmente se ve así: α=z1xz2\alpha = z_1 \mathbf{x} z_2 y β=z1yz2\beta = z_1 \mathbf{y} z_2.
    • Significa que la variable x\mathbf{x} se transforma en y\mathbf{y} solo si está rodeada por el contexto z1z_1 y z2z_2.
    • z1,z2Tz_1, z_2 \in T^*, xNTx \in NT e y(NT/T)+y \in (NT/T)^+
  • Explicación Práctica:

    • La longitud de lo de la derecha (β\beta) siempre es mayor o igual que lo de la izquierda (α\alpha). 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: xyx \to y

    • xNTx \in NT (¡OJO! La izquierda siempre es una sola Variable/Mayúscula).
    • y(NT/T)y \in (NT/T)^* (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 AA, puedes cambiarla por su regla.
    • Ejemplo: AaBcA \to aBc.
    • Esta gramática genera Lenguajes Independientes del Contexto y son reconocidos por el Autómata con Pila (PDA).
  • Definición: αβ\alpha \to \beta

    • αNT\alpha \in NT (Izquierda es una sola Variable).
    • β\beta tiene varias formas:
      • βaB\beta \in aB
      • βBa\beta \in Ba
      • βb\beta \in b
    • BNTB \in NT
    • aT+a \in T^+
    • bTb \in T^*
  • 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):
      1. Lineal por la Derecha: AaBA \to aB o AaA \to a. (La variable siempre al final).
      2. Lineal por la Izquierda: ABaA \to Ba o AaA \to a. (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: T3T2T1T0T3 \subset T2 \subset T1 \subset T0

4.4 Lenguaje de una Gramática Independiente del Contexto

Sección titulada «4.4 Lenguaje de una Gramática Independiente del Contexto»

L(G)={wTSw}L(G) = \{ w ∈ T^* | S ⇒* w \}

Se lee así: “El lenguaje LL generado por la gramática GG es el conjunto de cadenas ww…”

  1. wTw \in T^*:

    • Esto impone la condición principal: la cadena resultante ww debe estar formada únicamente por símbolos Terminales (TT).
    • 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 aSbaSb (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).
  2. \mid:

    • Significa “tal que” o “que cumplen la condición de que…”.
  3. SwS \Rightarrow * w:

    • SS: Debes empezar obligatoriamente desde el Símbolo Inicial.
    • \Rightarrow^*: 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.
    • ww: 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, …}

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 SS) 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 SS.
  • 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.

  1. Derivación (Texto): Es la secuencia de pasos paso a paso.

    • SaAabBabbS \Rightarrow aA \Rightarrow abB \Rightarrow abb
  2. Árbol de Derivación (Gráfico): Es la estructura jerárquica.

    • Raíz: SS.
    • Hojas: La palabra final (a,b,ba, b, b).
    • Nodos: Variables intermedias.

Gramática:

  1. EE+EE \rightarrow E + E
  2. EEEE \rightarrow E * E
  3. EidE \rightarrow id (donde ‘id’ es un número o variable)

Objetivo: Generar el árbol para la cadena: id+ididid + id * id

Empezamos con el símbolo inicial EE.

Miramos nuestra cadena objetivo (id+ididid + id * id). 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 EE+EE \rightarrow E + E.

  • De la raíz EE salen tres hijos: EE, ++ y EE.

Ahora tenemos:

  • Un EE a la izquierda.
  • Un ++ en el medio (ya es terminal, se queda quieto).
  • Un EE a la derecha.

Miramos la cadena objetivo: la primera parte es solo id. Así que al EE de la izquierda le aplicamos la regla EidE \rightarrow id.

Para la segunda parte, necesitamos id * id. Así que al EE de la derecha no lo convertimos en id directamente, sino que le aplicamos la regla de multiplicación: EEEE \rightarrow E * E

Ahora el árbol ha crecido. Los nuevos EE que creamos para la multiplicación se convierten cada uno en id usando la regla EidE \rightarrow id.

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:

  1. SABS \rightarrow AB
  2. AaA \rightarrow a
  3. BbB \rightarrow b

Queremos generar la cadena: abab Podemos hacerlo con dos “derivaciones” diferentes (cambiando el orden en que sustituimos las letras):

Derivación 1 (Por la izquierda):

  1. SABS \Rightarrow AB
  2. SaBS \Rightarrow \textbf{a}B (Sustituyo A primero)
  3. SabS \Rightarrow a\textbf{b} (Sustituyo B después)

Derivación 2 (Por la derecha):

  1. SABS \Rightarrow AB
  2. SAbS \Rightarrow A\textbf{b} (Sustituyo B primero)
  3. SabS \Rightarrow \textbf{a}b (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 SS.
  • De SS salen dos ramas: AA y BB.
  • De AA cuelga una aa.
  • De BB cuelga una bb.

Caso típico: Operaciones matemáticas sin paréntesis ni precedencia.

  • 3 + 4 * 5 \to ¿Es (3+4)*5 o 3+(4*5)? Si la gramática permite ambos árboles, es mala (ambigua).

Patrón 1: El Espejo y la Cebolla (Palíndromos y anbna^n b^n)

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: Sx S yS \to x \ S \ y Esto genera xx a la izquierda y yy a la derecha, sincronizados.

Ejemplo Práctico Palídromo:

  1. Si añado una ‘a’ al principio, debo añadir una ‘a’ al final: SaSaS \to aSa
  2. Si añado una ‘b’ al principio, debo añadir una ‘b’ al final: SbSbS \to bSb
  3. ¿Cómo termino? Con el centro. Puede ser ‘a’, ‘b’, o vacío (ε\varepsilon): SabεS \to a \mid b \mid \varepsilon

Gramática final: SaSabSbabεS \to aSa \mid bSb \mid a \mid b \mid \varepsilon

Patrón 2: Ecuaciones Lineales (k=i+jk = i + j o k=i+2jk = i + 2j)

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 (aibjcka^i b^j c^k).

Caso A: Suma simple (k=i+jk = i + j en aibjcka^i b^j c^k) 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 ai(bjcj)cia^i (b^j c^j) c^i.
  • Las ‘a’ envuelven a todo el bloque de ‘b’ y ‘c’.
  • Las ‘b’ se emparejan con las ‘c’ del medio.

Caso B: Multiplicación (k=i+2jk = i + 2j en aibjcka^i b^j c^k)

  • Interpretación:

    • Por cada 1 ‘a’, genero 1 ‘c’. (Exterior)
    • Por cada 1 ‘b’, genero 2 ‘c’s. (Interior)
  • Diseño:

    1. Estado inicial (SS): Genera ‘a’ izquierda y ‘c’ derecha. Cuando acaben las ‘a’, pasamos al bloque central (BB). SaScBS \to aSc \mid B
    2. Estado central (BB): Genera ‘b’ izquierda y dos ‘c’ derecha. BbBccεB \to bBcc \mid \varepsilon

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 (i=ji=j o j=kj=k), NO intentes hacerlo todo en una sola regla. Divide y vencerás.

Estrategia: El símbolo inicial solo sirve para elegir camino. SS1S2S \to S_1 \mid S_2

Ejemplo (aibjcka^i b^j c^k donde i=ji=j O j=kj=k):

  • Camino 1 (S1S_1): i=ji=j (y kk va por libre). Cadena tipo anbncma^n b^n c^m.

    • Empareja ‘a’ y ‘b’. La ‘c’ se genera aparte libremente.
    • S1XCS_1 \to X C
    • XaXbεX \to aXb \mid \varepsilon (pareja a-b)
    • CcCεC \to cC \mid \varepsilon (c libre)
  • Camino 2 (S2S_2): j=kj=k (y ii va por libre). Cadena tipo ambncna^m b^n c^n.

    • La ‘a’ va libre al principio. Luego empareja ‘b’ y ‘c’.
    • S2AYS_2 \to A Y
    • AaAεA \to aA \mid \varepsilon (a libre)
    • YbYcεY \to bYc \mid \varepsilon (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:

  • k>ik > i \rightarrow significa k=i+mk = i + m (donde m1m \geq 1).
  • Es decir: “Hay tantas ‘k’ como ‘i’, y luego sobran más ‘k’”.

Ejemplo (ai(b+c)ka^i (b+c)^k donde k>ik > i): Vamos a simplificar (b+c)(b+c) llamándolo XX. La estructura es aiXka^i X^k.

  1. Parte equilibrada: Por cada ‘a’, pongo una XX.
  2. Parte sobrante: Añado más XX al final (o al lado de las XX). SaSXA(Emparejo a con X)S \to aSX \mid A \quad \text{(Emparejo a con X)} AXAX(Genero las X sobrantes, al menos una)A \to XA \mid X \quad \text{(Genero las X sobrantes, al menos una)} Xbc(Defino queˊ es X)X \to b \mid c \quad \text{(Defino qué es X)}

Truco para “Distinto” (\neq). “Distinto” significa “Mayor que” O “Menor que”. SSmayorSmenorS \to S_{mayor} \mid S_{menor} 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 aibja^i b^j. Las letras pueden estar mezcladas “aababb…”. Esto se resuelve con Inserción Relativa.

Regla Maestra para N(a)=N(b)N(a) = N(b): 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: SaSbSbSaSSSεS \to aSbS \mid bSaS \mid SS \mid \varepsilon

Significado: Si pongo ‘a’, debo “deber” una ‘b’ (el estado S intermedio se encarga de resolver esa deuda).

Ejemplo (N(0)=N(1)+1N(0) = N(1) + 1): Esto es: “Equilibrado + un 1 extra”.

  • Definimos un equilibrio perfecto BB (mismo nº de 0 y 1). B0B1B1B0BεB \to 0B1B \mid 1B0B \mid \varepsilon (Ojo: simplificado para el concepto, a veces se requiere más rigor con SSSS).

  • Estado Inicial: Es el equilibrio BB, pero forzando un ‘0’ extra en algún sitio. SB 0 BS \to B \ 0 \ B

Antes de pasar a formas normales, siempre debes limpiar la gramática en este orden estricto:

1. Eliminar Producciones ε\varepsilon (Vacías)

Sección titulada «1. Eliminar Producciones ε\varepsilonε (Vacías)»

Si AεA \to \varepsilon, entonces AA es “anulable”. Método:

  1. Busca todas las variables que pueden volverse ε\varepsilon (directa o indirectamente).
  2. Si tienes SAbS \to Ab, y AA es anulable, añade una nueva regla SbS \to b (versión donde AA desaparece).
  3. Borra las reglas AεA \to \varepsilon originales (salvo si SεS \to \varepsilon es necesario para el lenguaje)

2. Eliminar Producciones Unitarias (ABA \to B)

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:

  1. Si ABA \to B y BalgoB \to \text{algo}, entonces añade AalgoA \to \text{algo}.
  2. Borra ABA \to B.

Se hace en dos pasadas:

  1. No Generadores: Variables que entran en bucle y nunca llegan a terminales (AaAA \to aA). Bórralas.
  2. Inalcanzables: Variables a las que no puedes llegar empezando desde SS. Bórralas.

Un símbolo XX es generador si XwX ⇒*w . Un símbolo X es alcanzable si existe una derivación SαXβS⇒* \alpha X \beta para algún α\alpha y β\beta. Todo símbolo útil es generador y alcanzableeeeeeeeeee.

Ejemplo que usa los pasos 1 y 2:

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:

  1. ABCA \to BC (Dos variables).
  2. AaA \to a (Un terminal).

Supongamos que ya has simplificado la gramática (paso 4.8).

Paso 1: Terminales solitarios en reglas mixtas. Si tienes SaBS \to aB, eso está prohibido (mezcla terminal y variable).

  • Crea una variable nueva: XaaX_a \to a.
  • Cambia la regla a: SXaBS \to X_a B.

Paso 2: Acortar cadenas largas. Si tienes SABCS \to ABC (3 variables), es demasiado largo.

  • Rompe la cadena creando variables intermedias.
  • SAZS \to AZ
  • ZBCZ \to BC

Ejemplo Rápido: Original: SaSbS \to aS b

  1. Crear variables para terminales: XaaX_a \to a, XbbX_b \to b.
  2. Sustituir: SXaSXbS \to X_a S X_b.
  3. Romper cadena de 3:
    • SXaYS \to X_a Y
    • YSXbY \to S X_b

Resultado FNC: SXaYYSXbXaaXbb\begin{aligned} S &\to X_a Y \\ Y &\to S X_b \\ X_a &\to a \\ X_b &\to b \end{aligned}

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:

AaαA \to a\alpha

  • AA: Variable actual.
  • aa: Un solo terminal (la moneda que suelta).
  • α\alpha: Una cadena de cero o más variables (el cambio que te queda por procesar).

Ejemplo: SaABS \to \textbf{a}AB (Soltó una ‘a’, le queda procesar A y B).

Una cadena de longitud nn tiene una derivación de nn pasos. Un analizador sintáctico descendente parará a profundidad nn y nunca habrá recursividad por la izquierda.