Sei sulla pagina 1di 78

Leccin 5: Anlisis Sintctico LR

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

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 1


Introduccin

Hemos visto algunas restricciones del AS descendente (top-


down)
problemas con recursividad a izda.
no siempre son resolubles
Una segunda forma de anlisis
ascendente (bottom-up)

Trata de construir el rbol de las hojas hacia la raz


Que coincide con encontrar una derivacin por la derecha
Tcnica: desplazamiento-reduccin

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 2


Introduccin E E + E|E * E|(E)|-E|id

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

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 3


Introduccin

Cmo hacer derivacin MD cuando los tokens llegan de izda. a


dcha.?
Idea bsica: en cuanto hayan entrado suficientes
tokens para detectar una parte dcha.,
sustiturlos por su parte izda.

Adecuado para ello: una pila


Ejemplo: construir con ayuda de una pila el rbol sintctico
anterior

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 4


1 2 3 4 5
Un ejemplo
E E + E|E * E|( E )|-E|id
pila rbol entrada

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

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 5


1 2 3 4 5
Un ejemplo
E E + E|E * E|( E )|-E|id
pila rbol entrada

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

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 7


Definiciones

Objetivo: encontrar en la cima de la pila una parte


derecha de produccin y sustiturla por su
parte izquierda

pila rbol entrada


Dos
operaciones E E *id$
fundamen-
E + E
tales:
id id
DESPLAZAMIENTO
* E * id$
E
E + E

id id

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 8


Definiciones
pila rbol entrada

E E + E *id$ 1
+
E id id
REDUCCIN
E E *id$
prod. aplicada
en la reduccin
E + E

id id

DESPLAZAMIENTO y REDUCCION (D/R)


Analizadores por
SHIFT-REDUCE parsers (S/R)

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 9


Definiciones

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

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 10


Definiciones

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

Por lo tanto, una gramtica ser LR dependiendo de nuestra


astucia para construir analizadores D/R
analizador SLR
Tres tcnicas diferentes de construccin: analizador LR cannico
diferente complejidad de desarrollo analizador LALR
diferente tamao del analizador
diferente potencia

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 11


Definiciones

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

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 12


Definiciones

prefijo viable
Prefijos de partes dcha. de
producciones que pueden aparecer en la cima de la pila

Expresin analizada parcialmente

No debe sobrepasar por la derecha el mango

No toda parte derecha es un mango:precedencia,


asociatividad,..

Notar que:
contenido de la pila

+ = forma de frase md
resto de la entrada

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 13


Anlisis SLR

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

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 14


Anlisis SLR

Presentamos un mtodo que permite realizar el anlisis sintctico


por desplazamiento/reduccin
Bsicamente:
un autmata tal que cada estado guarda la informacin de los posibles
prefijos recorridos hasta llegar a l
una pila de estados (guarda el prefijo recorrido)
a partir de los estados en la pila y del token de entrada se determinan las
acciones a ejecutar (SLR(1))
Pero: cmo almacenar en un estado del autmata todos los
smbolos gramaticales ya reconocidos pero an no reducidos?
Solucin:
Conjuntos de elementos
(items/configuraciones)

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 15


Anlisis SLR del anlisis sintctico LR(0)

elemento (configuracin/item)
Una produccin con
un punto en alguna posicin de su parte derecha

Ejemplo: E (id) puede E .(id)


generar las configuraciones E (.id)
E (id.)
E (id).

Qu representa E (.id)? F aX.Ybc?


que en algn momento, durante el anlisis
sintctico, hemos llegado a un ( aX
estado en el que hemos reconocido ya
y estamos esperando (deseando?) reconocer
id) Ybc
para poder aplicar una reduccin

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 16


Anlisis SLR

As, si tenemos la suerte de que reconocemos id podremos


cambiar de estado:

.. E (.id) id E (id.) ..
... ...

Cmo detectar el fin?


se ampla la gramtica con un no terminal especial: s
y una produccin especial E E + E|E * E|(E)|-E|id

S E
E E + E|E * E|(E)|-E|id

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 17


Anlisis SLR

As, el reconocimiento habr funcionado cuando se llegue a un


estado que contenga la configuracin

S E.

Vamos a ver un pequeo ejemplo de cmo funciona un


reconocedor a partir del autmata
Ya veremos cmo construir dicho autmata
S E
E E+T
E E+T
E T
E T
T (E)
T (E)
T id
T id

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 18


S E.
E E+T.
Anlisis E E.+T 1 7
SLR T

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

Pasear por el autmata anterior para reconocer


(id+id)
(id+(id+id))

(id++id)

La cuestin es cmo obtener el autmata anterior


Basado en las funciones:
clausura (de un conj. de configuraciones)
sucessor (de un conj. de configuraciones)

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 20


Construccin de un analizador SLR

Funcin clausura(E I:conj config.) dev (I*:conj. config.)


Pre: I es un conj. de configuraciones pa-
ra una gramtica ampliada
G=(N,T,S,P)
Post: I* contiene la clausura LR(0) de I
Principio
I*:=I
Repetir
Para cada A.B I*
Para cada BP
Si B. I*
entonces I*=I*{B. }
FSi
FPara
FPara
Hasta Que no se aada nada a I*
dev(I*)
Fin

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 21


Construccin de un analizador SLR

Idea subyacente: Si en un estado tenemos la config. A.B,


quiere decir que esperamos cualquier derivacin de B, por lo
que tambin nos veremos contentos con cualquier derivacin
de B
Ejemplo:
S E
E E+T
E T
{
T (E) S .E
T id I*= E .E+T
E .T
I={S .E} T .(E)
T .id
}

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 22


Construccin de un analizador SLR

Funcin sucesor(E I:conj config.;E X:smbolo)


dev (SS:conj. config.)
Pre: I es un conj. de configuraciones para una
gramtica ampliada G=(N,T,S,P)
XTN
Post: S contiene los sucesores de I
respecto del smbolo X
Variables S:conj. config.
Principio
S:=
Para cada (A.X) I
S=S{AX.} Idea subyacente: Si en un estado
FPara tenemos la config. A.X, y
dev(clausura(S)) viene el smbolo X, pasamos a
Fin cualquier configuracin
deseable/esperable de AX.

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 23


Construccin de un analizador SLR

Ejemplo:
S E
E E+T
E T {
...
T (E) E E+.T
T id suc(I,+)= T .(E)
T .id
I={..,EE.+T,..} ...
}

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 24


Construccin de un analizador SLR

Ahora, agrupamos los conjuntos de configuraciones que


representan estados del AFD que reconoce prefijos viables
Construimos el conjunto C:
cada elemento de C es un conjunto de configuraciones
coleccin
coleccin cannica
cannica de
de conjuntos
conjuntos
de configuraciones LR(0)
de configuraciones LR(0)
simb. inicial original
Proceso:
aadir a C el conjunto clausura({S .S })
simb. inicial amplado
aadir, para cada I de C y para cada smbolo X, los sucesores
correspondientes
Resultado: nodos del autmata

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 25


Construccin de un analizador SLR
Funcin conjLR_0(E G:gramtica) dev
Clculo de la (C:conj. conj. config.)
coleccin de Pre: G=(N,T,S,P)es una gramtica
ampliada
cannica de Post: C es la coleccin cannica de
conjuntos de configuraciones LR(0) C={I0,...,In}
configuraciones Variables S:conj. config.
LR(0) para una Principio
gramtica C:={clausura({S.S})} /*nodo I0*/
Repetir
Para cada IC
Para cada XNT
Si (suc(I,X)<>)(suc(I,X)C)
entonces C=C suc(I,X)
FSi
FPara
FPara
Hasta que no se aada nada a C
dev(C)
Fin
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 26
Construccin de un analizador SLR S E
E E+T
Ejemplo:
E T
T (E)
S .E T id
E .E+T S E.
E .T E E.+T 1
T .(E) 0
T .id E T. 2
T id.
4
T (.E)
E .E+T E E+.T
E .T E E+T. T .(E)
7 5
3 T .(E) T .id
T .id T (E.) T (E). 8
E E.+T 6
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 27
Construccin de un analizador SLR

Ya podemos construir el AFD


C es el conjunto de nodos
I0= clausura({S .S}) es el estado inicial
La funcin sucesor() establece exactamente los arcos del AFD
Por qu funciona?
tomar un AFN cuyos estados son las distintas configuraciones
transiciones:

A X A
.X X.

A

B .
.B

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 28


Construccin de un analizador SLR

Transformar en AFD mediante la -clausura


aqu se convierte en usar la nueva
clausura para conjuntos
El resultado es el grafo de conjuntos que hemos visto
En lo que sigue nos queda implementar algortmicamente el
mtodo de recorrido del autmata que hemos presentado
Se basa en
una pila para el anlisis sintctico (como vimos al principio)
la tabla del anlisis sintctico
parte 1: tabla accin
parte 2: tabla ir_a
parte de control

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 29


Construccin de un analizador SLR
siguiente smbolo
Sobre la tabla del AS: estado en la cima
tomado de input
de la pila

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

Veamos cmo funciona:


estado del AS (configuracin)

(s0X1s1... Xmsm,aiai+1...an$)
pila del AS resto de la
entrada

s0 corresponde a I0

Donde: paso del estado si-1 al si


si-1Xisi
mediante el smbolo Xi

X1... Xm ai ...an forma de frase


derecha

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 31


Construccin de un analizador SLR

El siguiente movimiento del analizador se establece


en funcin a sm y ai
en funcin a accin[sm, ai]
en funcin a ir_a[?,?]
1) Si accin[sm, ai]=desplazar s
accin de desplazamiento, pasando a la siguiente configuracin del AS

(s0X1s1... Xmsm,aiai+1...an$)

(s0X1s1... Xmsmais,ai+1...an$)

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 32


Construccin de un analizador SLR

2) Si accin[sm, ai]=reducir A
accin de reduccin, pasando a la siguiente configuracin del AS
(s0X1s1... Xmsm,aiai+1...an$)

(s0X1s1... Xm-rsm-rA s,aiai+1...an$)


Donde:
r=|| s=ir_a(sm-r,A)
no se modifica la entrada
n elementos en la pila no aumenta
sustitucin de una derivacin por un no terminal
se ha reducido un rbol por su raz
Normalmente se informa de la produccin aplicada para la reduccin
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 33
Construccin de un analizador SLR

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[]

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 34


Construccin de Algoritmo LR(E accin[]:...; E ir_a[]:...)
un analizador Variables n:simbolo;P:pila
s,s:estado
SLR aceptado,error:booleano
Principio
pilaVacia(P);apilar(P,s0)
<aceptado,error>:=<False,False>
n:=yylex()
obtiene Repetir
smbolo s:=cima(P)
desde Sel
entrada accion[s,n]=desplazar s:
apilar(P,n);apilar(P,s)
n:=yylex()
accion[s,n]=aceptar:
aceptado:=True
accion[s,n]=ERROR:
error:=True
.....
FSel
Hasta que aceptado error
Fin
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 35
Algoritmo LR(E accin[]:...; E ir_a[]:...)
Construccin de Variables n:simbolo;P:pila
un analizador s,s:estado
SLR aceptado,error:booleano
Principio
pilaVacia(P);apilar(P,s0)
<aceptado,error>:=<False,False>
n:=yylex()
Repetir
s:=cima(P)
Sel
....
accion[s,n]=reducir A:
Para i:=1 hasta 2*||
desapilar(P)
FPara
s:=cima(P)
apilar(P,A)
apilar(P,ir_a[s,A])
emitir A
FSel
Hasta que aceptado error
Fin
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 36
1) S E
Construccin de un analizador SLR
2) E E+T
3) E T
4) T (E)
estados accin[] ir_a[] 5) T id
+ ( ) id $ E T
0 d3 d4 1 2
1 d5 acep
2 r3 r3 r3
3 d3 d4 6 2
4 r5 r5 r5
5 d3 d4 7
6 d5 d8
7 r2 r2 r2
8 r4 r4 r4

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 37


Construccin de un Alg constAccion(E G:gramtica) dev
analizador SLR (accion[]:....)
Pre: G=(N,T,S,P)es una gramtica
amplada
Post: accion es parte de la tabla del SLR
Variables I:conj. config.; i:entero
C:conj. conj. config.
Principio
C:=conjLR_0(G) /*C={I0,...,In}*/
Para i:=0 hasta n
Para cada aT
Si A.a Ii suc(Ii,a)=Ij
accion[i,a]:=desplazar j
FSi
FPara
....
FPara
asignar ERROR a entradas vacas
dev(accion)
Fin

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 38


Alg constAccion(E G:gramtica) dev
Construccin de un (accion[]:....)
Pre: G=(N,T,S,P)es una gramtica
analizador SLR amplada
Post: accion es parte de la tabla del SLR
Variables I:conj. config.; i:entero
C:conj. conj. config.
Principio
....
Para cada AN\S
Si A. Ii
Para cada aSIG(A)
accion[i,a]:=reducir A
FPara
FSi
FPara
Si S S. Ii
accion[i,$]:=aceptar
FSi
FPara
asignar ERROR a entradas vacas
dev(accion)
Fin
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 39
Construccin de un Alg constIr_a(E G:gramtica) dev
analizador SLR (ir_a[]:....)
Pre: G=(N,T,S,P)es una gramtica
amplada
C={I0,...,In}= conjLR_0(G)
Post: ir_a es parte de la tabla del SLR
Estado Variables i:entero
inicial del Principio
analizador: Para i:=0 hasta n
el construdo Para cada AN
a partir de Si suc(Ii,A)=Ij
ir_a[i,A]:=j
S.S FSi
FPara
FPara
asignar ERROR a entradas vacas
dev(ir_a)
Fin

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 40


Construccin de un analizador SLR

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

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 41


Ejercicios

Construir el autmata y las tablas del anlisis SLR(1) para las


siguientes gramticas:
S ( L ) S a R S S a
S a S a S a R
L L S R b S a

L S R R a b

Son las siguientes gramticas lID id lID


SLR(1)? En caso afirmativo, el lID id
funcionamiento de ambas durante
en anlisis, y concluir sobre cul de
lID lID id
las dos formas es ms conveniente.
lID id

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 42


Construccin Considrese la siguiente gramtica:
de un ALS ALS AL
analizador ALS AL
SLR AL NUM NS ',' NS '\n'
NS NS N
NS N
Ejercicio Se desea saber si se trata de una gramtica
(examen SLR o no. Para ello, responder a las
Febrero-96) siguientes preguntas.

Ejercicio 4 (2 ptos.): Construir la familia


cannica de conjuntos LR(0)

Ejercicio 5 (1.5 ptos.): Construir el


autmata a partir de dichos conjuntos

Ejercicio 6 (1.5 ptos.): Se trata de una


gramtica SLR o no?

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 43


Construccin de un analizador SLR
SS.
Pero no toda gramtica es SLR SR.
S

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

Si observamos el estado destacado tenemos:


S L . = R
accion[2,=]=desplazar 6
= SIG(R)
accion[2,=]=reducir R L

conflicto
reduccin/desplazamiento
(shift/reduce)

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 45


Sobre conflictos

Ya comentamos que pueden aparecer dos tipos de conflictos


shift/reduce
reduce/reduce
Ambos corresponden a decisiones que ha de tomar el analizador:
shift/reduce: se puede tanto realizar un desplazamiento como una
reduccin
reduce/reduce: el analizador detecta en la cima de la pila partes derechas
de ms de una produccin
Habitualmente, se aplican polticas preestablecidas para su
resolucin:
shift/reduce: realiza el desplazamiento
reduce/reduce: reduce por la produccin que se haya escrito antes
Yacc las hace
Notar que son anlogas a las que haca Lex

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 46


Anlisis LR cannico

Vamos a ver un mtodo alternativo de anlisis bottom-up: LR


cannico
El proceso es parecido al desarrollado para SLR
Se basa en la nocin de elemento (configuracin) para el anlisis
LR(1)
Es de la forma configuracin del anlisis LR(1)

A X1...Xi.Xi+1...Xn,a

donde
1) A X1...XiXi+1...Xn es una produccin
2) a Vt {$}

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 47


Anlisis LR cannico

Qu representa una de estas configuraciones?

A X1...Xi.Xi+1...Xn,a

hemos reconocido X1...Xi


smbolo de
esperamos/deseamos reconocer Xi+1...Xn anticipacin
cuando hayamos reconocido X1...Xn, (pre-anlisis)
nos podemos encontrar con el terminal a
en un config. A.,a


si , a no genera ningn efecto

una config. A.,a o A.,a con , pide una


reduccin por A slo si el smbolo de preanlisis es a

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 48


Anlisis LR cannico
Reducir por A slo con aque-
Dicho de llos smbolos a de la entrada para
otra forma: los que A .,a es un elemento
LR(1) del estado en la cima de la pila
Diferencia importante con SLR:
en SLR, la reduccin se haca siempre (es decir, para todo elemento de
SIG(A))
en LR(1), puede que la reduccin slo sea para un subconjunto propio de
SIG(A)
Notacin compacta
AX1...Xi.Xi+1...Xn,a1
.......
AX1...Xi.Xi+1...Xn,ak
AX1...Xi.Xi+1...Xn,{a1,...,ak}

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 49


Anlisis LR cannico

El uso del smbolo de anticipacin:


da a LR(1) ms potencia que LR(0):
parsers LR(1) son los ms potentes bottom-up parsers con un nico
smbolo de pre-anlisis
aumenta el tamao de AFD:
hay varias conf. LR(1) por cada posible conf. LR(0)
el lmite es |Vt|
El proceso de construccin:
anlogo al de LR(0), empezando con

S .S,{$}
como S puede ser un no terminal, es necesaria una operacin de clausura

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 50


Funcin clausura1(E I:conj config.) dev
Anlisis LR (I*:conj. config.)
cannico Pre: I es un conj. de configuraciones pa-
ra una gramtica ampliada
G=(N,T,S,P)
Post: I* contiene la clausura LR(1) de I
Principio
I*:=I
Repetir
Para cada A.B,a I*
Para cada BP
Para cada bT PRI(a)
Si B. ,b I*
entonces I*=I*{B. ,b }
FSi
FPara
FPara
Hasta Que no se aada nada a I*
dev(I*)
Fin

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 51


Anlisis LR cannico

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}
}

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 52


Anlisis LR cannico

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

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 53


Anlisis LR cannico

Coleccin Funcin conjLR_1(E G:gramtica) dev


de (C:conj. conj. config.)
Pre: G=(N,T,S,P), una gramtica ampliada
cannica Post: C es la coleccin cannica de
de configuraciones LR(1)
conjuntos Variables S:conj. config.
de Principio
C:=clausura1({S.S,$})
configura- Repetir
ciones Para cada IC
LR(1) para Para cada XNT
una Si (suc1(I,X)<>)(suc1(I,X)C)
entonces C=C suc1(I,X)
gramtica FSi
FPara
FPara
Hasta que no se aada nada a C
dev(C)
Fin
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 54
Anlisis LR cannico S S
S CC
Ejemplo:
C cC
S .S, {$} S C.C,{$} C d
S .CC,{$} 0 C .cC,{$}
C .cC,{c,d} C .d, {$} 2
C .d, {c,d}
C d.,{c,d} 4
S S.,{$} 1
C c.C,{$}
C c.C,{c,d} C .cC,{$}
C .cC,{c,d} C .d, {$} 6
C .d, {c,d} 3 C d., {$}
7 C cC.,{c,d}
8
S CC.,{$}
5
C cC.,{$}
9

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 55


S S
Anlisis LR cannico
S CC
S .S, {$} C cC
S .CC,{$} S
C .cC,{c,d} S S.,{$} C d
1
C .d, {c,d}
0 5
2 C
C S C.C,{$} S CC.,{$}
C .cC,{$} c
C .d, {$}
C c.C,{$}
c C .cC,{$}
c C .d, {$} 6 d C
d
C d., {$} 7
c C c.C,{c,d} 3
C .cC,{c,d}
C .d, {c,d} C
C cC.,{c,d} 8 C cC.,{$} 9
d d
C d.,{c,d} 4
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 56
Anlisis LR cannico
Funcin constAccion(E G:gramtica) dev (accion[]:....)
Pre: G=(N,T,S,P)es una gramtica ampliada
Post: accion es parte de la tabla LR(1)
Variables I:conj. config.; i:entero;C:conj. conj. config.
Principio
C:=conjLR_1(G) /*C={I0,...,In}*/
Para i:=0 hasta n
Para cada bT
Si A.b,a Ii suc1(Ii,b)=Ij
accion[i,b]:=desplazar j
FSi
FPara
Para cada AN\S
Si (A.,a Ii) accion[i,a]:=reducir A FSi
FPara
Si (S S.,$ Ii) accion[i,$]:=aceptar FSi
FPara
asignar ERROR a entradas vacas
dev(accion)
Fin

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 57


Anlisis LR cannico

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

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 58


Anlisis LR cannico Funcin constIr_a(E G:gramtica) dev
(ir_a[]:....)
Pre: G=(N,T,S,P)es una gramtica
ampliada
C={I0,...,In}= conjLR_1(G)
Post: ir_a es parte de la tabla LR(1)
cannico
Estado inicial Variables i:entero
del analizador: Principio
el construdo a Para i:=0 hasta n
Para cada AN
partir de Si suc1(Ii,A)=Ij
ir_a[i,A]:=j
S.S,$ FSi
FPara
FPara
asignar ERROR a entradas vacas
dev(ir_a)
Fin

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 59


Anlisis LR cannico 1) S S
Las tablas para el ejemplo anterior son 2) S CC
3) C cC
accin[] ir_a[] 4) C d

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 60


Anlisis LALR

En general, ocurre que:


tablas accion e ir_a para analizadores SLR son mucho ms
compactas que las tablas LR(1) cannico
pero hay importantes estructuras que no pueden ser resueltas con SLR
Anlisis LALR(1):
ms compacto que LR(1) (mismo nm. estados que SLR(1))
menos potente que LR(1) cannico
buen compromiso potencia/tamao para los lenguajes frecuentes
propuesto por DeRemer en 1969
Espacio para Pascal:
SLR y LALR varios cientos de estados
LR(1) cannico varios miles de estados

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 61


Anlisis LALR
s={ A a.,{b,c},
Sea el estado LR(1) B a.,{d}
}

Se le puede hacer corresponder


el estado SLR(1) s={ A a.,B a. }

Diremos que S es el corazn de S


En el momento de la generacin de un nuevo nodo:
si hay uno con el mismo corazn
fusionarlos, haciendo la unin de los conjuntos de preanlisis
poner los arcos correspondientes
C d.,{c,d}
4
C d.,{c,d,$}
C d., {$} 7 47

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 62


Anlisis LALR

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

Yacc realiza c shift 3 c shift 3


el anlisis LALR d shift 4 d shift 4
. error . error

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

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 67


Anlisis LALR

tamao del analizador: se ha calculado que, para los lenguajes habituales,

|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)

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 68


Gramticas ambiguas en Yacc

Qu pasa cuando la gramtica en ambigua?


Yacc aplica dos reglas:
ante un conflicto red/desp, desplazar
ante un conflicto red/red, reducir por la produccin que se haya
escrito antes
Si estas reglas no corresponden a lo que queremos hacer?
Yacc da la siguiente posibilidad:
se puede asociar a cada terminal una precedencia:
cuanto ms tarde se declare, mayor precedencia
se puede asociar a cada terminal una asociatividad
%left, %right, %nonassoc
se puede asociar a cada produccin una precedencia y asociatividad
la de su terminal ms a la dcha.

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 69


Gramticas ambiguas en Yacc

En caso de conflicto red/desp %token id


si la produccin tiene mayor %left + -
precedencia que el token de la %left * /
entrada, reducir %right MENOS
si tienen igual precedencia, pero la %%
asociatividad de la produccin es por E:
la izda. reducir E + E
en los dems casos, desplazar | E - E
| E * E
| E / E
por con
defecto prec. | ( E )
| - E %prec MENOS
-1+2 -3 1 | id
2*3+4 14 10 ;
-1+-2*3 5 -7 %%

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 70


Gramticas ambiguas en Yacc .....
***** Configuration Set 10 *****
E --> - E . {/,-,+,*,),$}
E --> E .+ E {/,-,+,*,),$}
E --> E .- E {/,-,+,*,),$}
E --> E .* E {/,-,+,*,),$}
E --> E ./ E {/,-,+,*,),$}
Edge to 5 labelled '+'
Edge to 6 labelled '-'
Edge to 7 labelled '*'
Edge to 8 labelled '/'
***** Configuration Set 11 *****
E --> E + E . {/,-,+,*,),$}
E --> E .+ E {/,-,+,*,),$}
E --> E .- E {/,-,+,*,),$}
E --> E .* E {/,-,+,*,),$}
E --> E ./ E {/,-,+,*,),$}
Edge to 5 labelled '+'
Edge to 6 labelled '-'
Edge to 7 labelled '*'
Edge to 8 labelled '/'
***** Configuration Set 12 *****
.....
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 71
Gramticas ambiguas en Yacc

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 '.' ;

Por lo que la gramtica se puede transformar en


programa:
tkPROGRAM tkID ';' parteDecs bloqueInst '.'
| tkPROGRAM tkID error parteDecs bloqueInst '.'
;

error es un token especial definido por la herramienta

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 73


Recuperacin de errores sintcticos en el anlisis ascendente.
El caso de Yacc
Mtodo de recuperacin aplicado una vez detectado un error:
se invoca el procedimiento yyerror()
ste se encuentra definido en la librera de Yacc (recordar que se incluye
mediante la opcin "-ly")
Salvo que se redefina, dicho procedimiento escribe un mensaje y aborta la
ejecucin. Por lo tanto, si deseamos llevar a cabo algn tipo de recuperacin
del error deberemos redefinirlo.
se pone como siguiente token de la entrada el token ficticio "error
se eliminan estados de la pila, sucesivamente, hasta llegar a un estado capaz de
ejecutar un desplazamiento con un token "error"
eventualmente, puede llegar a vaciar la pila, terminando el anlisis en una
situacin de error

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 74


Recuperacin de errores sintcticos en el anlisis ascendente.
El caso de Yacc
una vez ejecutado dicho desplazamiento, se consulta de nuevo la tabla accin para
ver si existe alguna accin para el nuevo estado alcanzado y el token de la entrada
(que es el mismo que gener el primer error)
si se produce un nuevo error se ejecuta una secuencia de eliminaciones de
tokens de la entrada hasta encontrar uno que pueda seguir a un token de error,
lo que normalmente finalizar con una reduccin por la produccin de error,
abandonando el estado de error
el analizador considerar que ha salido de la condicin de error detectada cuando
sea capaz de desplazar al menos tres tokens consecutivos sin detectar un nuevo
error sintctico
Se puede evitar este comportamiento mediante el uso de la accin "yyerrok"
(consultar documentacin sobre Yacc)

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 75


Recuperacin de errores sintcticos en el anlisis ascendente.
El caso de Yacc
Lo ms complicado es establecer cules son las producciones de error
interesantes para un lenguaje dado. En [ScFr 85] se indican las siguientes
pautas sobre en qu partes del anlisis sintctico conviene introducir
producciones de error:
tan cerca como sea posible del smbolo inicial de la gramtica (esto evitara que
en la ejecucin del paso 3 se llegue a vaciar la pila)
tan cerca como sea posible de cada smbolo terminal (esto evitara eliminar
muchos tokens de la entrada en la ejecucin del paso 4)
de manera que la adicin de las producciones de error no introduzca conflictos
(shift/reduce o reduce/reduce)

Schreiner A., Friedman H. Jr.


Introduction to Compiler Construction with Unix
Prentice-Hall, 1985
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 76
Recuperacin de errores sintcticos en el anlisis ascendente.
El caso de Yacc
Parece claro que algunas de las pautas anteriores son excluyentes entre s
En cualquier caso, en [ScFr 85] se recomienda aadir producciones
error:
en cada construccin recursiva
evitando que el token error aparezca al final de la produccin
introduciendo dos producciones error en cada lista no vaca de elementos: una
para los problemas al principio de la lista y otra para los problemas al final de la
lista
en la rama vaca de las listas que puedan ser vacas

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 77


Recuperacin de errores sintcticos en el anlisis ascendente.
El caso de Yacc
Algunos ejemplos interesantes: 1 ms con separadores
0 ms
x: x:
{/*vaca*/} y
| x y {yyerrok;} | x T y {yyerrok;}
| x error | error
; | x error
| x error y {yyerrok;}
| x T error
1 ms ;
x:
; y
| x y {yyerrok;} inst:
| error ....
| x error | error ; /*en caso de
; error, saltar
hasta encontrar
;*/
;

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 78

Potrebbero piacerti anche