Sei sulla pagina 1di 3

Eliminacin de smbolos intiles

Este algoritmo se divide en dos etapas, que hay que aplicar en ese orden.
Ej
SAa | B | D
Bb
AaA | bA | B
Cabd
1 etapa
Creamos un nuevo conjunto llamado V', que en principio es vaco.
V'={C}
Como primer paso, metemos en el conjunto todos aquellos no terminales que producen
SLO terminales, en alguna de sus producciones. Vemos que es el caso de de B y C, luego,
V'={B, C}
Como segundo paso, metemos todos aquellos no terminales que en alguna de sus producciones
tengan algn terminal. Es el caso de S (SaA) y A (AaA | bA).
V'={B, C, S, A}
Como ltimo paso, hay que eliminar todas aquellas producciones que no estn en el conjunto
V', vemos que en este caso nicamente es D, que est en la produccin S. Esto ocurre ya que
desde S se puede llegar a D, pero la produccin D no est, luego sobra.
De momento la gramtica nos queda:
SAa | B
Bb
AaA | bA | B
Cabd
2 etapa
Definimos un conjunto J que ser el de variables a analizar. Inicialmente contiene el smbolo S.
Definimos el conjunto V'', que tambin contiene inicialmente el smbolo S.
Y sea T' el conjunto de smbolos terminales.
J=V''={S}
T'={C}
Paso 1:
Sacamos un no terminal de J, en este caso nicamente podemos sacar S.
Luego vamos a analizar S, SAa | B.
Para cada produccin de S, aadimos a V'' todos los no terminales de dicha produccin, y
tambin aadimos a J dichos no terminales, ya que los analizaremos. En este caso:
V''={S, A, B}, J={A, B}
Tambin aadimos a T' los terminales que haya en dicha produccin, en este caso:
T'={a}
Paso 2:
Repetir paso 1. Sacamos de J un no terminal, A por ejemplo. AaA | bA | B
Vemos que todos los no terminales de A, ya estn en V'', luego no hacemos cambios. Y tambin
estn o estuvieron en J, pero vemos que para el conjunto T', aparece el terminal "b", que no
estaba. Lo aadimos.
V''={S, A, B}; J={B}; T'={a, b}
Paso 3:
Sacamos de J otro no terminal, el nico que nos queda, B. Bb
Evidentemente, como no tiene producciones de no terminales, J se queda vaco, y V''
no sufre cambios. Y tampoco T', ya que la "b" ya estaba.
En este momento, como tenemos J={C}, paramos. Hemos de eliminar todas las variables que
no estn en V'' y todos los terminales que no estn en T', y aquellas producciones que contengan
alguna variable que no est en V'' o T'.
En esta caso, Como la C no est en V'', la eliminamos. Y como la "d" no est en T', eliminamos
dicha produccin. La gramtica queda:
SAa | B
Bb
AaA | bA | B
Otro ejemplo
SAB|a
Aa
1 etapa
V'={C}
Metemos las variables que generen algn terminal.
V'={S, A}
Vemos que B no est, eliminamos toda la produccin donde se encuentra esa variable.
La gramtica queda:
Sa
Aa
2 etapa
J=V''={S}
T'={C}
Paso 1:
Analizando S. Sa
J={C}
V''={S}
T'={a}
Como J={C}, paramos. Vemos que AeV'', eliminamos la produccin.
La gramtica queda:
Sa
Eliminacin de producciones vacas.
Antes de empezar a explicar este algoritmo, definamos dos trminos.
Def: Se llama produccin nula a aquella produccin del tipo A
_Def: Un smbolo no terminal es anulable si A
_
Ejemplo del algoritmo
SaA
AaA |
_
Sea H el conjunto de smbolos anulables. Siguiendo las definiciones anteriores, A es anulable,
ya que A. Luego H={A}
Luego para cada elemento de H, deberemos quitar c , esto se hace del siguiente modo:
SaA (se queda igual)
AaA|a
Otro ejemplo
SAbb | ABC
AaA |
BbB |
CabC | AB
El conjunto de smbolos anulables en este caso es:
H={A, B, C, S}
Nota: Si S es anulable, eL(G)
Luego, la gramtica nos queda:
SABb | Ab | Bb | b
SABC | AB | AC | BC | A | B | C
AaA | a
BbB | b
CabC | ab
CAB | A | B
S (ya que S es anulable)
Eliminacin de producciones unitarias
Una produccin es unitaria si es del tipo:
AB
Bw|c
En realidad debera ser: Aw|c. Veamos cmo eliminar eso.
Ejemplo:
SA|Aa
AB
BC|b
CD|ab
Db
Llamaremos a H al conjunto de las parejas que estn compuestas por un no terminal que
produce y otro producido, es decir, si por ejemplo AB, en el conjunto deberamos aadir el
par (A, B). Por esta regla, tenemos:
H={(S, A), (A, B), (B, C), (C, D)}
Ahora tenemos que tener en cuenta todos los pares de la forma (A, B) y (B, C), entonces
debemos aadir el par (A, C), y as sucesivamente. Luego,
H={(S, A), (A, B), (B, C), (C, D), (S, B), (S, C), (S, D), (A, C), (A, D), (B, D)}
Como ltimo paso tengamos en cuenta la gramtica que nos dan.
Debemos escribir una segunda gramtica que tan slo contenga aquellas producciones donde
aparecen terminales, es decir:
SAa
Bb
Cab
Db
Y ahora, con cada uno de los pares de H, formamos la gramtica final. Lo hacemos mirando los
dos smbolos del par, es decir, si tenemos (S, B), deberemos aadir una produccin SB,
mirando antes en la anterior gramtica qu es lo que produce B, y vemos que en este caso,
Bb, luego la produccin sera Sb. Al final, la gramtica queda:
SAa | b | ab
Bb | ab
Cab | b
Db
Ab (no sufre modificacin)

Potrebbero piacerti anche