Ing. de Computacin y Sistemas Autmatas y Compiladores Ing. Carlos Gaytn Toledo
Anlisis Sintctico Descendente
El rbol de derivacin se construye: Desde la raz (smbolo inicial de la gramtica) hacia las hojas (cadena de tokens) Procesando la cadena de tokens de izquierda a derecha Construyendo la derivacin mas la izquierda
Problemas para el Anlisis Sintctico Descendente
La Recursividad por la izquierda: Una gramtica tiene recursividad izquierda si contiene un no-terminal A tal que existe una derivacin A+A para alguna cadena . Da lugar a un bucle infinito de recursin durante el anlisis sintctico descendente. Las Producciones que tienen el mismo prefijo: Son producciones de la forma A 1 | 2 | | n | Da lugar a indeterminismo, no sabramos cual produccin elegir. Probaramos una y si se produce un error haramos retroceso para probar derivar con las otras producciones. 01/05/2012 3
Eliminacin de la Recursividad por la Izquierda
Eliminacin de la Recursividad Izquierda Directa Elimina recursividad por la izquierda de un paso, es decir, de la forma A A | Se resuelve transformando las producciones originales de A segn como sigue: Ordenar las producciones de A en la forma siguiente: A A 1 | A 2 | | A m | 1 | 2 | | n Reemplazar las producciones de A por: A 1 A | 2 A | | n A A 1 A | 2 A | | m A | 01/05/2012 4
Eliminacin de la Recursividad por la Izquierda
Eliminar la recursividad izquierda de la gramtica: EE+T|E-T|T TT*F|T/F|F F ( E ) | num Eliminamos recursividad izquierda directa para T: remplazamos: TT*F|T/F|F por T F T T * F T| / F T | La gramtica queda as: E T E E + T E | - T E | T F T T * F T | / F T | F ( E ) | num 5
Solucin Eliminamos recursividad izquierda directa para E:
remplazamos EE+T|E-T|T por E T E E + T E| - T E | 01/05/2012
Eliminacin de la Recursividad por la Izquierda
Eliminacin de la Recursividad Izquierda Indirecta Elimina recursividad izquierda de varios pasos, donde a partir de una FS que empieza por un no terminal se puede derivar una nueva FS donde reaparece al principio dicho no terminal: A + A Se resuelve sistemticamente aplicando el siguiente Algoritmo: Ordenar los smbolos no trminales segn A1, A2, ..., An Desde i=1 Hasta n Desde j=1 Hasta i-1 Reemplazar c/prod. AiAj por Ai1|2||k donde Aj1|2||k son las reglas actuales de Aj Eliminar recursividad izquierda directa de las producciones de Ai 01/05/2012 6
Eliminacin de la Recursividad por la Izquierda
Eliminar recursividad izquierda indirecta en la G: SAa|b AAc|Sd| Donde: S Aa Sda presenta recursividad izquierda indirecta. Trabajamos con A2 = A: Trabajamos con la produccin (4) ASd AAad|bd Eliminamos recursividad izquierda directa para A AAc|Aad|bd| A b d A | A A c A| a d A| La nueva gramtica es: SAa|b A b d A | A A c A | a d A | 7
Solucin A1 = S, A2 = A Trabajamos con A1 = S: No hay no terminales anteriores a S No hay recursividad izquierda directa para S 01/05/2012
Factorizacin por la izquierda
Una gramtica se factoriza por la izquierda cuando dos producciones para un no terminal tienen smbolos comunes por la izquierda: A 1 | 2. Algoritmo, que deja gramtica factorizada por la izquierda: Para cada no terminal A, encontrar el prefijo ms largo comn a dos o ms de sus producciones. Ordenar la producciones de A: A 1 | 2 | | n | Reemplazar las producciones de A por: A A | A 1 | 2 | | n Repetir el paso anterior hasta que no existan producciones con prefijos comunes.
01/05/2012
Factorizacin por la izquierda
Factorizar la gramatica: S ABc | ABde | ABdf | ABS Aa Bb ABd es el prefijo mas largo de las producciones de S: S ABdS | ABc | ABS S e | f AB es ahora el prefijo mas largo de las producciones de S: S ABS S dS | c | S S e | f
Anlisis Sintctico Ascendente
Construye el rbol de AS para una cadena de tokens desde las hojas hacia la raz o smbolo inicial. Construye la inversa de la derivacin mas a la derecha realizando reducciones en lugar de derivaciones.
01/05/2012
10
Anlisis Sintctico Ascendente
Cada reduccin sustituye una subcadena (empuadora, asidero o mango), que concuerde con el consecuente de un regla de produccin, por el antecedente de esa regla. El anlisis sintctico ascendente se basaba en la identificacin de las empuaduras. Formalmente, la empuadura de una FS derecha , esta descrita por una produccin A, y la posicin dentro de donde la cadena puede ser localizada y remplazada por A para producir la FS derecha anterior, en una derivacin derecha de . 01/05/2012 11
Empuadura, mango o asidero
Ejemplo: anlisis sintctico ascendente de la cadena abbcde con la gramtica: S aABe A Abc | b Bd abbcde 3 aAbcde 2 aAde 4 aABe 1 S (1) (2) (3) (4) Las empuaduras de las FS son: (1) posicin 2, produccin A b (2) posicin 2, produccin A Abc (3) posicin 3, produccin B d (4) posicin 1, produccin S aABe 01/05/2012 12