Capı́tulo 9 Gramáticas Independientes del Contexto Definición 1 (Gramática Independiente del Contexto) Consideremos G una gramática, G = (ΣN , ΣT , S, P). Se dice que G es independiente del contexto o de tipo 2 si todas las reglas de producción de P son de la siguiente forma: A ::= β, con A ∈ ΣN y β ∈ (ΣT ∪ ΣN )∗ . Todo lenguaje generado por una gramática de tipo 2 se define como lenguaje independiente del contexto Observación 2 A lo largo del capı́tulo, utilizaremos la siguiente notación: Las letras mayúsculas A, B, C, D, E, y S denotarán variables; S será siempre el axioma salvo que se especifique lo contrario. Las letras minúsculas a, b, c, d, e, cualquier dı́gito y cadenas en negrita serán terminales. Las letras mayúsculas X, Y, Z denotarán sı́mbolos que pueden ser terminales o variables. Las letras minúsculas u, v, w, x, y, z denotarán cadenas de terminales. Las letras mı́nusculas griegas α, β, γ denotarán cadenas de variables y terminales. Ejemplo 1 G1 = ({S}, {a, b}, S, {S ::= aSb | ab}). Las gramáticas regulares son independientes del contexto. G2 = ({S}, {a, b}, S, {S ::= aSb | SS | λ}). El lenguaje de los palı́ndromos sobre cualquier alfabeto finito es independiente del contexto. El lenguaje de las expresiones regulares sobre {0, 1} es independiente del contexto. El lenguaje HTML es un lenguaje independiente del contexto. 1 2 CAPÍTULO 9. GRAMÁTICAS INDEPENDIENTES DEL CONTEXTO 9.1. Simplificación de G.I.C. Existen varias maneras de restringir el formato de las producciones de una G.I.C. sin modificar el lenguaje que genera. Si L es un lenguaje independiente del contexto no vacı́o, entonces se puede generar por una gramática independiente del contexto G con las siguientes propiedades: a) Cada variable y cada terminal de G aparece en la derivación de alguna palabra de L. b) No existen producciones de la forma A ::= B, donde A y B son variables. Es más, si λ 6∈ L, no se necesitan producciones de la forma A ::= λ. De hecho, si λ 6∈ L, podemos imponer que todas las producciones de G sean de la forma A ::= BC o bien A ::= a, donde A, B, C ∈ ΣN y a ∈ ΣT . Alternativamente, podemos imponer que todas las producciones sean de la forma A ::= aβ, donde a ∈ ΣT y β ∈ Σ∗N . Estas dos formas especiales se denominan Forma Normal de Chomsky y Forma Normal de Greibach, respectivamente. 9.1.1. Reglas innecesarias Una regla de la forma A ::= A, con A ∈ ΣN se denomina regla innecesaria. Este tipo de producciones pueden eliminarse de la gramática sin variar el lenguaje generado. 9.1.2. Sı́mbolos inútiles ∗ ∗ Un sı́mbolo X es un sı́mbolo útil si existe una derivación de la forma S ⇒ αXβ ⇒ w, con α, β ∈ (ΣT ∪ ΣN )∗ y w ∈ Σ∗T . Diremos que X es inútil si no es útil. Lema 3 Dada una gramática independiente del contexto G = (ΣN , ΣT , S, P), con L(G) 6= ∅, existe una gramática independiente del contexto G′ = (Σ′N , ΣT , S, P ′ ) equivalente tal que para ∗ cada A ∈ Σ′N , existe w ∈ Σ∗T con A ⇒ w. Demostración.– La demostración del Lema se basa en el Algoritmo 1. Algoritmo 1 Precondición : Gramática independiente del contexto G = (ΣN , ΣT , S, P), con L(G) 6= ∅. V iejo ← ∅; N uevo ← {A ∈ ΣN | (A ::= w) ∈ P para algún w ∈ Σ∗T }; mientras V iejo 6= N uevo hacer V iejo ← N uevo; N uevo ← V iejo ∪ {A ∈ ΣN | (A ::= α) ∈ P para algún α ∈ (ΣT ∪ V iejo)∗ }; fin mientras Σ′N ← N uevo; P ′ ← {(A ::= α) ∈ P | A ∈ Σ′N , α ∈ (ΣT ∪ Σ′N )∗ }; CAPÍTULO 9. GRAMÁTICAS INDEPENDIENTES DEL CONTEXTO 3 Lema 4 Dada una gramática independiente del contexto G = (ΣN , ΣT , S, P), existe una gramática independiente del contexto G′ = (Σ′N , Σ′T , S, P ′ ) equivalente tal que para cada X ∈ Σ′N ∪Σ′T , ∗ existen α, β ∈ (ΣN ∪ ΣT )∗ con S ⇒ αXβ. Demostración.– De nuevo, la demostración es constructiva y se basa en el Algoritmo 2. Algoritmo 2 Precondición : Gramática independiente del contexto G = (ΣN , ΣT , S, P). V iejoN ← ∅; N uevoN ← {S}; V iejoT ← ∅; N uevoT ← ∅; mientras V iejoN 6= N uevoN ∧ V iejoT 6= N uevoT hacer V iejoN ← N uevoN ; V iejoT ← N uevoT ; para todo A ∈ V iejoN hacer para todo (A ::= α) ∈ P hacer N uevoN ← N uevoN ∪ {todas las variables en α}; N uevoT ← N uevoT ∪ {todos los terminales en α}; fin para fin para fin mientras Σ′N ← N uevoN ; Σ′T ← N uevoT ; P ′ ← {(A ::= α) ∈ P | A ∈ Σ′N , α ∈ (Σ′N ∪ Σ′T )∗ }; Teorema 5 Todo lenguaje independiente del contexto, no vacı́o, se puede generar por una gramática independiente del contexto sin sı́mbolos inútiles. Demostración.– Basta aplicar el procedimiento del Lema 4 al resultado de aplicar el Lema 3. Observación 6 Es importante resaltar que se debe aplicar primero el Lema 3 y luego el Lema 4. Por ejemplo, la gramática G = ({A, B, S}, {a}, S, {S ::= AB | a ; A ::= a}). La gramática sin sı́mbolos inútiles equivalente es G1 = ({S}, {a}, S, {S ::= a}). Sin embargo, si aplicamos el Lema 4 y luego el Lema 3, el resultado es G2 = ({A, S}, {a}, S, {S ::= a ; A ::= a}). Ejemplo 2 Consideremos la gramática G = ({A, B, C, D, E, S}, {a, b, c, d}, S, P), donde P son CAPÍTULO 9. GRAMÁTICAS INDEPENDIENTES DEL CONTEXTO 4 las siguientes producciones: S B A C E D ::= ::= ::= ::= ::= ::= Aa | B | D b Aa | bA | B | cE abd λ Db Tras aplicar el primer lema, la gramática resultante es G1 = ({A, B, C, E, S}, {a, b, c, d}, S, P1 ), donde P1 son las siguientes producciones: S B A C E ::= ::= ::= ::= ::= Aa | B b Aa | bA | B | cE abd λ Tras aplicar el segundo lema, la gramática resultante es G2 = ({A, B, E, S}, {a, b, c}, S, P2 ), donde P2 son las siguientes producciones: S B A E 9.1.3. ::= ::= ::= ::= Aa | B b Aa | bA | B | cE λ Reglas no generativas (reglas λ) Dada una gramática independiente del contexto G = (ΣN , ΣT , S, P), se dice que una regla es ∗ no generativa si tiene la forma A ::= λ, con A ∈ ΣN . Los sı́mbolos A, tales que A ⇒ λ, se denominan anulables. Es evidente que si λ ∈ L(G), entonces S es anulable y no podremos prescindir de la regla S ::= λ. Sin embargo, si λ 6∈ L(G), entonces podemos construir una gramática sin producciones no generativas y, por tanto, sin sı́mbolos anulables. Teorema 7 Dada una gramática independiente del contexto G = (ΣN , ΣT , S, P), existe una gramática independiente del contexto G′ = (ΣN , ΣT , S, P ′ ) equivalente a G sin reglas no generativas excepto posiblemente la regla S ::= λ. Demostración.– La prueba, constructiva, se basa en el Algoritmo 3. CAPÍTULO 9. GRAMÁTICAS INDEPENDIENTES DEL CONTEXTO Algoritmo 3 Precondición : Gramática independiente del contexto G = (ΣN , ΣT , S, P). V iejo ← ∅; SA ← {A ∈ ΣN | (A ::= λ) ∈ P}; mientras V iejo 6= SA hacer V iejo ← SA ; para todo (B ::= α) ∈ P hacer si α ∈ SA ∗ entonces SA ← SA ∪ {B}; fin si fin para fin mientras P ′ ← ∅; para todo (B ::= X1 X2 · · · Xn ) ∈ P hacer para i = 1, . . . , n hacer Yi1 ← Xi ; si Xi 6∈ SA entonces Yi2 ← Xi ; else si Xi ∈ SA entonces Yi2 ← λ; fin si fin para para todo (σ1 , . . . , σn ) ∈ {1, 2}n hacer P ′ ← P ′ ∪ {B ::= Y1σ1 · · · Ynσn }; fin para P ′ ← P ′ \ {B ::= λ}; fin para si S ∈ SA entonces P ′ ← P ′ ∪ {S ::= λ}; fin si 5 CAPÍTULO 9. GRAMÁTICAS INDEPENDIENTES DEL CONTEXTO 6 Ejemplo 3 Consideremos la gramática G = ({A, B, E, S}, {a, b, c}, S, P), donde P son las siguientes producciones: S B A E ::= ::= ::= ::= Aa | B bB | b|λ Aa | bA | BEE λ Aplicando el Algoritmo 3, resulta que los sı́mbolos anulables (SA ) es SA = {S, A, B, E}. La nueva gramática resultante tiene las siguientes producciones: S ::= Aa | a | B | λ B ::= bB | b A ::= Aa | a | bA | b | BEE | BE | EE | B | E Observación 8 Como se puede ver fácilmente en el ejemplo, pueden aparecer sı́mbolos inútiles. Por ello, despues de realizar el Algoritmo es conveniente eliminar sı́mbolos inútiles y reglas innecesarias. 9.1.4. Reglas unitarias Dada una gramática independiente del contexto G = (ΣN , ΣT , S, P), se dice que una regla es unitaria si tiene la forma A ::= B, con A, B ∈ ΣN . Teorema 9 Dada una gramática independiente del contexto G = (ΣN , ΣT , S, P), existe una gramática independiente del contexto G′ = (ΣN , ΣT , S, P ′ ) equivalente a G sin reglas unitarias. Demostración.– La prueba constructiva del Teorema es el Algoritmo 4. Obsérvese que se exige que la gramática no tenga reglas no generativas. Ası́, debemos preprocesar la gramática para poder aplicar el Algoritmo. En particular, si λ ∈ L(G), hay que quitar la regla S ::= λ y tras aplicar el algoritmo, volver a añadirla. Ejemplo 4 Consideremos la gramática G = ({A, B, C, E, S}, {a, b, c}, S, P), donde P son las siguientes producciones: S A C B E ::= ::= ::= ::= ::= Aa | a | C | BE | B | λ Aa | a B bB | b | S c CAPÍTULO 9. GRAMÁTICAS INDEPENDIENTES DEL CONTEXTO 7 Algoritmo 4 Precondición : Gramática independiente del contexto G = (ΣN , ΣT , S, P) sin reglas no generativas. para todo A ∈ ΣN hacer ∗ Unitario(A) ← {B ∈ ΣN | A ⇒ B}; fin para P ′ ← ∅; para todo A ∈ ΣN hacer para todo B ∈ Unitario(A) hacer para todo (B ::= α) ∈ P ∧ α 6∈ ΣN hacer P ′ ← P ′ ∪ {A ::= α}; fin para fin para fin para Tenemos que los conjuntos unitarios son Unitario(S) = Unitario(B) = Unitario(C) = {B, C, S}, Unitario(A) = {A} y Unitario(E) = {E}. Con esto, obtenemos la gramática G′ = ({A, B, C, E, S}, {a, b, c}, S, P ′ ), donde P ′ son las siguientes producciones: S A B C E ::= ::= ::= ::= ::= Aa Aa Aa Aa c | | | | a | BE | bB | b | c | λ a a | BE | bB | b | c a | BE | bB | b | c Observación 10 Como se puede ver fácilmente en el ejemplo, pueden aparecer sı́mbolos inútiles. Por ello, despues de realizar el Algoritmo es conveniente eliminar sı́mbolos inútiles y reglas innecesarias. 9.1.5. Gramática bien formada Definición 11 Dada una gramática independiente del contexto G = (ΣN , ΣT , S, P), se dice bien formada si verifica las siguientes propiedades: No contiene reglas innecesarias ni sı́mbolos inútiles. No contiene reglas no generaticas salvo en el axioma. No contiene reglas unitarias. Si (S ::= λ) ∈ P, entonces (ΣN , ΣT , S, P \ {S ::= λ}) también es una gramática bien formada CAPÍTULO 9. GRAMÁTICAS INDEPENDIENTES DEL CONTEXTO 8 Ejemplo 5 La gramática ({S}, {a, b}, S, {S ::= SS | aSb | λ}) no es una gramática bien formada. Teorema 12 Todo lenguaje independiente del contexto no vacı́o L se puede generar mediante una gramática bien formada. Demostración.– Sea G = (ΣN , ΣT , S, P) una gramática independiente del contexto tal que L = L(G). A esta gramática le haremos las siguientes transformaciones: 1. Eliminamos las reglas innecesarias. 2. Aplicamos el Algoritmo 3 para eliminar las reglas no generativas. 3. Aplicamos el Algoritmo 4 para eliminar las reglas unitarias. Obsérvese que si S ::= λ aparece entre las reglas, debemos aplicar el Algoritmo 4 sin dicha regla y añadirla al final del proceso. 4. Aplicar el Algoritmo 1 y luego el Algoritmo 2 para eliminar los sı́mbolo inútiles. La gramática resultante es una gramática bien formada. 9.2. Formas Normales 9.2.1. Formal Normal de Chomsky Sea G = (ΣN , ΣT , S, P) una gramática independiente del contexto. Se dice que G está en Forma Normal de Chomsky si no tiene sı́mbolos inútiles y todas las producciones son de una de las siguientes formas: S ::= λ, A ::= a, con A ∈ ΣN y a ∈ ΣT , A ::= BC, con A, B, C ∈ ΣN . Los árboles de derivación de una gramática en Forma Normal de Chomsky son árboles binarios, lo que facilita la implementación de analizadores sintácticos (parsers). Teorema 13 Todo lenguaje libre de contexto L no vacı́o se puede generar por una gramática en Forma Normal de Chomsky. Demostración.– Sea G = (ΣN , ΣT , S, P) una gramática independiente del contexto bien formada tal que L = L(G). La prueba del Teorema se sigue a partir de la construcción de la gramática G′ = (Σ′N , ΣT , S, P ′ ) del Algoritmo 5. Nótese que la gramática G′ ası́ construı́da puede contener sı́mbolos inútiles, ası́ que también hay que aplicar el algoritmo para eliminar sı́mbolos inútiles. CAPÍTULO 9. GRAMÁTICAS INDEPENDIENTES DEL CONTEXTO Algoritmo 5 Precondición : Gramática independiente del contexto G = (ΣN , ΣT , S, P) bien formada. Σ′N ← ΣN ; P ′ ← ∅; para todo a ∈ ΣT hacer ˙ a }; Σ′N ← Σ′N ∪{C ′ ′ P ← P ∪ {Ca ::= a}; fin para para todo (A ::= X1 X2 · · · Xm ) ∈ P hacer si m ≥ 2 entonces Xi si Xi ∈ ΣN ′ ′ ′ ′ ′ ′ P ← P ∪ {A ::= X1 X2 · · · Xm }; # donde Xi = Ca si Xi = a ∈ ΣT else si m = 1 entonces P ′ ← P ′ ∪ {A ::= X1 }; fin si fin para para todo (A ::= B1 B2 · · · Bm ) ∈ P ′ hacer si m ≥ 3 entonces P ′ ← P ′ \ {A ::= B1 B2 · · · Bm }; para i = 1, . . . , m − 2 hacer ˙ Σ′N ← Σ′N ∪{D i }; fin para P ′ ← P ′ ∪ {A ::= B1 D1 }; para i = 1, . . . , m − 3 hacer P ′ ← P ′ ∪ {Di ::= Bi+1 Di+1 }; fin para P ′ ← P ′ ∪ {Dm−2 ::= Bm−1 Bm }; fin si fin para si (S ::= λ) ∈ P entonces P ′ ← P ′ ∪ {S ::= λ}; fin si 9 CAPÍTULO 9. GRAMÁTICAS INDEPENDIENTES DEL CONTEXTO 10 Ejemplo 6 Consideremos la gramática siguiente: G = ({S, A, B}, {a, b, c}, S, P), con P las producciones siguientes: S ::= Aba | a | BbA | λ A ::= aab | Acbc B ::= Ac En primer lugar, la gramática G está bien formada. En un primer paso, añadimos sı́mbolos no terminales para cada uno de los sı́mbolos terminales de la gramática, y cambiamos, en las producciones en las que proceda, los sı́mbolos terminales por los sı́mbolos no terminales correspondientes. La gramática intermedia equivalente es G1 = ({S, A, B, Ca , Cb , Cc }, {a, b, c}, S, P1 ), donde P1 son las producciones siguientes: S A B Ca Cb Cc ::= ::= ::= ::= ::= ::= ACb Ca | a | BCb A Ca Ca Cb | ACc Cb Cc ACc a b c Ahora, para cada una de las producciones que no están en forma requerida, se procede a añadir sı́mbolos no terminales intermedios y las correspondientes producciones. Por ejemplo, se elimina la producción S ::= ACb Ca y se añade el no terminal D1 junto con las producciones S ::= AD1 y D1 ::= Cb Ca . Realizando este proceso sucesivamente, y añadiendo la producción S ::= λ, obtenemos finalmente la gramática G′ = ({S, A, B, Ca , Cb , Cc , D1 , D2 , D3 , D4 , D5 }, {a, b, c}, S, P ′ ), donde P ′ son las producciones siguientes: S A B Ca Cb Cc D1 D2 D3 D4 D5 ::= ::= ::= ::= ::= ::= ::= ::= ::= ::= ::= AD1 | a | BD2 | λ Ca D3 | AD4 ACc a b c Cb Ca Cb A Ca Cb C c D5 Cb Cc La gramática resultante no tiene sı́mbolos inútiles y está en Forma Normal de Chomsky. Observación 14 La Forma Normal de Chomsky no es única. Es decir, un mismo lenguaje posee infinitas Gramáticas en Forma Normal de Chomsky que lo generan. Este algoritmo calcula una de ellas. CAPÍTULO 9. GRAMÁTICAS INDEPENDIENTES DEL CONTEXTO 9.2.2. 11 Formal Normal de Greibach Sea G = (ΣN , ΣT , S, P) una gramática independiente del contexto. Se dice que G está en Forma Normal de Greibach si no tiene sı́mbolos inútiles y todas las producciones son de una de las siguientes formas: S ::= λ, A ::= aα, con A ∈ ΣN , a ∈ ΣT , y α ∈ Σ∗N . Esta representación será muy útil cuando queramos construir, a partir de una gramática independiente del contexto, un autómata a pila. Vamos a ver a lo largo de esta sección un algoritmo para transformar una gramática independiente del contexto a otra equivalente en Forma Normal de Greibach. Para ello, necesitaremos primero unos resultados intermedios. Definición 15 Sea G = (ΣN , ΣT , S, P) una gramática independiente del contexto, y sea A ∈ ΣN un sı́mbolo no terminal. Definiremos como A–producción a toda regla en P de la forma A ::= α, con α ∈ (ΣN ∪ ΣT )∗ . Definición 16 Sea G = (ΣN , ΣT , S, P) una gramática independiente del contexto. Diremos que G tiene reglas recursivas a izquierdas si posee alguna producción de la forma A ::= Aα, donde A ∈ ΣN y α ∈ (ΣN ∪ ΣT )∗ . Lema 17 Dada G = (ΣN , ΣT , S, P) una gramática independiente del contexto, existe una gramática equivalente G′ = (Σ′N , ΣT , S, P ′ ) tal que no tiene reglas recursivas a izquierdas. Demostración.– Supongamos que existe una A–producción recursiva a izquierdas. Sean A ::= Aα1 | · · · | Aαn todas las A–producciones que recursivas a izquierdas y A ::= β1 | · · · | βm todas las A–producciones que no son recursivas a izquierdas. Sea G1 := (Σ′N , ΣT , S, P ′ ) la gramática formada al añadir un sı́mbolo no terminal B nuevo a ΣN , y reemplazar todas las A–producciones por las siguientes: A ::= β1 | · · · | βm | β1 B | · · · | βm B B ::= α1 | · · · | αn | α1 B | · · · | αn B La gramática resultante G1 es equivalente a G, y no tiene ni A–producciones ni B–producciones recursivas a izquierda. Procediendo de igual forma para todos los sı́mbolos en ΣN se sigue el resultado. Ejemplo 7 Consideremos por ejemplo una gramática que contenga las siguientes A–producciones A ::= Ab | ACD | bDC | a. Lo que harı́amos para eliminar la recursividad a izquierdas serı́a añadir un nuevo sı́mbolo no terminal (B, por ejemplo), eliminar las A–producciones de la gramática, y añadir las siguientes producciones: A ::= bDC | a | bDCB | aB B ::= b | CD | bB | CDB CAPÍTULO 9. GRAMÁTICAS INDEPENDIENTES DEL CONTEXTO 12 Definición 18 Sea G = (ΣN , ΣT , S, P) una gramática independiente del contexto, y consideremos una producción (A ::= αBβ) ∈ P, con A, B ∈ ΣN , y α, β ∈ (ΣN ∪ ΣT )∗ . Sean B ::= γ1 | · · · | γm todas las B–producciones. Se llama sustitución de B en la producción (A ::= αBβ) al proceso de eliminar dicha producción de P y añadir a P las producciones A ::= αγ1 β | · · · | αγm β. Lema 19 Dada G = (ΣN , ΣT , S, P) una gramática independiente del contexto, sustituir un sı́mbolo en cualquier producción de G no cambia el lenguaje generado por la gramática. Demostración.– Ejemplo 8 Consideremos una gramática que contiene la producción B ::= aCAD y las A– producciones A ::= Ab | ACD | bDC | a. Entonces la sustitución de A en la regla B ::= aCAD consiste en eliminar dicha regla y añadir las producciones siguientes: B ::= aCAbD | aCACDD | aCbDCD | aCaD. Teorema 20 Dada G = (ΣN , ΣT , S, P) una gramática independiente del contexto, existe una gramática equivalente en Forma Normal de Greibach. Demostración.– Supongamos que G está en Forma Normal de Chomsky, y supongamos ΣN = {A1 , . . . , Am }. Construyamos una gramática G′ = (Σ′N , ΣT , S, P ′ ) equivalente tal que si (Ai ::= Aj γ) ∈ P ′ , entonces j > i. Para ello, tenemos el Algoritmo 6. En resumidas cuentas, el Algoritmo lo que hace es Elimina las producciones de la forma Ai ::= Aj γ, con i > j realizando sustitución. Elimina las producciones de la forma Ai ::= Ai γ, esto es, recursividad a izquierdas. Una vez aplicado dicho algoritmo, tendremos que la gramática resultante verifica que las producciones son de la forma: Ai ::= Aj γ, con i < j. Ai ::= aγ, con a ∈ ΣT . Ti ::= γ, con γ ∈ (ΣN ∪ {T1 , T2 , . . . , Ti−1 })∗ . Nótese que el sı́mbolo más a la izquierda en la parte de la derecha de cualquier Am –producción debe ser terminal. Además, el sı́mbolo más a la izquierda en la parte de la derecha de cualquier Am−1 –producción debe ser Am o un terminal. En caso de que sea Am , podemos generar nuevas producciones sustituyendo Am en dichas reglas. Esas nuevas producciones tendrán su parte de la derecha comenzando por un sı́mbolo terminal. Procediendo con las producciones Am−2 , . . . , A2 , A1 conseguimos que todas las Ai –producciones (i = 1, . . . , m) comienzan con un sı́mbolo terminal. Y para las Tj –producciones, se tiene que no pueden empezar con otra Ti , luego empiezan bien con terminales o con Ak , luego basta sustituir dicho no terminal. CAPÍTULO 9. GRAMÁTICAS INDEPENDIENTES DEL CONTEXTO Algoritmo 6 Precondición : Gramática G = (ΣN , ΣT , S, P) en Forma Normal de Chomsky. P ′ ← P; Σ′N ← ΣN ; para k = 1, . . . , m hacer para j = 1, . . . , k − 1 hacer para todo (Ak ::= Aj α) ∈ P ′ hacer para todo (Aj ::= β) ∈ P ′ hacer P ′ ← P ′ ∪ {Ak ::= βα}; P ′ ← P ′ \ {Ak ::= Aj α}; fin para fin para fin para para todo (Ak ::= Ak α) ∈ P ′ hacer Σ′N ← Σ′N ∪ {Tk }; P ′ ← P ′ ∪ {Tk ::= α | αTk }; P ′ ← P ′ \ {Ak ::= Ak α}; para todo (Ak ::= β) ∈ P ′ ∧ β no comienza por Ak hacer P ′ ← P ′ ∪ {Ak ::= βTk }; fin para fin para fin para 13 CAPÍTULO 9. GRAMÁTICAS INDEPENDIENTES DEL CONTEXTO 14 Observación 21 La gramática resultante puede contener sı́mbolos inútiles y por tanto deben de eliminarse para que la gramática esté en Forma Normal de Greibach. Ejemplo 9 Consideremos la gramática G = ({A, B, C, D}, {a, b}, A, P), donde P son las producciones A B C D ::= ::= ::= ::= BD CA | a AB | b a La gramática G está ya en Forma Normal de Chomsky. Supongamos ordenadas las variables, A < B < C < D. Vayamos por orden de las variables de menor a mayor: ‘A’ No hay nada que hacer para la variable A. ‘B’ No hay nada que hacer para la variable B. ‘C’ Para la variable C, eliminamos la producción C ::= AB y añadimos la produccione C ::= BDB. De nuevo, eliminamos esta nueva producción y añadimos las producciones C ::= CADB | aDB. Finalmente eliminamos la recursividad a izquierda, eliminando la regla C ::= CADB y añadiendo el sı́mbolo no terminal TC y las reglas C ::= bE | aDBTC y T ::= ADB | ADBTC . ‘D’ No hay nada que hacer para la variable D. Recapitulando, la gramática intermedia es de la forma G1 = ({A, B, C, D, TC }, {a, b}, A, P1 ), donde P1 son las producciones A B C D TC ::= ::= ::= ::= ::= BD CA | a bTC | aDBTC | aDB | b a ADB | ADBTC Siguiendo la demostración del teorema, tendremos que ir sustituyendo en D, C, B, A los primeros sı́mbolos en las producciones para conseguir que el primero sea un sı́mbolo terminal. Procedemos pues, de mayor a menor: ‘D’ No hay nada que hacer para la variable D. ‘C’ No hay nada que hacer para la variable C. ‘B’ Procedemos a sustituir C en la producción B ::= CA, con lo que quitamos dicha producción y añadimos las producciones B ::= bTC A | aDBTC A | aDBA | bA. CAPÍTULO 9. GRAMÁTICAS INDEPENDIENTES DEL CONTEXTO 15 ‘A’ Procedemos a sustituir B en la producción A ::= BD, con lo que quitamos dicha producción y añadimos las producciones A ::= bTC AD | aDBTC AD | aDBAD | bAD | aAD. Para concluir, tenemos que hacer el mismo proceso para las variables auxiliares. En este caso, sólo tenemos TC , con lo que sustituimos A en las producciones TC ::= ADB | ADBTC con lo que eliminamos dichas producciones y añadimos las producciones siguientes: TC ::= bTC ADDB | aDBTC ADDB | aDBADDB | bADDB | aDDB | bTC ADDBTC | aDBTC ADDBTC | aDBADDBTC | bADDBTC | aDDBTC . Por lo tanto, la gramática en Forma Normal de Greibach equivalente que buscamos es G′ = ({A, B, C, D, TC }, {a, b}, A, P ′ ), donde P ′ son las producciones A B C D TC ::= ::= ::= ::= ::= bTC AD | aDBTC AD | aDBAD | bAD | aD bTC A | aDBTC A | aDBA | bA | a bTC | aDBTC | aDB | b a bTC ADDB | aDBTC ADDB | aDBADDB | bADDB | aDDB | bTC ADDBTC | aDBTC ADDBTC | aDBADDBTC | bADDBTC | aDDBTC .