Upload
raidenz
View
66
Download
2
Embed Size (px)
Citation preview
1Compiladores e Intrpretes
3er curso2 cuatrimestre
Tema 8. Anlisis sintctico descendente
8.1 Introduccin8.2 Anlisis descendente no determinista: backtracking8.3 Anlisis descendente determinista: LL(1)
8.3.1 Gramticas LL(1) 8.3.2 Uso de la tabla de anlisis
23
8.1
Introduccin
4
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 descendenteIntroduccin (I)
35
Anlisis sintctico descendente
Veamos un ejemplo de anlisis descendente:
+ *
E
E
E E-> E+E
Introduccin (II)
id id id
Gramtica: E -> E + E E -> E * E E -> -E E -> (E) E -> id
6
Anlisis sintctico descendente
+ *
E
E
E E-> id
Introduccin (III)
id id id
Gramtica: E -> E + E E -> E * E E -> -E E -> (E) E -> id
47
Anlisis sintctico descendente
+ *
E E
E
E
E E-> E*E
Introduccin (IV)
id id id
Gramtica: E -> E + E E -> E * E E -> -E E -> (E) E -> id
8
Anlisis sintctico descendente
+ *
E E
E
E
E E-> id
Introduccin (V)
id id id
Gramtica: E -> E + E E -> E * E E -> -E E -> (E) E -> id
59
Anlisis sintctico descendente
+ *
E E
E
E
E E-> id
Introduccin (VI)
id id id
Gramtica: E -> E + E E -> E * E E -> -E E -> (E) E -> id
10
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).
Anlisis sintctico descendenteIntroduccin (VII)
611
8.2
Anlisis descendente conbacktracking (o con vuelta a atrs)
12
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.
Anlisis sintctico descendenteTop-down con vuelta atrs lenta: conceptos
713
1. Smbolo actual = axioma2. Encontrar las reglas que expanden el smbolo actual.3. Si slo hay una regla, aplicarla.4. Si hay varias reglas, aplicar la primera y mantener las otras en reserva.5. Por cada smbolo de la parte derecha de la regla, repetir desde el paso 2.6. 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.
Anlisis sintctico descendenteTop-down con vuelta atrs lenta: algoritmo
14
i+--i
Anlisis top-down, vuelta atrs lenta
G=
E E
- E+
E
iEE
- E
E
- E
Ejemplos previos
815
i+--i
Anlisis top-down, vuelta atrs lenta
G=
E E
- E+
E
iEE
- E
E
i
Ejemplos previos
16
i+--i
Anlisis top-down, vuelta atrs lenta
G=
E E
- E+
E
iEE
- E
E
i
Ejemplos previos
917
i+--i
Anlisis top-down, vuelta atrs lenta
G=
E E
- E+
E
iE
- E
E
i- E
E
Ejemplos previos
18
i+--i
Anlisis top-down, vuelta atrs lenta
G=
E E
- E+
E
iE
- E
E
i- E
E
Ejemplos previos
10
19
i+--i
Anlisis top-down, vuelta atrs lenta
G=
E E
- E+
E
iE
- E
E
i- E
E
- E
Ejemplos previos
20
i+--i
Anlisis top-down, vuelta atrs lenta
G=
E E
- E+
E
iE
- E
E
i- E
E
- E
- E
Ejemplos previos
11
21
i+--i
Anlisis top-down, vuelta atrs lenta
G=
E E
- E+
E
iE
- E
E
i- E
E
- E
- E
E
- E
Ejemplos previos
22
i+--i
Anlisis top-down, vuelta atrs lenta
G=
E E
- E+
E
iE
- E
E
i- E
E
- E E
- Ei
Ejemplos previos
12
23
i+--i
Anlisis top-down, vuelta atrs lenta
G=
E E
- E+
E
iE
- E
E
i- E
E
- E E
- Ei
ACEPTADA
Ejemplos previos
24
i++i
Anlisis top-down, vuelta atrs lenta
Considerar el anlisis para i++i
G=
E
Ejemplos previos
13
25
i++i
Anlisis top-down, vuelta atrs lenta
Considerar el anlisis para i++i
G=
E
Ejemplos previos
- E
26
i++i
Anlisis top-down, vuelta atrs lenta
Considerar el anlisis para i++i
G=
E
Ejemplos previos
- E
E
- E
14
27
i++i
Anlisis top-down, vuelta atrs lenta
Considerar el anlisis para i++i
G=
E
Ejemplos previos
E
- Ei
28
Anlisis top-down, vuelta atrs lenta
Considerar el anlisis para i++i
G=
E
Ejemplos previos
i
E
- E
E
i
i++i
15
29
Anlisis top-down, vuelta atrs lenta
Considerar el anlisis para i++i
G=
E
Ejemplos previos
E
- E
E
i
i++i
+E E
30
Anlisis top-down, vuelta atrs lenta
Considerar el anlisis para i++i
G=
E
Ejemplos previos
E
- E
E
i
i++i
+E E
- E
16
31
Anlisis top-down, vuelta atrs lenta
Considerar el anlisis para i++i
G=
E
Ejemplos previos
E
- E
E
i
i++i
+E E
- E
E
- E
32
Anlisis top-down, vuelta atrs lenta
Considerar el anlisis para i++i
G=
E
Ejemplos previos
E
- E
E
i
i++i
+E EE
- E i
17
33
Anlisis top-down, vuelta atrs lenta
Considerar el anlisis para i++i
G=
E
Ejemplos previos
E
- E
E
i
i++i
+E EE
- E i
34
Anlisis top-down, vuelta atrs lenta
Considerar el anlisis para i++i
G=
E
Ejemplos previos
E
- E
E
i
i++i
+E EE
- E i- E
E
- E
18
35
Anlisis top-down, vuelta atrs lenta
Considerar el anlisis para i++i
G=
E
Ejemplos previos
E
- E
E
i
i++i
+E EE
- E i i
E
- E
36
Anlisis top-down, vuelta atrs lenta
Considerar el anlisis para i++i
G=
E
Ejemplos previos
E
- E
E
i
i++i
+E EE
- E i i
E
- E
E
i
19
37
Anlisis top-down, vuelta atrs lenta
Considerar el anlisis para i++i
G=
E
Ejemplos previos
E
- E
E
i
i++i
+E EE
- E i
E
- E
E
i+E E
38
Anlisis top-down, vuelta atrs lenta
Considerar el anlisis para i++i
G=
E
Ejemplos previos
E
- E
E
i
i++i
+E EE
- E i
E
- E
E
i+E E
- E
20
39
Anlisis top-down, vuelta atrs lenta
Considerar el anlisis para i++i
G=
E
Ejemplos previos
E
- E
E
i
i++i
+E EE
- E i
E
- E
E
i+E E
- E
E
- E
40
Anlisis top-down, vuelta atrs lenta
Considerar el anlisis para i++i
G=
E
Ejemplos previos
E
- E
E
i
i++i
+E EE
- E i
E
- E
E
i+E E
i
E
- E
21
41
Anlisis top-down, vuelta atrs lenta
Considerar el anlisis para i++i
G=
E
Ejemplos previos
E
- E
E
i
i++i
+E EE
- E i
E
- E
E
i+E E
i
E
- E
E
i
42
Anlisis top-down, vuelta atrs lenta
Considerar el anlisis para i++i
G=
E
Ejemplos previos
E
- E
E
i
i++i
+E EE
- E i
E
- E
E
i+E EE
- E
E
i +E E
22
43
Anlisis top-down, vuelta atrs lenta
Considerar el anlisis para i++i
G=
E
Ejemplos previos
E
- E
E
i
i++i
+E EE
- E i
E
- E
E
i+E EE
- E
E
i +E E
E
+E E
E
- E
E
i
BUCLE
44
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
Anlisis top-down, vuelta atrs lentaConclusiones
23
45
8.3
Anlisis descendente determinista:LL(1) (sin vuelta atrs)
46
Anlisis top-down selectivoConcepto
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.
24
47
8.3.1
Gramtica LL(1) mediante la construccinde la tabla de anlisis descendente
48
Anlisis LL(1) con tabla de anlisisAlgoritmo 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 $):
Se aplica los siguientes pasos1. 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 $)
25
49
Anlisis LL(1) con tabla de anlisisEjemplos
En la gramtica de los ejemplos anteriores
G=
primero(E)= {i,(}primero(E)= {+,}primero(T)= {i,(}primero(T)= {*,}primero(F)= {i,(}siguiente(E)= {),$}siguiente(E)={),$}siguiente(T)= {),$,+}siguiente(T)={),$,+}siguiente(F)= {),$,+,*}
50
Anlisis LL(1) con tabla de anlisisEjemplos
En la gramtica de los ejemplos anteriores
F(E)FidFTTT*FTTT
TFTTFTT
EEE+TEEETEETEE
$)(*+idT{$}N
26
51
Anlisis LL(1) con tabla de anlisisEjemplos
Dada la siguiente gramtica
G=< {P,P,E},{i,t,a,e,b}{ P iEtPP | a
P eP | E b
P>
primero(P)= {i,a}primero(P)= {,e}primero(E)= {b}siguiente(P)= {$,e}siguiente(P)={$,e}siguiente(E)= {t}
52
Anlisis LL(1) con tabla de anlisisEjemplos
Puede obtenerse la siguiente tabla
EbE
PppeP
p
PiEtPPPaP
$tieba
T{$}N
27
53
Anlisis LL(1) con tabla de anlisisDefinicin
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.
54
8.3.2
Uso de la tabla de anlisis descendente
28
55
Anlisis LL(1) con tabla de anlisisAlgoritmo 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();
elseif ( 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
56
Anlisis LL(1) con tabla de anlisis
$id*id+id
$E
F(E)FidFTTT*FTTT
TFTTFTT
EEE+TEEETEETEE
$)(*+idT{$}N
Ejemplo
29
57
Anlisis LL(1) con tabla de anlisis
$id*id+id
$E
F(E)FidFTTT*FTTT
TFTTFTT
EEE+TEEETEETEE
$)(*+idT{$}N
Ejemplo
58
Anlisis LL(1) con tabla de anlisis
$id*id+id
$
F(E)FidFTTT*FTTT
TFTTFTT
EEE+TEEETEETEE
$)(*+idT{$}N
Ejemplo
30
59
Anlisis LL(1) con tabla de anlisis
$id*id+id
$ET
F(E)FidFTTT*FTTT
TFTTFTT
EEE+TEEETEETEE
$)(*+idT{$}N
Ejemplo
60
Anlisis LL(1) con tabla de anlisis
$id*id+id
$ET
F(E)FidFTTT*FTTT
TFTTFTT
EEE+TEEETEETEE
$)(*+idT{$}N
Ejemplo
31
61
Anlisis LL(1) con tabla de anlisis
$id*id+id
$E
F(E)FidFTTT*FTTT
TFTTFTT
EEE+TEEETEETEE
$)(*+idT{$}N
Ejemplo
62
Anlisis LL(1) con tabla de anlisis
$id*id+id
$ETF
F(E)FidFTTT*FTTT
TFTTFTT
EEE+TEEETEETEE
$)(*+idT{$}N
Ejemplo
32
63
Anlisis LL(1) con tabla de anlisis
$id*id+id
$ET
F(E)FidFTTT*FTTT
TFTTFTT
EEE+TEEETEETEE
$)(*+idT{$}N
Ejemplo
64
Anlisis LL(1) con tabla de anlisis
$id*id+id
$ETid
F(E)FidFTTT*FTTT
TFTTFTT
EEE+TEEETEETEE
$)(*+idT{$}N
Ejemplo
33
65
Anlisis LL(1) con tabla de anlisis
$id*id+id
$ET
F(E)FidFTTT*FTTT
TFTTFTT
EEE+TEEETEETEE
$)(*+idT{$}N
Ejemplo
66
Anlisis LL(1) con tabla de anlisis
$id*id+id
$E
F(E)FidFTTT*FTTT
TFTTFTT
EEE+TEEETEETEE
$)(*+idT{$}N
Ejemplo
34
67
Anlisis LL(1) con tabla de anlisis
$id*id+id
$ET+
F(E)FidFTTT*FTTT
TFTTFTT
EEE+TEEETEETEE
$)(*+idT{$}N
Ejemplo
68
Anlisis LL(1) con tabla de anlisis
$id*id+id
$ET
F(E)FidFTTT*FTTT
TFTTFTT
EEE+TEEETEETEE
$)(*+idT{$}N
Ejemplo
35
69
Anlisis LL(1) con tabla de anlisis
$id*id+id
$E
F(E)FidFTTT*FTTT
TFTTFTT
EEE+TEEETEETEE
$)(*+idT{$}N
Ejemplo
70
Anlisis LL(1) con tabla de anlisis
$id*id+id
$ETF
F(E)FidFTTT*FTTT
TFTTFTT
EEE+TEEETEETEE
$)(*+idT{$}N
Ejemplo
36
71
Anlisis LL(1) con tabla de anlisis
$id*id+id
$ET
F(E)FidFTTT*FTTT
TFTTFTT
EEE+TEEETEETEE
$)(*+idT{$}N
Ejemplo
72
Anlisis LL(1) con tabla de anlisis
$id*id+id
$ETid
F(E)FidFTTT*FTTT
TFTTFTT
EEE+TEEETEETEE
$)(*+idT{$}N
Ejemplo
37
73
Anlisis LL(1) con tabla de anlisis
$id*id+id
$ET
F(E)FidFTTT*FTTT
TFTTFTT
EEE+TEEETEETEE
$)(*+idT{$}N
Ejemplo
74
Anlisis LL(1) con tabla de anlisis
$id*id+id
$E
F(E)FidFTTT*FTTT
TFTTFTT
EEE+TEEETEETEE
$)(*+idT{$}N
Ejemplo
38
75
Anlisis LL(1) con tabla de anlisis
$id*id+id
$ETF*
F(E)FidFTTT*FTTT
TFTTFTT
EEE+TEEETEETEE
$)(*+idT{$}N
Ejemplo
76
Anlisis LL(1) con tabla de anlisis
$id*id+id
$ETF
F(E)FidFTTT*FTTT
TFTTFTT
EEE+TEEETEETEE
$)(*+idT{$}N
Ejemplo
39
77
Anlisis LL(1) con tabla de anlisis
$id*id+id
$ET
F(E)FidFTTT*FTTT
TFTTFTT
EEE+TEEETEETEE
$)(*+idT{$}N
Ejemplo
78
Anlisis LL(1) con tabla de anlisis
$id*id+id
$ETid
F(E)FidFTTT*FTTT
TFTTFTT
EEE+TEEETEETEE
$)(*+idT{$}N
Ejemplo
40
79
Anlisis LL(1) con tabla de anlisis
$id*id+id
$ET
F(E)FidFTTT*FTTT
TFTTFTT
EEE+TEEETEETEE
$)(*+idT{$}N
Ejemplo
80
Anlisis LL(1) con tabla de anlisis
$id*id+id
$E
F(E)FidFTTT*FTTT
TFTTFTT
EEE+TEEETEETEE
$)(*+idT{$}N
Ejemplo
41
81
Anlisis LL(1) con tabla de anlisis
$id*id+id
$
F(E)FidFTTT*FTTT
TFTTFTT
EEE+TEEETEETEE
$)(*+idT{$}N
Ejemplo
82
Anlisis LL(1) con tabla de anlisis
$id*id+id
$
F(E)FidFTTT*FTTT
TFTTFTT
EEE+TEEETEETEE
$)(*+idT{$}N
Cadena aceptada
Ejemplo
42
83
Anlisis LL(1) con tabla de anlisis
$id+
$E
F(E)FidFTTT*FTTT
TFTTFTT
EEE+TEEETEETEE
$)(*+idT{$}N
Ejemplo
84
Anlisis LL(1) con tabla de anlisis
$id+
$E
F(E)FidFTTT*FTTT
TFTTFTT
EEE+TEEETEETEE
$)(*+idT{$}N
salir_error(): cadena rechazadaEjemplo
43
85
Anlisis sintctico
[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
Bibliografa