Você está na página 1de 35

Gramtica Libre del

Contexto
Abraham Cisneros Escobar
Jonathan A. Ruiz Navarro
INTRODUCCIN
Existen gramticas de diferentes formas que generan un mismo lenguaje como son:

Gramticas incontextuales o libres de contexto

En lingstica e informtica, una gramtica libre de contexto (o de contexto libre) es una


gramtica formal en la que cada regla de produccin es de la forma:
Vw
Donde V es un smbolo no terminal y w es una cadena de terminales y/o no
terminales. El trmino libre de contexto se refiere al hecho de que el no terminal V
puede siempre ser sustituido por w sin tener en cuenta el contexto en el que ocurra. Un
lenguaje formal es libre de contexto si hay una gramtica libre de contexto que lo
genera.
Las gramticas libres de contexto permiten
describir la mayora de los lenguajes de
programacin, de hecho, la sintaxis de la
mayora de lenguajes de programacin est
definida mediante gramticas libres de
contexto. Por otro lado, estas gramticas
son suficientemente simples como para
permitir el diseo de eficientes algoritmos
de anlisis sintctico que, para una cadena
de caracteres dada, determinen cmo
puede ser generada desde la gramtica.
Gramtica Formal
Una gramtica G es una cudrupla G = (N, T, P, S) donde:

N es un conjunto finito no vaco de smbolos llamados no terminales.

T es un alfabeto finito no vaci de smbolos llamados terminales.

S es un smbolo inicial smbolo auxiliar especial llamado axioma.

P es un conjunto de reglas de produccin.


Forma normal de Chomosky
Gramticas
Forma normal de Chomsky
Diremos que una gramtica incontextual (libre de contexto) G= (N, , P, S) que no
genera la cadena vaca (), est en FNC cuando todas sus reglas son de la forma:

A BC con A, B, C N
A a, con A N y a

Donde A, B y C son smbolos no terminales y a es un smbolo no terminal

Todo lenguaje libre de contexto que no posee a la cadena vaca, es expresable


por medio de una gramtica en forma normal de Chomsky y recprocamente.
Smbolos intiles
Smbolos no generadores:

Son aquellos que no contienen smbolos terminales.

Smbolos no alcanzables:

Son aquellos smbolos que no son derivables de forma directa o


indirecta desde el smbolo de inicio.
Smbolos generadores.
Smbolos generadores:

Todos los smbolos terminales de una gramtica son generadores.


Toda aquella variable que tenga por lo menos una produccin que est
conformada nicamente de smbolos generadores.
La cadena vaca es un smbolo generador.
Pasos para obtener una FNC
Forma intermedia.
1) Limpiamos nuestra gramtica de smbolos intiles, smbolos con
cadena vaca y smbolos no generadores.
a) Para encontrar los smbolos no generadores identificamos los smbolos generadores.
2) Eliminamos smbolos no alcanzables.
3) Eliminamos producciones .
4) Eliminamos producciones unitarias.

Forma normal de Chomsky.


1) Reemplazar terminales por variables.
2) Reemplazar produccin de tres o ms variables.
Ejemplo:
Smbolos generadores:

A es generador: A c
B es generador: B b
Considere la siguiente Gramtica: C es generador: C
D es generador: D
F es generador: F d
Gramtica original S es generador: S BCa

Smbolos no Generadores: E y G

Eliminamos E y G de la gramtica y en las


producciones presentes.
Eliminando smbolos no
alcanzables
Pueden existir smbolos no alcanzables desde un F no es derivable desde el smbolo inicial.
inicio o en consecuencia de la eliminacin de
smbolos no generadores (paso anterior).
Eliminamos F por ser un smbolo no
alcanzable.

eeee

Smbolos no alcanzables: Son aquellos smbolos que no


son derivables de forma directa o indirecta desde el
smbolo de inicio S.
Se debe contemplar la posibilidad de que en
donde aparezca una variable Y que contenga ,

Eliminando producciones
sta ahora podr aparecer o no aparecer, ya que
en una tomar el papel del string vaco y en la
otra estar siendo otra cosa (otro smbolo).
Este paso consiste en formar las producciones de
la forma X . Smbolos anulables: C, D y B ( esto por la
produccin B CD donde C y D son anulables).

Smbolos anulables: Un smbolo anulable Y va a ser


aquel que tenga entre sus producciones a la produccin En cada produccin donde hay presentes
Y o tambin aquel que tenga por lo menos una smbolos anulables , consideramos las
produccin en donde todas las variables involucradas combinaciones en las que cada una de dichas
son anulables a la vez . variables pudieran estar presentes.
Eliminando producciones Si se tiene S A , se reemplazar esta produccin
por todas las producciones de A.
unitarias Qu pasa si la produccin a reemplazar contiene
dentro de s misma otra produccin unitaria?
Consiste en reemplazar variables por Primero reemplazamos esas producciones unitarias
producciones unitarias. por sus correspondientes producciones.

Y s S A contiene la produccin unitaria A S?


Primero se ponen en S todas las producciones
de A sin considerar A S
Despus ponemos todas las en A todas las
producciones de S sin considerar SA.

Producciones unitarias: Las producciones unitarias son


aquellas que tienen una nica variable en su cuerpo.
(Smbolos terminales solos no cuentan como
producciones unitarias)
Forma normal de Chomsky
La gramtica de abajo representa forma intermedia,
la cual es apta para ser modificada por una FNC.

No contiene:
Smbolos intiles.
Smbolos con cadena vaca.
Smbolos no generadores.
Smbolos no alcanzables
Producciones unitarias.
Reemplazando terminales
por variables.
Creamos 4 nuevas variables. Una
Consiste en reemplazar todos aquellos smbolos
terminales que estn acompaados en alguna
para cada smbolo terminal.
produccin por uno o ms smbolos a estos
terminales los reemplazamos por nuevas
variables que tendrn una nica produccin( la
produccin de dicho smbolo)
Reemplazando producciones
Creamos nuevas variables con
de 3 o ms variables producciones de dos variables y las
reemplazamos en sus respectivas
Consiste en reemplazar todas las producciones producciones.
con 3 o ms variables por una que contenga slo
dos.
Forma Normal de Greibach
Gramticas
Forma Intermedia de Greibach
Al igual que con la FNC, una gramtica dada debe ser llevada a una forma
intermedia antes de poder transformarla a su correspondiente forma normal de
Greibach. En el caso de Chomsky, la forma intermedia implicaba eliminar los
smbolos intiles, las producciones y las producciones unitarias. En el caso de
Greibach, la forma intermedia debe cumplir con que todas las producciones sean
cadenas de una o ms variables, o producciones de un solo smbolo terminal, o
producciones de un smbolo terminal seguido por una o ms variables. Existen
muchos mtodos para llegar a esta forma intermedia. La que recomienda la
mayora de la gente es la que consiste en obtener la FNC de una gramtica. Y por
qu? Porque una gramtica que est en FNC cumple con estas tres condiciones
de la forma intermedia de Greibach.
Forma Normal de Greibach
La forma normal de Greibach de una gramtica dada es aquella que slo
contiene producciones de la forma:

Yx

donde x es un terminal y es una cadena conformada nicamente por


variables y puede tener largo cero (o sea, puede ser la cadena vaca). Una vez
tenemos nuestra gramtica en su forma intermedia, procedemos a aplicarle
las siguientes modificaciones, para as obtener su FNG:
Ejemplo 1:
1. Ordenamos y enumeramos nuestras variables de tal
forma que nos quede nuestro smbolo inicial S como la

Forma Normal de Chomsky primera variable de la enumeracin. La gramtica nos


quedara as:

S A1Y1|c|BY2|BA1|CA1|a|A1Y3|A1Y4 S X1 X11X2|c|X6X3|X6X11|X8X11|a|X11X4|X11X5
Y1 X2 X10X12
Y1 AB1 Y2 X3 X8X11
Y2 CA1 Y3 X4 X9X5
Y3 DY4 Y4 X5 X13X14
B X6 X8X9|X8X13|c|X6X12|b|X11X7|X11X14|d|X10X14
Y 4 C 1 D1
Y5 X7 X9X14
A A1Y1|c C X8 X8X13|c|X6X12|b
B CD|CC1|c|BB1|b|A1Y5|A1D1|d|AD1 D X9 X11X7|X11X14|X9X14|d
Y5 DD1 A X10 X11X2|c
A1 X11 a
C CC1|c|BB1|b B1 X12 b
D A1Y5|A1D1|DD1|d C1 X13 c
A1 a D1 X14 d
Dejamos el smbolo original a la izquierda de cada lnea para que se entienda cul fue la variable
B1 b
enumerada que reemplaz a cada variable. Ntese que cambiamos de orden a la variable A, al
C1 c ponerla por debajo de la variable D. El propsito de estas alteraciones en el orden original tienen
D1 d como fin que, al proceder con la enumeracin, en las producciones resultantes quede la menor
cantidad de producciones Xi Xj, en donde i sea mayor que j.
2. Eliminamos la recursin inmediata a la izquierda y la recursin a la izquierda. Qu se
entiende por recursin inmediata a la izquierda? Cuando tenemos una produccin de la forma X
Xa, decimos que X es tiene recursividad inmediata por la izquierda. Cuando tenemos por lo
menos una produccin de la forma X Ya, y la variable Y tiene por lo menos una produccin de la
forma YX decimos que X recursividad por la izquierda. Cmo eliminamos la recursin por
la izquierda? Primero reemplazamos en las producciones de X todas las apariciones de Y por
aquellas producciones de Y que no sean inmediatamente recursivas a la izquierda para Y. Con esto
logramos hacer que X tenga slo producciones inmediatamente recursivas por la izquierda.
Luego,supongamos que X tiene las siguientes producciones:

X Xa1 | Xa2| ... | Xan | 1| 2| ... | m

Donde las producciones j no son recursivas por la izquierda. Ahora creamos una variable auxiliar X'
y realizamos las siguientes transformaciones:

X 1| 2 | ... | m| 1X' | 2X' | ... | mX'


X' 1 | 2 | ... | nX' | 1X' | 2X' | ... | nX'
Variables que tienen producciones inmediatamente recursivas por la
izquierda.
En nuestro caso, las variables que tienen producciones inmediatamente
recursivas por la izquierda son X6, X8 y X9, debido a sus producciones
X6 X6X12, X8 X8X13 y X9 X9X14. Tambin tenemos la produccin
X8 X6X12 que es recursiva a la izquierda para la variable X6, y las
producciones X6 X8X9 y X6 X8X13 que son recursivas a la izquierda para la
variable X8.
Procedemos a dejar a ambas variables nicamente con recursividad inmediata a la izquierda:
1) Reemplazando a X8 por sus producciones no recursivas a la izquierda, las producciones

X6 X8X9|X8X13|X8X13|c|X6X12|b|X11X7|X11X14|X9X14|d|X10X14 se transforma en:

X6 cX9|X6X12X9|bX9|cX13|X6X12X13|bX13|c|X6X12|b|X11X7|X11X14|X9X14|d|X10X14
Ntese que no reemplazamos a X8
por su produccin X8 X8X13, ya que
esta produccin es recursiva por la
izquierda para X8.
2) Reemplazando a X6 por sus producciones no recursivas a la izquierda, las producciones
X8 X8X13|c| X6X12|b se transforman en:

X8 X8X13 | c | X8X9X12 | X8X13X12 | cX12 | bX12 | X11X7X12 | X11X14X12 | X9X14X12 | dX12 |


X10X14X12 | b

Aqu tampoco reemplazamos a X6 por su produccin X6 X6X12, ya que esta produccin


es recursiva por la izquierda para X6.

Ahora que solamente tenemos recursividad inmediata por la izquierda, procedemos a realizar las correspondientes
transformaciones:

1) Las producciones X6 cX9 | X6X12X9 | bX9 | cX13 | X6X12X13 | bX13 | c | X6X12 | b | X11X7 | X11X14 |
X9X14 |d | X10X14 se transforman en:

X6 cX9 | bX9 | cX13 | bX13 | c | b | X11X7 | X11X14 | X9X14 | d | X10X14 | cX9X6.1 | bX9X6.1 | cX13X6.1 |
bX13X6.1 |cX6.1 | bX6.1 | X11X7X6.1 | X11X14X6.1 | X9X14X6.1 | dX6.1 | X10X14X6.1

X6.1 X12X9 | X12X13 | X12 | X12X9X6.1 | X12X13X6.1 | X12X6.1


2) Las producciones X8 X8X13 | c | X8X9X12 | X8X13X12 | cX12 | bX12 | X11X7X12 |
X11X14X12 | X9X14X12 | dX12 | X10X14X12 | b se transforman en:

X8 c | cX12 | bX12 | X11X7X12 | X11X14X12 | X9X14X12 | dX12 | X10X14X12 | b |


cX8.1 | cX12X8.1 | bX12X8.1 | X11X7X12X8.1 | X11X14X12X8.1 | X9X14X12X8.1 |
dX12X8.1 | X10X14X12X8.1 | bX8.1

X8.1 X13 |X9X12|X13X12|X13X8.1|X9X12X8.1|X13X12X8.1

3) Y las producciones X9 X11X7 | X11X14 | X9X14 | d

se transforman en:

X9 X11X7|X11X14|d|X11X7X9.1|X11X14X9.1 | dX9.1

X9.1 X14 | X14X9.1


Nuestra gramtica, libre de recursividad por la izquierda, queda como sigue:

X1 X11X2 | c | X6X3 | X6X11 | X8X11 | a | X11X4 | X11X5

X2 X10X12
X3 X8X11
X 4 X 9X 5
X5 X13 X14
X6 cX9 | bX9 | cX13 | bX13 | c | b | X11X7 | X11X14 | X9X14 | d | X10X14 | cX9X6.1 | bX9X6.1 | cX13X6.1 |
bX13X6.1 |
cX6.1 | bX6.1 | X11X7X6.1 | X11X14X6.1 | X9X14X6.1 | dX6.1 | X10X14X6.1
X6.1 X12X9 | X12X13 | X12 | X12X9X6.1 | X12X13X6.1 | X12X6.1
X7 X9X12
X8 c | cX12 | bX12 | X11X7X12 | X11X14X12 | X9X14X12 | dX12 | X10X14X12 | b | cX8.1 | cX12X8.1 |
bX12X8.1 | X11X7X12X8.1 | X11X14X12X8.1 | X9X14X12X8.1 | dX12X8.1 | X10X14X12X8.1 | bX8.1
X8.1 X13 | X9X12 | X13X12 | X13X8.1 | X9X12X8.1 | X13X12X8.1
X9 X11X7 | X11X14 | d | X11X7X9.1 | X11X14X9.1 | dX9.1
X9.1 X14 | X14X9.1
X10 X11X2 | c
X11 a
X12 b
X13 c
X14 d
3. En nuestro tercer paso, eliminaremos todas las producciones de la forma Xi Xj, en donde i
es mayor que j. Para hacer esto, reemplazamos a Xj por todas sus producciones. Si al
reemplazar aparecen otras producciones de esta forma, repetimos este paso, hasta que
no queden ms producciones en donde la primera variable de la produccin tenga un ndice
menor al de la variable de la cabeza de la produccin. En nuestro caso, no hay ninguna
produccin de este tipo, pero vamos a mostrar unas producciones de ejemplo para ilustrar el
proceso:

X9 X11X7 | X11X14 | d | X11X7X9.1 | X11X14X9.1 | dX9.1


X10 X11X2 | c | X9X11X6
En este ejemplo, tenemos la produccin X10 X9X11X6 en la que la variable
de la izquierda de la produccin (X9) tiene un ndice menor al de la variable de
la cabeza de la produccin (X10). Reemplazando X9 por sus correspondientes
producciones nos queda:

X10 X11X2 | c | X11X7X11X6 | X11X14X11X6 | dX11X6 | X11X7X9.1X11X6


| X11X14X9.1X11X6 | dX9.1X11X6
4. En el ltimo paso, reemplazamos todas las producciones en las que haya
una variable al principio de la produccin (no importa el ndice que tenga) por
las producciones de dicha variable que empiecen con algn smbolo terminal.
Este proceso se realiza empezando por las ltimas variables de la gramtica y
luego se contina el proceso de reemplazo hacia arriba hasta llegar a las
producciones de la variable de inicio. En nuestra gramtica, partiramos con
las producciones de la variable X10 (ya que X11, X12, X13 y X14 tienen
producciones en las que slo hay involucrados smbolos terminales). La cosa
nos quedara as:

X10 X11X2 | c => X10 aX2 | c


Luego continuaremos con X9.1:
X9.1 X14 | X14X9.1 => X9.1 d | dX9.1
El proceso no presenta mayor dificultad, hasta que llegamos a X8.1, en donde
aparecen las producciones X8.1 X9X12 y X8.1 X9X12X8.1, que no comienzan
con X11, X12, X13 o X14. Pero no importa, ya que todas las producciones de X9
para estas alturas del proceso han sido modificadas para que empiecen con
un smbolo terminal, as que reemplazamos X9 directamente con sus
producciones:
Esto: X8.1 X13 | X9X12 | X13X12 | X13X8.1 | X9X12X8.1 | X13X12X8.1

Queda como esto:

X8.1 c | aX7X12 | aX14X12 | dX12 | aX7X9.1X12 | aX14X9.1X12 | dX9.1X12


| cX12 | cX8.1 | aX7X12X8.1 |
aX14X12X8.1 | dX12X8.1 | aX7X9.1X12X8.1 | aX14X9.1X12X8.1 |
dX9.1X12X8.1 | cX12X8.1
El proceso contina as sin mayores complicaciones, hasta que llegamos a la siguiente gramtica en
forma normal de Greibach:
X1 aX2 | c | cX9X3 | bX9X3 | cX13X3 | bX13X3 | cX3 | bX3 | aX7X3 | aX14X3 | aX7X14X3 | aX14X14X3 | dX14X3 | aX7X9.1X14X3 | aX14X9.1X14X3 | dX9.1X14X3 | dX3
| aX2X14X3 | cX14X3 | cX9X6.1X3 | bX9X6.1X3 | cX13X6.1X3 | bX13X6.1X3 | cX6.1X3 | bX6.1X3 | aX7X6.1X3 | aX14X6.1X3 | aX7X14X6.1X3 | aX14X14X6.1X3 |
dX14X6.1X3 | aX7X9.1X14X6.1X3 | aX14X9.1X14X6.1X3 | dX9.1X14X6.1X3 | dX6.1X3 | aX2X14X6.1X3 | cX14X6.1X14X6.1X3 | cX9X11 | bX9X11 | cX13X11 |
bX13X11 | cX11 | bX11 | aX7X11 | aX14X11 | aX7X14X11 | aX14X14X11 | dX14X11 | aX7X9.1X14X11
| aX14X9.1X14X11 | dX9.1X14X11 | dX11 | aX2X14X11 | cX14X11 | cX9X6.1X11 | bX9X6.1X11 | cX13X6.1X11 | bX13X6.1X11 | cX6.1X11 | bX6.1X11 | aX7X6.1X11 |
aX14X6.1X11 | aX7X14X6.1X11 | aX14X14X6.1X11 | dX14X6.1X11 | aX7X9.1X14X6.1X11 | aX14X9.1X14X6.1X11 | dX9.1X14X6.1X11 | dX6.1X11 | aX2X14X6.1X11 |
cX14X6.1X14X6.1X11 | cX11 | cX12X11 | bX12X11 | aX7X12X11 | aX14X12X11 | aX7X14X12X11 | aX14X14X12X11 | dX14X12X11 | aX7X9.1X14X12X11 |
aX14X9.1X14X12X11 | dX9.1X14X12X11 | dX12X11 | aX2X14X12X11 | cX14X12X11 | bX11 | cX8.1X11 | cX12X8.1X11 | bX12X8.1X11 | aX7X12X8.1X11 |
aX14X12X8.1X11 | aX14X12X8.1X11 | dX12X8.1X11 | aX2X14X12X8.1X11 | cX14X12X8.1X11
| bX8.1X11 | a | aX4 | aX5
X2 aX2X12 | cX12
X3 cX11 | cX12X11 | bX12X11 | aX7X12X11 | aX14X12X11 | aX7X14X12X11 | aX14X14X12X11 | dX14X12X11 |
aX7X9.1X14X12X11 | aX14X9.1X14X12X11 | dX9.1X14X12X11 | dX12X11 | aX2X14X12X11 | cX14X12X11 | bX11 | cX8.1X11
| cX12X8.1X11 | bX12X8.1X11 | aX7X12X8.1X11 | aX14X12X8.1X11 | aX14X12X8.1X11 | dX12X8.1X11 | aX2X14X12X8.1X11 |
cX14X12X8.1X11 | bX8.1X11
X4 aX7X5 | aX14X5 | dX5 | aX7X9.1X5 | aX14X9.1X5 | dX9.1X5
X5 c X14
X6 cX9 | bX9 | cX13 | bX13 | c | b | aX7 | aX14 | aX7X14 | aX14X14 | dX14 | aX7X9.1X14 | aX14X9.1X14 | dX9.1X14 | d | aX2X14 | cX14 | cX9X6.1 | bX9X6.1 | cX13X6.1 |
bX13X6.1 | cX6.1 | bX6.1 | aX7X6.1 | aX14X6.1 | aX7X14X6.1 | aX14X14X6.1 | dX14X6.1 | aX7X9.1X14X6.1 | aX14X9.1X14X6.1 | dX9.1X14X6.1 | dX6.1 |
aX2X14X6.1 | cX14X6.1X14X6.1
X6.1 bX9 | bX13 | b | bX9X6.1 | bX13X6.1 | bX6.1
X7 aX7X12 | aX14X12 | dX12 | aX7X9.1X12 | aX14X9.1X12 | dX9.1X12
X8 c | cX12 | bX12 | aX7X12 | aX14X12 | aX7X14X12 | aX14X14X12 | dX14X12 | aX7X9.1X14X12 | aX14X9.1X14X12 | dX9.1X14X12 | dX12 | aX2X14X12 | cX14X12 | b |
cX8.1 | cX12X8.1 | bX12X8.1 | aX7X12X8.1 | aX14X12X8.1 | aX14X12X8.1 | dX12X8.1 | aX2X14X12X8.1 | cX14X12X8.1 | bX8.1
X8.1 c | aX7X12 | aX14X12 | dX12 | aX7X9.1X12 | aX14X9.1X12 | dX9.1X12 | cX12 | cX8.1 | aX7X12X8.1 | aX14X12X8.1 |
dX12X8.1 | aX7X9.1X12X8.1 | aX14X9.1X12X8.1 | dX9.1X12X8.1 | cX12X8.1
X9 aX7 | aX14 | d | aX7X9.1 | aX14X9.1 | dX9.1
X9.1 d | dX9.1
X10 aX2 | c
X11 a X12 b X13 c X14 d
Ejemplo
G = (N, T, P, S) (simplificada y en FNC)

S AA|a
A AA|b

Paso 1: Aqu solamente hay un orden posible para los smbolos S, A.

Paso 2: En este paso solo hay que eliminar la recursividad a la izquierda del
smbolo A. Al hacerlo se obtiene la gramtica.
S AA|a
A b|bZ
Z A|AZ

Paso 3:

S bA|bAZ|a
A b|bZ
Z A|AZ
Paso 4 (Final):

S bA|bAZ|a
A b|bZ
Z b|bZ|bZZ
Ejemplo 2
Encontrar una gramtica en FNG equivalente a la siguiente gramtica (en FNC):

S AB|BC
A AB|a
B AA|CB|a
C a|b

Paso 1: Ordenar las variables: S, B, A, C. Este orden es ms adecuado porque


el cuerpo de las producciones de B comienza con A C, que son smbolos de
orden mayor.

S AB|BC
B AA|CB|a
A AB|a
C a|b
Paso 2:

S AB|BC
B AA|CB|a
A a|aZ
C a|b
Z B|BZ

Paso 3:

S aB|aZB|aAC|aZAC|aBC|bBC|aC
B aA|aZA|aB|bB|a
A a|aZ
C a|b
Z B|BZ
Paso 4 (Final):

S aB|aZB|aAC|aZAC|aBC|bBC|aC
B aA|aZA|aB|bB|a
A a|aZ
C a|b
Z aZ|aZA|aB|bB|a|aAZ|aZAZ|aBZ|bBZ|aZ

Você também pode gostar