Está en la página 1de 43

Compiladores e Intrpretes

3er curso 2 cuatrimestre

Tema 8. Anlisis sintctico descendente 8.1 Introduccin 8.2 Anlisis descendente no determinista: backtracking 8.3 Anlisis descendente determinista: LL(1) 8.3.1 Gramticas LL(1) 8.3.2 Uso de la tabla de anlisis

8.1

Introduccin

Anlisis sintctico descendente


Introduccin (I)

Hasta ahora hemos estudiado cmo hacer anlisis ascendente con las tcnicas LR, SLR y LALR. Ahora vamos a ver varios enfoques descendentes. La principal diferencia es que ahora el anlisis parte del axioma, y hay que encontrar una derivacin que lleve hasta el programa proporcionado como entrada. El problema es que el nmero de posibles derivaciones es muy grande. Ya se ha estudiado en asignaturas como IA la existencia de estrategias generales (para cualquier problema) de bsqueda ciega y sus propiedades de las que se mencionan algunas: Las dos estrategias bsicas son en anchura y en profundidad. La bsqueda en anchura expande todos los nodos del mismo nivel antes de descender a los hijos. De esta forma, siempre se puede conseguir encontrar la solucin ptima (aquella para la que se requiere un menor nmero de pasos). La bsqueda en profundidad expande todos los nodos hijos de un nodo antes que los nodos hermanos. En profundidad, excepto rboles infinitos, se suele tener oportunidad de encontrar alguna solucin con menos esfuerzo.

Anlisis sintctico descendente


Introduccin (II)

Veamos un ejemplo de anlisis descendente:

Gramtica: E -> E + E E -> E * E E -> -E E -> (E) E -> id

E E E id + id * id

E-> E+E

Anlisis sintctico descendente


Introduccin (III) Gramtica: E -> E + E E -> E * E E -> -E E -> (E) E -> id

E E E id + id * id

E-> id

Anlisis sintctico descendente


Introduccin (IV) Gramtica: E -> E + E E -> E * E E -> -E E -> (E) E -> id

E E E id + E id * E id

E-> E*E

Anlisis sintctico descendente


Introduccin (V) Gramtica: E -> E + E E -> E * E E -> -E E -> (E) E -> id

E E E id + E id * E id

E-> id

Anlisis sintctico descendente


Introduccin (VI) Gramtica: E -> E + E E -> E * E E -> -E E -> (E) E -> id

E E E id + E id * E id

E-> id

Anlisis sintctico descendente


Introduccin (VII)

En las tcnicas vistas hasta ahora (ascendentes) siempre se ha sabido en cada circunstancia qu regla de la gramtica utilizar (reducir) En las tcnicas descendentes se tiene el mismo problema: hay que asegurarse de que siempre se conoce qu regla de la gramtica aplicar en funcin del smbolo de la entrada que se est analizando y el estado del anlisis en el que nos encontremos Una aproximacin simple e intuitiva al anlisis descendente puede abordar este problema probando reglas y, en caso de no poder aplicar ms para analizar la cadena de entrada, volver hacia atrs para probar otras (backtracking). Sin embargo, usar backtracking es poco eficiente, por lo que la tcnica descendente ms importante que veremos es la LL(1): Con procesamiento Left-To-Right (como los analizadores que ya hemos visto). Expandiendo el smbolo no terminal ms a la izquierda (Leftmost) primero. Requiere que la gramtica sea LL(1).

10

8.2

Anlisis descendente con backtracking (o con vuelta a atrs)

11

Anlisis sintctico descendente


Top-down con vuelta atrs lenta: conceptos

Podramos considerar el anlisis sintctico top-down con vuelta atrs lenta como un caso particular de bsqueda ciega en profundidad (se desempata de izquierda a derecha) El criterio para decidir si una regla es aplicable en una posicin es la coincidencia de esa posicin con el no terminal que est en la parte izquierda de la regla. No podemos continuar por un camino cuando tengamos terminales que discrepen con el programa (podemos suponer el orden de recorrido natural del programa (de izquierda a derecha) Habremos terminado el proceso en dos situaciones: Si el rbol de derivacin se cierra porque se ha llegado a eliminar todos los no terminales y se obtiene la misma secuencia de terminales del programa. En este caso se ha construido un rbol sintctico para el programa que resulta ser correcto Si no se ha podido cerrar el rbol de derivacin pero se han probado todas las reglas en cada posicin y no se puede aplicar ninguna otra opcin. En ese caso se ha demostrado que el programa es sintcticamente incorrecto.

12

Anlisis sintctico descendente


Top-down con vuelta atrs lenta: algoritmo 1. 2. 3. 4. 5. 6. Smbolo actual = axioma Encontrar las reglas que expanden el smbolo actual. Si slo hay una regla, aplicarla. Si hay varias reglas, aplicar la primera y mantener las otras en reserva. Por cada smbolo de la parte derecha de la regla, repetir desde el paso 2. Cuando el anlisis falle porque la regla requiere que el siguiente smbolo de la entrada sea un cierto terminal pero no lo es, o la expansin del axioma es correcta pero no cubre toda la cadena de entrada: 1. Deshacer la aplicacin de esta regla. 2. Volver al punto de eleccin de la regla. 3. Elegir la siguiente alternativa. 7. El anlisis termina con xito si: 1. Se pueden generar todos los smbolos terminales de la cadena de entrada a partir de la expansin de los no terminales. 2. No se puede analizar la cadena/programa de entrada puesto que es invlida y aunque se han intentado probar todas las reglas en cada paso, no hay ninguna derivacin posible.
13

Anlisis top-down, vuelta atrs lenta


Ejemplos previos

G=<{E},{-,+,i} {E-E |i |E+E}, E> -

E E +

E E i -

i+--i

E -

14

Anlisis top-down, vuelta atrs lenta


Ejemplos previos

G=<{E},{-,+,i} {E-E |i |E+E}, E> -

E E E i +

E E i -

i+--i

15

Anlisis top-down, vuelta atrs lenta


Ejemplos previos

G=<{E},{-,+,i} {E-E |i |E+E}, E> -

E E E i +

E E i -

i+--i

16

Anlisis top-down, vuelta atrs lenta


Ejemplos previos

G=<{E},{-,+,i} {E-E |i |E+E}, E> -

E E E i +

E E i E

i+--i

17

Anlisis top-down, vuelta atrs lenta


Ejemplos previos

G=<{E},{-,+,i} {E-E |i |E+E}, E> -

E E E i +

E E i E

i+--i

18

Anlisis top-down, vuelta atrs lenta


Ejemplos previos

G=<{E},{-,+,i} {E-E |i |E+E}, E> -

E E E i +

E E i E

i+--i

19

Anlisis top-down, vuelta atrs lenta


Ejemplos previos

G=<{E},{-,+,i} {E-E |i |E+E}, E> -

E E E i +

E E i E

i+--i

20

10

Anlisis top-down, vuelta atrs lenta


Ejemplos previos

G=<{E},{-,+,i} {E-E |i |E+E}, E> -

E E E i +

E E i E

i+--i

E -

21

Anlisis top-down, vuelta atrs lenta


Ejemplos previos

G=<{E},{-,+,i} {E-E |i |E+E}, E> -

E E E i +

E E i E

i+--i

E i

22

11

Anlisis top-down, vuelta atrs lenta


Ejemplos previos

G=<{E},{-,+,i} {E-E |i |E+E}, E> -

E E E i +

E E i E

i+--i

E i

ACEPTADA

23

Anlisis top-down, vuelta atrs lenta


Ejemplos previos

Considerar el anlisis para i++i G=<{E},{-,+,i} {E-E |i |E+E}, E> E i++i

24

12

Anlisis top-down, vuelta atrs lenta


Ejemplos previos

Considerar el anlisis para i++i G=<{E},{-,+,i} {E-E |i |E+E}, E> E i++i

25

Anlisis top-down, vuelta atrs lenta


Ejemplos previos

Considerar el anlisis para i++i G=<{E},{-,+,i} {E-E |i |E+E}, E> E E i++i

26

13

Anlisis top-down, vuelta atrs lenta


Ejemplos previos

Considerar el anlisis para i++i G=<{E},{-,+,i} {E-E |i |E+E}, E> E i E i++i

27

Anlisis top-down, vuelta atrs lenta


Ejemplos previos

Considerar el anlisis para i++i G=<{E},{-,+,i} {E-E |i |E+E}, E> E i E i E i++i

28

14

Anlisis top-down, vuelta atrs lenta


Ejemplos previos

Considerar el anlisis para i++i G=<{E},{-,+,i} {E-E |i |E+E}, E> E E + E E i E i++i

29

Anlisis top-down, vuelta atrs lenta


Ejemplos previos

Considerar el anlisis para i++i G=<{E},{-,+,i} {E-E |i |E+E}, E> E E + E E i E i++i

30

15

Anlisis top-down, vuelta atrs lenta


Ejemplos previos

Considerar el anlisis para i++i G=<{E},{-,+,i} {E-E |i |E+E}, E> E E E E + E E i E i++i

31

Anlisis top-down, vuelta atrs lenta


Ejemplos previos

Considerar el anlisis para i++i G=<{E},{-,+,i} {E-E |i |E+E}, E> E E E E i + E E i E i++i

32

16

Anlisis top-down, vuelta atrs lenta


Ejemplos previos

Considerar el anlisis para i++i G=<{E},{-,+,i} {E-E |i |E+E}, E> E E E E i + E E i E i++i

33

Anlisis top-down, vuelta atrs lenta


Ejemplos previos

Considerar el anlisis para i++i G=<{E},{-,+,i} {E-E |i |E+E}, E> E E E E i + E E i E E E E i++i

34

17

Anlisis top-down, vuelta atrs lenta


Ejemplos previos

Considerar el anlisis para i++i G=<{E},{-,+,i} {E-E |i |E+E}, E> E E E E i + E E i i E E E i++i

35

Anlisis top-down, vuelta atrs lenta


Ejemplos previos

Considerar el anlisis para i++i G=<{E},{-,+,i} {E-E |i |E+E}, E> E E E E i + E E i i E i++i

E E i -

36

18

Anlisis top-down, vuelta atrs lenta


Ejemplos previos

Considerar el anlisis para i++i G=<{E},{-,+,i} {E-E |i |E+E}, E> E E E E i + E E E i + E E i++i

E E i -

37

Anlisis top-down, vuelta atrs lenta


Ejemplos previos

Considerar el anlisis para i++i G=<{E},{-,+,i} {E-E |i |E+E}, E> E E E E i + E E E E i + E E i++i

E E i -

38

19

Anlisis top-down, vuelta atrs lenta


Ejemplos previos

Considerar el anlisis para i++i G=<{E},{-,+,i} {E-E |i |E+E}, E> E E E E E i E + E E E E i + E E i++i

E E i -

39

Anlisis top-down, vuelta atrs lenta


Ejemplos previos

Considerar el anlisis para i++i G=<{E},{-,+,i} {E-E |i |E+E}, E> E E E E E i + E i E E i + E E i++i

E E i -

40

20

Anlisis top-down, vuelta atrs lenta


Ejemplos previos

Considerar el anlisis para i++i G=<{E},{-,+,i} {E-E |i |E+E}, E> E E E EE E i Ei + E i E E i + E E i++i

E E i -

41

Anlisis top-down, vuelta atrs lenta


Ejemplos previos

Considerar el anlisis para i++i G=<{E},{-,+,i} {E-E |i |E+E}, E> E E E EE E i EiE + E + E E i + E E E i++i

E E i -

42

21

Anlisis top-down, vuelta atrs lenta


Ejemplos previos

Considerar el anlisis para i++i G=<{E},{-,+,i} {E-E |i |E+E}, E> E E E EE E i EiE + E + E E i + E E E i++i

E E i -

E BUCLE E + E

Ei

43

Anlisis top-down, vuelta atrs lenta


Conclusiones

Como el alumno habr observado, la presencia en la gramtica de reglas recursivas por la izquierda hace que este tipo de anlisis encuentre bucles infinitos de los que no puede salir. Hay maneras de solucionar este problema (entre otros) y construir analizadores sintcticos descendentes. Este tipo de analizadores suele llamarse LL(k) Uno de los objetivos de este tema es demostrar que se pueden construir fcilmente analizadores de tipo LL(1) (la entrada se lee desde la izquierda left las derivaciones en el rbol se hacen de izquierda left a derecha y se necesita conocer slo 1 smbolo de la entrada por anticipado) si la gramtica se puede expresar en forma adecuada

44

22

8.3

Anlisis descendente determinista: LL(1) (sin vuelta atrs)

45

Anlisis top-down selectivo


Concepto

Tambin se llama sin vuelta atrs, en oposicin a la tcnica descrita al principio del tema. Tambin se llama descenso recursivo por la tcnica de paso automtico de la gramtica LL(1) al analizador. Intuitivamente, la razn de su eficiencia reside en que las partes derechas de cada no terminal pueden considerarse indexadas por el siguiente terminal. De hecho con LL(1) se puede construir una tabla de doble entrada (no terminales / terminales ) en la que, cada celda, est ocupada solamente por una regla que es la nica opcin que se puede aplicar cuando en el rbol sintctico corresponda tratar el no terminal y en el recorrido del programa toque tratar el terminal.

46

23

8.3.1

Gramtica LL(1) mediante la construccin de la tabla de anlisis descendente

47

Anlisis LL(1) con tabla de anlisis


Algoritmo de clculo

Describiremos ahora el algoritmo de clculo de la tabla de anlisis TM|N||T|+1 (matriz con una filas para los no terminales y columnas para los terminales aadiendo el delimitador $):

1.

Se aplica los siguientes pasos AP realizar el proceso 1. aprimero()T A T[A,a]. 2. Si primero() Entonces bsiguiente(A) A T[A,b] (obsrvese que b puede ser tambin $)

48

24

Anlisis LL(1) con tabla de anlisis


Ejemplos

En la gramtica de los ejemplos anteriores primero(E)= {i,(}

G=<{E,E,T,T,F},{-,*,i} { ETE E+TE| TFT T*FT| Fi|(E)}, E>

primero(E)= {+,} primero(T)= {i,(} primero(T)= {*,} primero(F)= {i,(} siguiente(E)= {),$} siguiente(E)={),$} siguiente(T)= {),$,+} siguiente(T)={),$,+} siguiente(F)= {),$,+,*}

49

Anlisis LL(1) con tabla de anlisis


Ejemplos

En la gramtica de los ejemplos anteriores

N E E T T F

T{$} id ETE E+TE TFT T Fid T*FT F(E) TFT T T + * ( ETE E E ) $

50

25

Anlisis LL(1) con tabla de anlisis


Ejemplos

Dada la siguiente gramtica primero(P)= G=< {P,P,E}, {i,t,a,e,b} { P iEtPP | a P eP | E b P> {i,a} primero(P)= {,e} primero(E)= {b} siguiente(P)= {$,e} siguiente(P)={$,e} siguiente(E)= {t}

51

Anlisis LL(1) con tabla de anlisis


Ejemplos

Puede obtenerse la siguiente tabla

T{$} N a P p E Eb Pa p peP b e i PiEtPP P t $

52

26

Anlisis LL(1) con tabla de anlisis


Definicin

Podemos definir las gramticas LL(1) como aqullas que cumplen

Que la tabla de anlisis construida con el algoritmo explicado anteriormente es determinista (todas las casillas tienen, a lo ms, una regla)

Ejemplos

Es fcil deducir que La gramtica del primer ejemplo de tabla es LL(1) La segunda no lo es.

53

8.3.2

Uso de la tabla de anlisis descendente

54

27

Anlisis LL(1) con tabla de anlisis


Algoritmo de anlisis

A partir de la tabla de anlisis puede utilizarse el siguiente algoritmo

AnalisisLL(1)(char * cadena.$) { char * simbolo_actual; pila pila_analisis; simbolo_actual = cadena; push( pila_analisis, $); push( pila_analisis, S ); /* S es el axioma */ while (cima(pila_analisis) != $) { if ( terminal(cima(pila_analisis)) || cima(pila_analisis) == $ ) if ( cima(pila_analisis) == *simbolo_actual ) { pop(pila_analisis); simbolo_actual++; } else salir_error(); else if ( M[cima(pila_analisis), *simbolo_actual] != null) { pop( pila_analisis ); push_cadena(*)( pila_analisis, reverse( parte_derecha(M[cima(pila_analisis), *simbolo_actual]) ) else salir_error(); } } (*) push_cadena(pila, cadena) inserta en la pila una cadena 55

);

Anlisis LL(1) con tabla de anlisis


Ejemplo

N E E T T F

T{$} id ETE E+TE TFT T Fid T*FT F(E) TFT T T + * ( ETE E E ) $

id

id

id

56

28

Anlisis LL(1) con tabla de anlisis


Ejemplo

N E E T T F

T{$} id ETE E+TE TFT T Fid T*FT F(E) TFT T T + * ( ETE E E ) $

id

id

id

57

Anlisis LL(1) con tabla de anlisis


Ejemplo

N E E T T F

T{$} id ETE E+TE TFT T Fid T*FT F(E) TFT T T + * ( ETE E E ) $

id

id

id

58

29

Anlisis LL(1) con tabla de anlisis


Ejemplo

N E E T T F

T{$} id ETE E+TE TFT T Fid T*FT F(E) TFT T T + * ( ETE E E ) $

id

id

id

59

Anlisis LL(1) con tabla de anlisis


Ejemplo

N E E T T F

T{$} id ETE E+TE TFT T Fid T*FT F(E) TFT T T + * ( ETE E E ) $

id

id

id

60

30

Anlisis LL(1) con tabla de anlisis


Ejemplo

N E E T T F

T{$} id ETE E+TE TFT T Fid T*FT F(E) TFT T T + * ( ETE E E ) $

id

id

id

61

Anlisis LL(1) con tabla de anlisis


Ejemplo

N E E T T F

T{$} id ETE E+TE TFT T Fid T*FT F(E) TFT T T + * ( ETE E E ) $

id

id

id

62

31

Anlisis LL(1) con tabla de anlisis


Ejemplo

N E E T T F

T{$} id ETE E+TE TFT T Fid T*FT F(E) TFT T T + * ( ETE E E ) $

id

id

id

63

Anlisis LL(1) con tabla de anlisis


Ejemplo

N E E T T F

T{$} id ETE E+TE TFT T Fid T*FT F(E) TFT T T + * ( ETE E E ) $

id

id

id

id

64

32

Anlisis LL(1) con tabla de anlisis


Ejemplo

N E E T T F

T{$} id ETE E+TE TFT T Fid T*FT F(E) TFT T T + * ( ETE E E ) $

id

id

id

65

Anlisis LL(1) con tabla de anlisis


Ejemplo

N E E T T F

T{$} id ETE E+TE TFT T Fid T*FT F(E) TFT T T + * ( ETE E E ) $

id

id

id

66

33

Anlisis LL(1) con tabla de anlisis


Ejemplo

N E E T T F

T{$} id ETE E+TE TFT T Fid T*FT F(E) TFT T T + * ( ETE E E ) $

id

id

id

67

Anlisis LL(1) con tabla de anlisis


Ejemplo

N E E T T F

T{$} id ETE E+TE TFT T Fid T*FT F(E) TFT T T + * ( ETE E E ) $

id

id

id

68

34

Anlisis LL(1) con tabla de anlisis


Ejemplo

N E E T T F

T{$} id ETE E+TE TFT T Fid T*FT F(E) TFT T T + * ( ETE E E ) $

id

id

id

69

Anlisis LL(1) con tabla de anlisis


Ejemplo

N E E T T F

T{$} id ETE E+TE TFT T Fid T*FT F(E) TFT T T + * ( ETE E E ) $

id

id

id

70

35

Anlisis LL(1) con tabla de anlisis


Ejemplo

N E E T T F

T{$} id ETE E+TE TFT T Fid T*FT F(E) TFT T T + * ( ETE E E ) $

id

id

id

71

Anlisis LL(1) con tabla de anlisis


Ejemplo

N E E T T F

T{$} id ETE E+TE TFT T Fid T*FT F(E) TFT T T + * ( ETE E E ) $

id

id

id

id

72

36

Anlisis LL(1) con tabla de anlisis


Ejemplo

N E E T T F

T{$} id ETE E+TE TFT T Fid T*FT F(E) TFT T T + * ( ETE E E ) $

id

id

id

73

Anlisis LL(1) con tabla de anlisis


Ejemplo

N E E T T F

T{$} id ETE E+TE TFT T Fid T*FT F(E) TFT T T + * ( ETE E E ) $

id

id

id

74

37

Anlisis LL(1) con tabla de anlisis


Ejemplo

N E E T T F

T{$} id ETE E+TE TFT T Fid T*FT F(E) TFT T T + * ( ETE E E ) $

id

id

id

75

Anlisis LL(1) con tabla de anlisis


Ejemplo

N E E T T F

T{$} id ETE E+TE TFT T Fid T*FT F(E) TFT T T + * ( ETE E E ) $

id

id

id

76

38

Anlisis LL(1) con tabla de anlisis


Ejemplo

N E E T T F

T{$} id ETE E+TE TFT T Fid T*FT F(E) TFT T T + * ( ETE E E ) $

id

id

id

77

Anlisis LL(1) con tabla de anlisis


Ejemplo

N E E T T F

T{$} id ETE E+TE TFT T Fid T*FT F(E) TFT T T + * ( ETE E E ) $

id

id

id

id

78

39

Anlisis LL(1) con tabla de anlisis


Ejemplo

N E E T T F

T{$} id ETE E+TE TFT T Fid T*FT F(E) TFT T T + * ( ETE E E ) $

id

id

id

79

Anlisis LL(1) con tabla de anlisis


Ejemplo

N E E T T F

T{$} id ETE E+TE TFT T Fid T*FT F(E) TFT T T + * ( ETE E E ) $

id

id

id

80

40

Anlisis LL(1) con tabla de anlisis


Ejemplo

N E E T T F

T{$} id ETE E+TE TFT T Fid T*FT F(E) TFT T T + * ( ETE E E ) $

id

id

id

81

Anlisis LL(1) con tabla de anlisis


Ejemplo

Cadena aceptada
N E E T T F Fid TFT T T*FT F(E) T{$} id ETE E+TE TFT T T + * ( ETE E E ) $

id

id

id

82

41

Anlisis LL(1) con tabla de anlisis


Ejemplo

N E E T T F

T{$} id ETE E+TE TFT T Fid T*FT F(E) TFT T T + * ( ETE E E ) $

id

83

Anlisis LL(1) con tabla de anlisis


Ejemplo

salir_error(): cadena rechazada


N E E T T F Fid TFT T T*FT F(E) T{$} id ETE E+TE TFT T T + * ( ETE E E ) $

id

84

42

Anlisis sintctico
Bibliografa
[Alf] Teora de Autmatas y lenguajes formales M. Alfonseca y otros [Hop] Introduccin a la teora de autmatas, lenguajes y computacin Hopcroft, J.; Motwani, R.; Ullman, J. [Aho] Compiladores. Principios, tcnicas y herramientas A. V. Aho; R. Sefthi; J. D. Ullman

85

43

También podría gustarte