TALF. Tema6 n 2 TEMA 6.- GRAMTICAS INDEPENDIENTES DEL CONTEXTO 6.1. Gramticas independientes del contexto. 6.2. Limpieza de Gramticas Independientes del contexto. 6.3. Gramticas limpias y gramticas sucias. 6.4. Limpieza de gramticas 6.4.1. Teorema de los smbolos vivos 6.4.2.Teorema de los smbolos accesibles 6.4.3. Anlisis automtico de la limpieza de gramticas 6.5 Gramticas bien formadas 6.6. Formas Normales de Gramticas Independientes del contexto. 6.6.1. Forma Normal de Chomsky (FNC) 6.6.2. Forma Normal de Greibach (FNG) TALF. Tema6 n 3 6.1. Gramticas independientes del contexto. Tcnicas para preparar una gramtica tipo 2 para ser tratada eficientemente por un autmata con pila: Gramticas limpias Gramticas bien formadas Formas normales de Chomsky y Greibach TALF. Tema6 n 4 6.2. Limpieza de Gramticas Independientes del contexto. Las gramticas de los lenguajes de programacin estn formadas por un conjunto de reglas BNF, cuyo nmero suele ser bastante amplio, lo cual incide en la ocultacin de distintos problemas que pueden producirse, tales como tener reglas que produzcan smbolos que no se usen despus, o que nunca se llegue a cadenas terminales. Todo esto se puede solventar realizando la transformacin de la gramtica inicial sucia a una gramtica limpia. TALF. Tema6 n 5 6.3. Gramticas limpias y gramticas sucias. Definiciones. Smbolo muerto (superfluo): es un smbolo no terminal que no genera ninguna cadena de smbolos terminales. Smbolo vivo: es un smbolo no terminal del cual se puede derivar una cadena de smbolos terminales. Todos los smbolos terminales son smbolos vivos. Es decir son smbolos vivos lo que no son muertos. Smbolo inaccesible: es un smbolo no terminal al que no se puede llegar por medio de producciones desde el smbolo inicial. Smbolo accesible: es un smbolo que aparece en una cadena derivada del smbolo inicial. Es decir, aquel smbolo que no es inaccesible. Smbolo extrao: se denomina as a todo smbolo muerto o inaccesible. Gramtica sucia: es toda gramtica que contiene smbolos extraos. Gramtica limpia: es toda gramtica que no contiene smbolos extraos. TALF. Tema6 n 6 6.4. Limpieza de gramticas toda gramtica en bruto ha de limpiarse con el objetivo de eliminar todos los smbolos extraos. El mtodo de limpiar las gramticas sucias consiste en detectar en primer lugar todos los smbolos muertos, y a continuacin se detectan todos los smbolos inaccesibles. Es importante seguir este orden, puesto que la eliminacin de smbolos muertos puede generar nuevos smbolos inaccesibles. Los algoritmos que se utilizan en la limpieza de gramticas se basan en los teoremas que se enuncian a continuacin TALF. Tema6 n 7 6.4. Limpieza de gramticas 6.4.1. Teorema de los smbolos vivos Si todos los smbolos de la parte derecha de una produccin son vivos, entonces el smbolo de la parte izquierda tambin lo es. Algoritmo para detectar smbolos muertos: 1. Hacer una lista de no-terminales que tengan al menos una produccin sin smbolos no terminales en la parte derecha. 2. Dada una produccin, si todos los no-terminales de la parte derecha pertenecen a la lista, entonces podemos incluir al no terminal de la parte izquierda. 3. Cuando no se puedan incluir ms smbolos mediante la aplicacin del paso 2, la lista contendr todos los smbolos vivos, el resto sern muertos. TALF. Tema6 n 8 6.4. Limpieza de gramticas. Ejemplo. Determinar los smbolos muertos de la gramtica expresada en BNF: <INICIAL>::= a <NOTA 1> <NOTA2> <NOTA3> | <NOTA4> d <NOTA 1>::= b <NOTA2> <NOTA3> <NOTA2>::= e | d <NOTA3>::= g <NOTA2> <NOTA4>::= <NOTA 1> f <NOTA5> <NOTA5>::= t <NOTA4> | v <NOTA5> aplicando los pasos del algoritmo: 1. Confeccin de la lista: slo hay un smbolo no terminal con el cual comenzar la lista. <NOTA2> 2. Aplicando el teorema 6.4.1. se incluyen en la lista por el siguiente orden: <NOTA3> <NOTA1> <INICIAL> 3. No se puede aplicar el teorema ms veces, por lo tanto la lista de smbolos vivos est completa y los smbolos <NOTA4> y <NOTA5> son no terminales muertos. TALF. Tema6 n 9 6.4. Limpieza de gramticas 6.4.2.Teorema de los smbolos accesibles Si el smbolo no terminal de la parte izquierda de una produccin es accesible, entonces todos los smbolos de la parte derecha tambin lo son. Algoritmo para detectar smbolos accesibles: 1. Se comienza la lista con un nico no terminal, el smbolo inicial. 2. Si la parte izquierda de la produccin est en la lista, entonces se incluyen en la misma a todos los no terminales que aparezcan en la parte derecha. 3. Cuando ya no se puedan incluir ms smbolos mediante la aplicacin del paso 2, la lista contendr todos los smbolos accesibles, y el resto ser inaccesible. TALF. Tema6 n 10 6.4. Limpieza de gramticas. Ejemplo. Sea la siguiente gramtica en BNF: <INICIAL>::= a<NOTER1><NOTER2>|<NOTER1> <NOTER1>::= c <NOTER2> d <NOTER2>: := e | f <INICIAL> <NOTER3>::= g <NOTER4> | h <NOTER4> t <NOTER4>::= x l y l z Aplicando el algoritmo los smbolos inaccesibles son: 1. Confeccin de la lista: <INICIAL> 2. Aplicacin del teorema 6.4.2 <NOTER1> <NOTER2> 3. No se puede aplicar ms veces el paso, luego la lista de smbolos accesibles est completa, y los no terminales inaccesibles son: <NOTER3> <NOTER4> TALF. Tema6 n 11 6.4. Limpieza de gramticas. 6.4.3. Anlisis automtico de la limpieza de gramticas Los algoritmos de limpieza de gramticas comprueban si las gramticas son limpias. Los pasos para el tratamiento de cualquier gramtica son: Una gramtica es limpia si no tiene: smbolos muertos smbolos inaccesibles reglas innecesarias (A::=A; stas se eliminan directamente) TALF. Tema6 n 12 6.4. Limpieza de gramticas. Ejemplo. Ejemplo: <INICIAL>::= A <NOTER1> <NOTER2> <INICIAL>: := <NOTER1> <NOTER1>::= C <NOTER2> D <NOTER2>::= E <NOTER2>::= F <INICIAL> <NOTER3>::= G <NOTER4> <NOTER3>::= H <NOTER4> T <NOTER4>::= X <NOTER4>::= Y <NOTER4>::= Z El analizador indicar que la gramtica no es limpia. La relacin de smbolos no accesibles: NOTER3 y NOTER4. TALF. Tema6 n 13 6.5 Gramticas bien formadas Una gramtica est bien formada si: 1. Est limpia. Sin smbolos muertos Sin smbolos inaccesibles Sin reglas innecesarias 2. No tiene reglas no generativas (A::= , AS). 3. No tiene reglas de redenominacin (A::=B). TALF. Tema6 n 14 6.5 Gramticas bien formadas Algoritmo para eliminar las reglas no generativas (A::= , AS): P = P //P= reglas no generativas; P=reglas generativas Repetir Para cada P=( A eP y AS ) P = P- {P} Para cada P = (B::=xAy) eP P = P {B::=xy} Hasta que todas las reglas sean generativas TALF. Tema6 n 15 6.5 Gramticas bien formadas. Ejemplo. Ejemplo: P = {(A::=C0B), (A::=), (B::=BC), (B::=), (C::=0B), (C::=)} Aplicando el algoritmo: Eliminacin de la regla B::= : P = {(A::=C0B), (A::=C0) ,(A::=), (B::=BC), (B::=C), (C::=0B), (C::=0), (C::=)} Eliminacin de la regla C::= : P = {(A::=C0B), (A::=0B), (A::=C0) , (A::=0) ,(A::=), (B::=BC), (B::=C), (B::=B), (B::=), (C::=0B), (C::=0)} Eliminacin de la regla B::= que ha aparecido de nuevo: P = {(A::=C0B), (A::=0B), (A::=C0) , (A::=0) ,(A::=), (B::=BC), (B::=C), (C::=0B), (C::=0)} Esta ser la gramtica sin reglas regenerativas Par eliminar las reglas de redenominacin (A::=B) se genera una nueva produccin A::=o por cada regla B::=o, con o eE* y se borra la regla A::=B. TALF. Tema6 n 16 6.6. Formas Normales de Gramticas Independientes del contexto. En algunas ocasiones es imprescindible que las gramticas se hallen dispuestas de una forma especial. Es decir, se trata de obtener una gramtica equivalente, que genera el mismo lenguaje, pero que debe cumplir unas especificaciones determinadas. A continuacin se muestran las dos formas normalizadas ms frecuentes, que se emplean en los lenguajes formales y sus aplicaciones. 6.6.1. Forma Normal de Chomsky (FNC) 6.6.2. Forma Normal de Greibach (FNG) TALF. Tema6 n 17 6.6.1. Forma Normal de Chomsky (FNC) Una gramtica se dice que est en la Forma Normal de Chomsky si sus reglas son de una de estas formas: A BC A a Siendo A, B, C no terminales y a un terminal. Teorema de la forma normal de Chomsky Toda gramtica libre de contexto sin la cadena vaca tiene una gramtica equivalente cuyas producciones estn en la Forma Normal de Chomsky. Forma Normal de Chomsky (FNC) Una gramtica se dice que est en la Forma Normal de Chomsky si sus reglas son de una de estas formas: A BC A a Siendo A, B, C no terminales y a un terminal. TALF. Tema6 n 18 6.6.1. Forma Normal de Chomsky (FNC) El algoritmo a seguir es: 1. P i eP / P i : A o 1 ...o n , donde o i e(E N E T ), n>2 1. o j , si o j eE T (es terminal) entonces hacer: 1. E N =E N {Co j } 2. P= P {Co j o j } 3. Modificar P i , donde antes pona o j ahora poner Co j . 2. P k eP / P k : A B 1 ...B m , donde BeE N , m>3 1. E N =E N {D j } j=1..m-2. 2. Reemplazar P k por las producciones: A B 1 D 1 , D 1 B 2 D 2 ,..., D m-2 B m-1 B m TALF. Tema6 n 19 6.6.1. Forma Normal de Chomsky (FNC). Ejemplo. Sea la gramtica G=( EN={S, A, B}, ET ={a, b}, P, S) cuyas producciones son: S bA | aB A bAA | aS | a B aBB | bS | b encontrar una gramtica equivalente en FNC. las reglas pueden reescribirse: (1) S bA (2) S aB (3) A bAA (4) A aS (5)(*) A a (6) B aBB (7) B bS (8)(*) B b Solamente las sealadas con (*) estn en forma FNC. La produccin (1) se sustituye por dos: S C b A C b b Igualmente la (2) puede sustituirse por S C a B C a a Las producciones (3) y (4) se sustituyen por A C b D 1 D 1 AA A C a S y la (6) y la (7) por B C a D 2 D 2 BB B C b S TALF. Tema6 n 20 6.6.1. Forma Normal de Chomsky (FNC). Ejemplo. la gramtica equivalente en FNC es: S C b A S C a B A C a S A C b D 1 A a B C b S B C a D 2 B b D 1 AA D 2 BB C a a C b b TALF. Tema6 n 21 6.6.2. Forma Normal de Greibach (FNG) Se dice que una gramtica est en la Forma Normal de Greibach si sus reglas de produccin son de la forma: A a o A a donde A e N , a e T o e N * Teorema de la forma normal de Greibach Todo lenguaje de contexto libre sin la cadena vaca puede ser generado por una gramtica cuyas reglas de produccin son de la forma A a o A a donde A e N , a e T o e N * Ejemplo: La gramtica dada en el ejemplo anterior. S bA | aB A bAA | aS | a B aBB | bS | b TALF. Tema6 n 22 6.6.2. Forma Normal de Greibach (FNG) Funciones previas utilizadas en el algoritmo para obtener la FNG: 1. Eliminar recursividad a izquierdas, las producciones A Ao. Operacin para eliminar la recursividad en un smbolo: 1. Crear una nueva variable B A , N = N B A 2. P i eP, P i : A Ao, 1. Aadir a P: B A o y B A oB A 2. Sacar A Ao de P. 3. P j eP, P j : A |, y | no empieza por A 1. Aadir A |B A La notamos como ELIMINA recursividad (A) 2. Sustiruir en las reglas A Bo las reglas de B Operacin para eliminar una produccin A Bo, con A=B. 1. Sacar A Bo de P. 2. P i eP, tq B |, aadir A |o La notamos como ELIMINA produccin (A Bo) TALF. Tema6 n 23 6.6.2. Forma Normal de Greibach (FNG) Pasos para conseguir la FNG: 1. Partir de una gramtica en forma normal de Chomsky. En realidad basta con que sea una gramtica limpia y sus producciones tengan la forma: A ao o A o donde A e N , a e T o e N * 2. Establecer un determinado orden en los smbolos no-terminales y Poner las producciones en la forma: A i A j o, con j>i. 1. Para k=1,...,m 1. Para j=1,...,k-1 1. P i eP, P i : A k A j o, ELIMINAR produccin (A k A j o) 2. Si - A k A k o entonces ELIMINA recursividad (A k ) TALF. Tema6 n 24 6.6.2. Forma Normal de Greibach (FNG) 3. Poner las producciones en la forma: A i ao. 1. Para i=m-1,...,1 1. P i eP, P i : A i A j o, y j>i ELIMINAR produccin (A i A j o) 2. Para k=1,...,m 1. P i eP, P i : B j A k o, 1. ELIMINAR produccin (B j A k o) TALF. Tema6 n 25 6.6.2. Forma Normal de Greibach (FNG). Ejemplo. Ejemplo: 1. Partimos de la gramtica en FNC del ejemplo anterior: 1. S C b A |C a B 2. A C a S| C b D 1 |a 3. B C b S| C a D 2 |b 4. D 1 AA 5. D 2 BB 6. C a a 7. C b b 2. Tomamos el orden anterior para N ={S=A 1 }. Poner las producciones en la forma: A i A j o, con j>i. TALF. Tema6 n 26 6.6.2. Forma Normal de Greibach (FNG) 2. Tomamos el orden anterior para N ={S=A 1 }. Poner las producciones en la forma: A i A j o, con j>i. 1. Para k=1,...,m //m=7 1. Para j=1,...,k-1 1. P i eP, P i : A k A j o, ELIMINAR produccin (A k A j o) k=4 (D 1 ), j=2 (A) cambian las producciones: ELIMINAR produccin (D 1 AA) por: D 1 C a SA| C b D 1 A| aA K=5 (D 2 ), , j=3(B) ELIMINAR produccin (D 2 BB) por: D 2 C b SB| C a D 2 B|bB 2. No - A k A k o 1. S C b A |C a B 2. A C a S| C b D 1 |a 3. B C b S| C a D 2 |b 4. D 1 AA 5. D 2 BB 6. C a a 7. C b b Resultado paso 2 1. S C b A |C a B 2. A C a S| C b D 1 |a 3. B C b S| C a D 2 |b 4. D 1 C a SA| C b D 1 A| aA 5. D 2 C b SB| C a D 2 B|bB 6. C a a 7. C b b TALF. Tema6 n 27 6.6.2. Forma Normal de Greibach (FNG) 3. Poner las producciones en la forma: A i ao. 1. Para i=m-1,...,1 //m=7 1. P i eP, P i : A i A j o, y j>i i=5 ELIMINAR produccin (D 2 C b SB| C a D 2 B|bB) por: D 2 bSB| aD 2 B|bB i= 4 ELIMINAR produccin (D 1 C a SA| C b D 1 A| aA) por: D 1 aSA| bD 1 A| aA i= 3 ELIMINAR produccin (B C b S| C a D 2 |b) por: B bS| aD 2 |b i= 2 ELIMINAR produccin (A C a S| C b D 1 |a) A aS| bD 1 |a i= 2 ELIMINAR produccin (S C b A |C a B) por: S bA |aB 1. Para k=1,...,m 1. P i eP, P i : B j A k o, No existen 1. S C b A |C a B 2. A C a S| C b D 1 |a 3. B C b S| C a D 2 |b 4. D 1 C a SA| C b D 1 A| aA 5. D 2 C b SB| C a D 2 B|bB 6. C a a 7. C b b Resultado paso 3 1. S bA |aB 2. A aS| bD 1 |a 3. B bS| aD 2 |b 4. D 1 aSA| bD 1 A| aA 5. D 2 bSB| aD 2 B|bB 6. C a a 7. C b b TALF. Tema6 n 28 6.6.2. Forma Normal de Greibach (FNG) Resultado paso 3: gramtica equivalente e FNG: 1. S bA |aB 2. A aS| bD 1 |a 3. B bS| aD 2 |b 4. D 1 aSA| bD 1 A| aA 5. D 2 bSB| aD 2 B|bB 6. C a a 7. C b b Si ahora la limpiamos: Simbolos vivos: todos Smbolos accesibles: S, A, B, D 1 , D 1 Eliminamos C 1 ,C 2 Quedando la gramtica limpia: 1. S bA |aB 2. A aS| bD 1 |a 3. B bS| aD 2 |b 4. D 1 aSA| bD 1 A| aA 5. D 2 bSB| aD 2 B|bB Equivalente a: 1. S bA | aB 2. A bAA | aS | a 3. B aBB | bS | b