Está ampliamente aceptada en la bibliografía la siguiente definición de las Gramáticas Libres de Contexto: Una gramática libre de contexto G = (N, T, P, Σ) es una gramática formal en la cual todas las producciones poseen la siguiente forma: A → ω donde donde A ∈ N ∪ { Σ } y ω ∈ (N ∪ T)*
Se puede notar que se eliminó la restricción ω ≠ λ para las partes derechas de las producciones; como consecuencia, podría pensarse que se agrega potencia de generación de lenguajes a este tipo de gramáticas, pero no es así: siempre es posible obtener una gramática equivalente sin producciones λ (salvo que el string vacío pertenezca al lenguaje, en cuyo caso sólo el símbolo distinguido derivará en lambda). A continuación se verá el procedimiento que permite convertir tales gramáticas a la forma estricta que se vió en la Jerarquía de Chomsky Una producción de la forma A → λ se llama producción λ. Un no terminal A se llama anulable si λ A
Sea G una gramática libre de contexto con producciones P. Se construye una secuencia ANUL 0, ANUL1, … de subconjuntos de N de acuerdo al siguiente algoritmo: 1.- Sea ANUL1 = { A ∈ N / A → λ ∈ P }; i = 1 2.- Sea ANULi+1 = ANULi ∪ { A ∈ N / A → ω ∈ P; ω ∈ (ANULi)* } 3.- Si ANULi+1 ≠ ANULi, sea i = i+1; ir al paso 2 4.- Sea ANUL = ANUL i+1 Cada conjunto ANULi contiene los no terminales de G a partir de los cuales se puede derivar λ en i pasos. Dado que ANULi ⊆ ANULi+1 ⊆ N para cada i, el procedimiento terminará luego de un número de pasos no mayor que el número de no terminales en G. : Dada una gramática libre de contexto G es posible construir una gramática equivalente G' sin producciones λ, excepto (posiblemente) Σ → λ.
Una vez determinado el conjunto ANUL de no terminales anulables por medio del procedimiento anterior, se pueden eliminar las producciones λ (excepto Σ → λ, si Σ ∈ ANUL) añadiendo nuevas producciones que simulen el efecto de las producciones λ eliminadas. Más concretamente, por cada producción A → ω de G se añaden producciones de la forma A → ϕ obtenidas suprimiendo de la cadena ω uno, dos o más no terminales anulables presentes, de todas las formas posibles. La gramática G’ así obtenida es equivalente a la gramática original G. Para el análisis de la preservación o no de la equivalencia fuerte, se debe considerar que de hecho se está llevando a cabo una transformación por sustitución, lo que conduce a la aplicación de la a este efecto. Para ejemplificar el procedimiento descripto, considérese la siguiente gramática que genera el lenguaje de paréntesis Lp: Gp: ∑ → S S → (S) | SS | λ A fin de obtener una GLC equivalente, pero sin producciones λ (como S → λ), se analizará “en reversa” la derivación que dio origen al no terminal S que se quiere cambiar por λ. En el caso de S → (S), la solución sería, en vez de hacer la derivación Σ ⇒ … ⇒ αSβ ⇒ α(S)β ⇒ α( )β hacer directamente la derivación Σ ⇒ … ⇒ αSβ ⇒ α( )β agregando una producción S → ( ) a la gramática. En caso de que la S provenga de la producción S → SS, se puede cambiar la derivación Σ ⇒ … ⇒ αSβ ⇒ αSSβ ⇒ αSβ por la derivación Σ ⇒ … ⇒ αSβ ⇒ αSβ usando una nueva producción S → S, o mejor aún, simplemente reemplazarla por Σ ⇒ … ⇒ αSβ sin ninguna producción adicional (la parte de la derivación αSβ ⇒ αSSβ ⇒ αSβ desaparece por completo, pues no sirve de nada). Finalmente, la producción Σ → S daría lugar a la incusión de la producción Σ → λ en Gp. Resumiendo, la idea que permite eliminar las producciones A → λ es la de irse un paso atrás, para examinar de dónde provino el no terminal A que se quiere eliminar, y por cada producción B → αAβ de la gramática agregar una producción B → αβ , en que directamente ya se reemplazó A por λ. Una vez hecho esto, se pueden suprimir todas las producciones de la forma A → λ, pues resultan redundantes. Luego, aplicando la transformación descripta a G p, se tiene: G’p:
∑ → S | λ S → (S) | SS | ( ) | S
La producción S → S es evidentemente no generativa y será eliminada mediante la transformación correspondiente.
Trusted by over 1 million members
Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial Cancel Anytime.
Trusted by over 1 million members
Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial Cancel Anytime.
A continuación se formaliza el procedimiento ejemplificado, que debe ser aplicado luego de la identificación de los no terminales anulables mediante el algoritmo dado:
Sea G una gramática libre de contexto con producciones P y no terminales anulables ANUL. Se obtiene una nueva gramática G’ sin producciones λ mediante la aplicación del siguiente algoritmo: 1.- Para cada producción de G de la forma A → α1 … αn donde αi ∈ (N ∪ T) se agregan producciones de la forma A → β1 … βn donde
βi ∈
{ αi } si αi ∉ ANUL { αi , λ } si αi ∈ ANUL
2.- Se eliminan todas las producciones λ de P
(#)
3.- Si Σ ∈ ANUL, luego Σ → λ ∈ G’
G:
∑ → ABb | ABC A → aA | λ B → bB | λ C → abC | AB
Mediante la aplicación del procedimiento enunciado, se identifican los no terminales anulables de G: ANUL1 = {A, B} ANUL2 = {A, B} ∪ {Σ, C} = {A, B, Σ, C} ANUL3 = ANUL2 ANUL = {A, B, Σ, C} Luego se procede a la eliminación de las producciones λ mediante la aplicación del procedimiento respectivo:
∑ → ABb
∑ → ABb | Ab | Bb
∑ → ABC
∑ → ABC | AB | AC | BC | A | B | C | λ
A → aA
A → aA | a
A→λ
B → bB
B → bB | b
B→λ
C → abC
C → abC | ab
C → AB
C → AB | A | B
G:
∑ → AB | ACA | ab A → aAa | B | CD B → bB | bA C → cC | λ D → aDc | CC | ABb
Mediante la aplicación del procedimiento enunciado, se identifican los no terminales anulables de G: ANUL1 = {C} ANUL2 = {C} ∪ {D} = {C, D} ANUL3 = {C, D} ∪ {A} = {C, D, A} ANUL4 = {C, D, A} ∪ {Σ} = {C, D, A, Σ} ANUL5 = ANUL4 ANUL = {C, D, A, Σ} Al eliminar de G las producciones λ (la única es C → λ) se obtiene la siguiente gramática equivalente a G: G’:
∑ → AB | ACA | ab | B | CA | AA | AC | A | C | λ A → aAa | B | CD | aa | C | D B → bB | bA | b C → cC | c D → aDc | CC | ABb | ac | C | Bb
Eliminar las producciones λ de las siguientes gramáticas: G1: G3:
Σ → aHb H → aHb | λ Σ → BCB A → aA | ab
G2: G4:
Σ → (A) | AA A → (A) | AA | λ Σ → S S → EA | SaBb | aEb