Beruflich Dokumente
Kultur Dokumente
1) Introduccin
2) Un ejemplo intuitivo
3) Definiciones
4) Anlisis SLR
5) Construccin de un analizador SLR
6) Sobre conflictos
7) Anlisis LR Cannico
8) Anlisis LALR
9) Gramticas ambiguas en Yacc
10) Recuperacin de errores sintcticos en el anlisis ascendente
Recordar id+id*id
derivacin a
izda. y dcha.:
la primera izda dcha
siempre E E
deriva el no mi md
terminal ms E + E E + E
a la izda. de
la forma de mi md
frase id + E E + E * E
la segunda el mi md
de ms a id + E * E E + E * id
dcha. mi md
Recordar: id + id * E E + id * id
mi md
id + id * id id + id * id
id+id*id$
id id +id*id$ 5
E E
+id*id$
id
+ E +
id*id$
E
id
id E +
+ *id$ 5
id id
E
E E + E 1
+ *id$
id id
E
E E *id$
E + E
id id
* E * id$
E E + E
id id
id E * $
* 5
E + E id
E
id id
E E $
* * E 2
E E + E id
id id
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 6
1 2 3 4 5
Un ejemplo
E E + E|E * E|( E )|-E|id
pila rbol entrada
E
E $
E * E
E + E id
id id
E
E * E
id
EXITO
EXITO !!
!!
E + E
id id
id id
E E + E *id$ 1
+
E id id
REDUCCIN
E E *id$
prod. aplicada
en la reduccin
E + E
id id
Algunas definiciones:
desplazamiento
Operacin de mover un token de la
entrada a la pila
reduccin
Operacin de sustitucin, en la parte
superior de la pila, de la parte dcha. de una
produccin por su parte izda.
mango (asa/handle)
Parte dcha. de una produccin que
se encuentra en la parte superior de la pila
disparar una
reduccin
gramtica LR
Aqulla para la que un analizador D/R,
operando de izda. a dcha., puede reconocer los mangos
que aparecen en la cima la pila
Alternativamente:
gramtica SLR (LR cannica)(LALR)
Aqulla para la
que es posible construir un analizador sintctico
SLR (LR cannico)(LALR)
Es decir:
sabremos que una gramtica es SLR (LR cannica)(LALR)
si, con las tcnicas que existen,
podemos construir una analizador D/R SLR (LR cannico)(LALR)
Estudiaremos el desarrollo de un analizador sintctico SLR
ms sencillo de comprender
tcnicas para los dems anlogas
prefijo viable
Prefijos de partes dcha. de
producciones que pueden aparecer en la cima de la pila
Notar que:
contenido de la pila
+ = forma de frase md
resto de la entrada
Cuestiones fundamentales:
Cmo reconocer cundo un mango se encuentra en la pila?
Cuntos smbolos de la pila forman el mango?
Si hay varias posibilidades, qu produccin usar en la reduccin?
Opciones:
a lo bestia: IMPRACTICABLE
refinadamente: mediante un autmata
complejo de obtener
fcil de usar
elemento (configuracin/item)
Una produccin con
un punto en alguna posicin de su parte derecha
.. E (.id) id E (id.) ..
... ...
S E
E E + E|E * E|(E)|-E|id
S E.
S .E
E .E+T E + E E+.T
E .T T .(E)
T .(E) T .id 5
T .id 0
(
E T. T (E). +
T 2 8
T
)
T (.E) E
E .E+T T (E.)
(
E .T E E.+T
T .(E) 6
T .id (
3
id
id id
T id.
4
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 19
Anlisis SLR
(id++id)
Ejemplo:
S E
E E+T
E T {
...
T (E) E E+.T
T id suc(I,+)= T .(E)
T .id
I={..,EE.+T,..} ...
}
A X A
.X X.
A
B .
.B
accin[sc,ns]
1) desplazar s, donde s es un
estado del AFD
2) reducir por A
3) aceptar
4) ERROR
un estado un smbolo
gramatical
ir_a[s,X]
un estado
La funcin de transicin
en el autmata que reconoce
los prefijos viables!
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 30
Construccin de un analizador SLR
(s0X1s1... Xmsm,aiai+1...an$)
pila del AS resto de la
entrada
s0 corresponde a I0
(s0X1s1... Xmsm,aiai+1...an$)
(s0X1s1... Xmsmais,ai+1...an$)
2) Si accin[sm, ai]=reducir A
accin de reduccin, pasando a la siguiente configuracin del AS
(s0X1s1... Xmsm,aiai+1...an$)
3) Si accin[sm, ai]=aceptar
AS terminado con xito: la entrada es sintcticamente correcta para la
gramtica considerada
4) Si accin[sm, ai]=ERROR
no es posible terminar el AS
invocar a rutinas de tratamiento de errores
Normalmente:
la pila no almacena los smbolo Xi
aqu los ponemos por motivos de claridad
Veamos el algoritmo de anlisis SLR a partir de accin[] e
ir_a[]
Importante:
si en la ejecucin del algoritmo se llega a alguna contradiccin
el mtodo no es aplicable para la gramtica considerada
no es una gramtica SLR
si la ejecucin genera una tabla
se trata de una gramtica SLR
Las tablas anteriores establecen el mtodo SLR
Qu significa contradiccin?
Ordenes contradictorias
Veamos algunos ejemplos
S L.= R
S S R
R L.
S L = R L =
| R S.S
S .L = R S L=.R
L * R S .R
id R .L
| id L .* R L .*R
L id.
L .id
R L L .id
id * R
R .L id L
* L *.R S L=R.
R .L
L*R. L .*R
R L .id L
RL.
*
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 44
Construccin de un analizador SLR
conflicto
reduccin/desplazamiento
(shift/reduce)
A X1...Xi.Xi+1...Xn,a
donde
1) A X1...XiXi+1...Xn es una produccin
2) a Vt {$}
A X1...Xi.Xi+1...Xn,a
si , a no genera ningn efecto
S .S,{$}
como S puede ser un no terminal, es necesaria una operacin de clausura
Idea subyacente
Anloga a la vista para la clausura
LR(0), slo que teniendo en cuenta el smbolo
de pre-anlisis
S S
Ejemplo: S CC I={S .S,{$}}
C cC
C d
{
S .S, {$}
I*= S .CC, {$}
C .cC, {c,d}
C .d , {c,d}
}
La funcin
Funcin sucesor1(E I:conj config.;E X:smbolo)
sucesor:
dev (SS:conj. config.)
Pre: I es un conj. de configuraciones para una
gramtica ampliada G=(N,T,S,P);XTN
Post: SS contiene los sucesores de I respecto de X
Variables S:conj. config.
Principio
S:=
Para cada A.X,a I
S=S{AX.,a}
FPara
dev(clausura1(S)) Idea subyacente
Fin
Si en un estado tenemos la config.
A.X,a, y viene el smbolo X,
pasamos a cualquier configuracin
deseable/esperable AX.,a
Importante:
si en la ejecucin del algoritmo se llega a alguna contradiccin
el mtodo no es aplicable para la gramtica considerada
no es una gramtica LR(1)
si la ejecucin genera una tabla
se trata de una gramtica LR(1)
Esta tabla junto con la siguiente establecen el mtodo LR(1)
cannico
En el ejemplo anterior:
C d.,{c,d} 4
C d., {$} 7 C d.,{c,d,$}
47
C c.C,{$}
C .cC,{$} 6
C .d, {$} C c.C,{c,d,$}
C .cC,{c,d,$}
C c.C,{c,d} C .d, {c,d,$} 36
C .cC,{c,d}
C .d, {c,d} 3
C cC.,{c,d}
8
C cC.,{c,d,$} 89
C cC.,{$}
9
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 63
Anlisis LALR
S .S, {$} S
S .CC,{$} S S.,{$}
1
C .cC,{c,d} 0
C .d, {c,d}
C S C.C,{$}
C .cC,{$}
C S CC.,{$}
5
C .d, {$} 2
c
d d
C d., {c,d,$}
47
c
d
c C c.C,{c,d,$} C
C cC.,{c,d,$}
C .cC,{c,d,$} 89
C .d, {c,d,$} 36
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 64
state 0 state 3
Anlisis LALR $accept : _S $end C : c_C
S goto 1 C goto 6
C goto 2 state 4
state 1 C : d_ (3)
$accept : S_$end
. reduce 3
yacc -v lG.y $end accept state 5
. error S : C C_ (1)
state 2
S : C_C . reduce 1
S : CC ;
C : c C ; c shift 3 state 6
C : d ; d shift 4 C : c C_ (2)
. error
C goto 5 . reduce 2
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 65
Anlisis
bison LALR
-r itemset lG.y state 3
state 0 0 $accept: S . $end
0 $accept: . S $end $end shift, and go to state 6
1 S: . C C
2 C: . c C state 4
3 | . d 1 S: C . C
c shift, and go to state 1 2 C: . c C
d shift, and go to state 2 3 | . d
S go to state 3 c shift, and go to state 1
C go to state 4 d shift, and go to state 2
C go to state 7
state 1
2 C: . c C state 5
2 | c . C 2 C: c C .
3 | . d $default reduce using rule 2 (C)
c shift, and go to state 1
d shift, and go to state 2 state 6
C go to state 5 0 $accept: S $end .
$default accept
state 2
3 C: d . state 7
$default reduce using rule 3 (C) 1 S: C C .
$default reduce using rule 1 (S)
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 66
Anlisis LALR
LL(1) LALR(1)?
simplicidad:
ambos mtodos son simples, pero LL(1) es ms intuitivo
es ms fcil escribir una gramtica que sea LALR(1)
la mayora de las construcciones habituales son LL(1)
generalidad: la mayora de las gramticas LL(1) son LALR(1)
tratamiento de smbolos de accin (para el tratamiento semntico):
LL(1) permite ponerlos en cualquier parte de las reglas
LALR(1) slo al final
hay apaos (pero pueden generar conflictos)
recuperacin de errores:
LL(1) tiene en la pila lo que deseamos encontrar
LALR(1) contiene lo que hemos encontrado
|LALR(1)| = 2*|LL(1)|
En conclusin:
LL(1) parece tener ms ventajas, si la gramtica se puede hacer fcilmente
LL(1)
hay que manejar bien las dos tcnicas
LL(1) es una mejor primera aproximacin
todo depende de la disponibilidad de buenas herramientas
En cuanto a la potencia de los mtodos:
LR(0) < SLR(1) < LALR(1) < LR(1)
LL(1) < LR(1)
1) E' --> E
2) E --> E + E
3) E --> E * E
4) E --> id
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 72
Recuperacin de errores sintcticos en el anlisis ascendente.
El caso de Yacc
Yacc implementa un mtodo propio de recuperacin de errores mediante
la adicin de "producciones de error
producciones especiales que incorporan el terminal ficticio "error
Ejemplo: un error comn en Pascal es dejarse el ; que sigue al
identificador del programa
programa:
tkPROGRAM tkID ';' parteDecs bloqueInst '.' ;