You are on page 1of 39

Procesadores de lenguajes

Tema 5

Anlisis sintctico ascendente

Ciencias de la Computacin e Inteligencia Artificial

Tema 5. Anlisis sintctico ascendente


5.1 Introduccin 5.2 Anlisis sintctico por desplazamiento y reduccin 5.3 El autmata reconocedor de prefijos viables 5.4 Algoritmos LR(0) y SLR

ndice

5.5 Algoritmos LR(1) y LALR


5.6 Gestin de errores 5.7 Clasificacin de gramticas

Procesadores de lenguajes

Tema 5. Anlisis sintctico ascendente


5.1 Introduccin 5.2 Anlisis sintctico por desplazamiento y reduccin 5.3 El autmata reconocedor de prefijos viables 5.4 Algoritmos LR(0) y SLR

ndice

5.5 Algoritmos LR(1) y LALR


5.6 Gestin de errores 5.7 Clasificacin de gramticas

Procesadores de lenguajes

Tema 5. Anlisis sintctico ascendente

5.1 Introduccin

El anlisis sintctico ascendente construye la inversa de la derivacin por la derecha Construye el rbol de anlisis sintctico de las hojas a la raz

Gramtica <L> <L> id <L> <L> , id <L> id <L> id , id <L> id , id <L>

<L>

, id

id , id , id

Procesadores de lenguajes

Tema 5. Anlisis sintctico ascendente

5.1 Introduccin

El problema fundamental es decidir cuando lo que parece ser la parte derecha de una regla puede ser sustituida por la parte izquierda No es un problema trivial ya que pueden existir ocasiones en las que

es posible sustituir dos producciones diferentes


El conjunto de gramticas que pueden ser analizadas mediante un anlisis ascendente lineal se denomina LR(1) El conjunto LR(1) es mucho ms amplio que el de las gramticas LL(1)

Procesadores de lenguajes

Tema 5. Anlisis sintctico ascendente


5.1 Introduccin 5.2 Anlisis sintctico por desplazamiento y reduccin 5.3 El autmata reconocedor de prefijos viables 5.4 Algoritmos LR(0) y SLR

ndice

5.5 Algoritmos LR(1) y LALR


5.6 Gestin de errores 5.7 Clasificacin de gramticas

Procesadores de lenguajes

Tema 5. Anlisis sintctico ascendente

5.2 Anlisis sintctico por desplazamiento y reduccin

El anlisis ascendente lineal ms utilizado es el algoritmo de desplazamiento-reduccin (shift-reduce) Este algoritmo se basa en una pila de estados y una tabla de anlisis. Existen diferentes mtodos para generar la tabla de anlisis (LR(0),

SLR, LALR, LR(1))


El mtodo LR(1) genera la tabla para cualquier gramtica LR(1), pero genera tablas muy grandes. El mtodo SLR genera tablas muy compactas pero no puede aplicarse a todas las gramticas LR(1) El mtodo LALR genera tablas compactas y puede aplicarse a la mayora de gramticas LR(1)

Procesadores de lenguajes

Tema 5. Anlisis sintctico ascendente Utiliza dos acciones bsicas:

5.2 Anlisis sintctico por desplazamiento y reduccin

Desplazar: consiste en consumir un token de la cadena de entrada Reducir: consiste en sustituir en la pila los smbolos de una parte

derecha de una regla por su parte izquierda

El algoritmo utiliza una pila de estados y una tabla de anlisis con dos partes:
Acciones: para cada smbolo terminal y $. Ir-a: para cada smbolo no terminal Las filas corresponden a los estados

Procesadores de lenguajes

Tema 5. Anlisis sintctico ascendente Las acciones pueden ser


dj : desplazar y apilar el estado j rk: reducir por la regla k-sima.

5.2 Anlisis sintctico por desplazamiento y reduccin

Consiste en eliminar tantos estados de la pila como elementos en la

parte derecha de la regla.


A continuacin se analiza el estado de la cima de la pila p. Por ltimo se apila el estado Ir_a(p,A) siendo A el smbolo no terminal que define la regla k-sima

aceptar: terminar el anlisis aceptando la cadena error: producir un error (cuando no se encuentra ninguna accin)

Procesadores de lenguajes

Tema 5. Anlisis sintctico ascendente

5.2 Anlisis sintctico por desplazamiento y reduccin

1: <S> <B> <A> end 2: <A> begin <C> 3: <C> codigo 4: <B> tipo 5: <B> id <B>

Estado 0 1 2 3 4 5 6 7 8 9 10

end

begin codigo d6 r4

tipo d3

id d4

$ aceptar

S 1

A 5

B 2

d3 d8 d10 r5

d4

7 9 r1

r2 r3

10

Procesadores de lenguajes

Tema 5. Anlisis sintctico ascendente

5.2 Anlisis sintctico por desplazamiento y reduccin

PILA 0 04 043 047 02 026 0 2 6 10 0269 025 0258 01

ENTRADA id tipo begin codigo tipo begin codigo begin codigo begin codigo begin codigo codigo end end end end end end end end end $ $ $ $ $ $ $ $ $ $ $

ACCIN d4 d3 r4 ( <B> tipo ) r5 ( <B> id <B> ) d6 d10 r3 ( <C> codigo ) r2 ( <A> begin <C> ) d8 r1 ( <S> <B> <A> end ) aceptar

11

Procesadores de lenguajes

Tema 5. Anlisis sintctico ascendente


5.1 Introduccin 5.2 Anlisis sintctico por desplazamiento y reduccin 5.3 El autmata reconocedor de prefijos viables 5.4 Algoritmos LR(0) y SLR

ndice

5.5 Algoritmos LR(1) y LALR


5.6 Gestin de errores 5.7 Clasificacin de gramticas

12

Procesadores de lenguajes

Tema 5. Anlisis sintctico ascendente Elemento:

5.3 El autmata reconocedor de prefijos viables

Se obtiene colocando un smbolo en cualquier posicin de la parte derecha de una regla <A> X1 X2 ... Xi Xi+1 ... Xn

Significa que los smbolos a la izquierda del punto ya han sido


reconocidos Las reglas vacas (<A> l ) slo generan un elemento ( <A> )

13

Procesadores de lenguajes

Tema 5. Anlisis sintctico ascendente Ejemplo de elementos:


Gramtica:
<S> <A> <C> <B> <B> <B> <A> end begin <C> codigo tipo id <B>

5.3 El autmata reconocedor de prefijos viables

Elementos:
<S> <S> <S> <S> <A> <B> <A> end <B> <A> end <B> <A> end <B> <A> end begin <C> <A> begin <C> <A> begin <C> <C> codigo <C> codigo <B> tipo <B> tipo <B> id <B> <B> id <B> <B> id <B>

14

Procesadores de lenguajes

Tema 5. Anlisis sintctico ascendente

5.3 El autmata reconocedor de prefijos viables

Clausura de un conjunto de elementos:


Sea I un conjunto de elementos Todos los elementos de I pertenencen a clausura(I) Si clausura de I contiene un elemento de la forma
<A> a <B> b

Entonces se aade a clausura(I) todos los elementos de la forma


<B> a

15

Procesadores de lenguajes

Tema 5. Anlisis sintctico ascendente

5.3 El autmata reconocedor de prefijos viables

Ejemplo de clausura de un conjunto de elementos:


Sea I el conjunto
<S> <B> <A> end

Clausura(I) ser el conjunto


<S> <B> <A> end
<B> tipo <B> id <B>

16

Procesadores de lenguajes

Tema 5. Anlisis sintctico ascendente Operacin Ir_a

5.3 El autmata reconocedor de prefijos viables

Sea I un conjunto de elementos y A un smbolo de la gramtica (terminal o no terminal) La operacin Ir_a(I,A) da como resultado otro conjunto de

elementos.
Para cada elemento de I de la forma
<B> a A b

Se aade a Ir_a(I,A) los elementos del conjunto


clausura( <B> a A b )

17

Procesadores de lenguajes

Tema 5. Anlisis sintctico ascendente


Ejemplo de operacin Ir_a
Sea la gramtica:
<S> <B> <A> end <A> begin <C> <C> codigo <B> tipo <B> id <B>

5.3 El autmata reconocedor de prefijos viables

Sea I el conjunto
<S> <B> <A> end <B> tipo <B> id <B>

El conjunto Ir_a(I, <B>) es


<S> <B> <A> end <A> begin <C> <B> id <B>

18

Procesadores de lenguajes

Tema 5. Anlisis sintctico ascendente

5.3 El autmata reconocedor de prefijos viables

Coleccin cannica de conjuntos de elementos


Se ampla la gramtica aadiendo la regla <X> <S>, siendo <S> el smbolo inicial Se calcula el conjunto I0 = clausura(<X> <S>), que ser el primer elemento de la coleccin Para cada conjunto de la coleccin (C) y cada smbolo terminal o no terminal (A) se calcula el conjunto Ir_a(C,A), que se aade a la coleccin si no se haba incluido previamente Se repite el paso anterior hasta que no se puedan aadir ms conjuntos a la coleccin Si se representan los conjuntos de la coleccin como estados y las operaciones Ir_a() como transiciones, se obtiene un Autmata reconocedor de prefijos viables

19

Procesadores de lenguajes

Tema 5. Anlisis sintctico ascendente

5.3 El autmata reconocedor de prefijos viables

Ejemplo de clculo de una coleccin cannica de conjuntos de elementos

I0 <X> <S> <S> <B> <A> end <B> tipo <B> id <B> id

<S> <B> tipo

I1 <X> <S> I2 <A> <S> <B> <A> end <A> begin <C> <B> tipo I3

I5 <S> <B> <A> end end I8 begin I6 <A> begin <C> <C> codigo <C> codigo I10 <C> codigo <S> <B> <A> end

tipo id I4 <B> id <B> <B> tipo <B> id <B> I7 <B> <B> id <B> I9

<A> begin <C>

20

Procesadores de lenguajes

Tema 5. Anlisis sintctico ascendente


5.1 Introduccin 5.2 Anlisis sintctico por desplazamiento y reduccin 5.3 El autmata reconocedor de prefijos viables 5.4 Algoritmos LR(0) y SLR

ndice

5.5 Algoritmos LR(1) y LALR


5.6 Gestin de errores 5.7 Clasificacin de gramticas

21

Procesadores de lenguajes

Tema 5. Anlisis sintctico ascendente

5.4 Algoritmos LR(0) y SLR

Algoritmo LR(0) de construccin de la tabla de anlisis


Se obtiene la coleccin cannica de conjuntos de elementos Se obtiene el autmata reconocedor de prefijos viables Cada conjunto de la coleccin (Ii) es un estado del analizador (i)

Contenido de la seccin Ir_a de la tabla de anlisis:


Cada transicin Ir_a(Ii,<A>) = Ij , siendo <A> un smbolo no terminal de la gramtica, significa colocar el valor j en la celda Ir_a(i,<A>)

22

Procesadores de lenguajes

Tema 5. Anlisis sintctico ascendente

5.4 Algoritmos LR(0) y SLR

Algoritmo LR(0) de construccin de la tabla de anlisis


Contenido de la seccin Accin de la tabla de anlisis
Cada transicin Ir_a(Ii, a) = Ij, siendo a un smbolo terminal, significa colocar el valor dj en la celda Accin(i,a)

Para cada estado i que contenga el elemento (X <S> ) se coloca el


valor aceptar en la celda Accin(i,$). Para los estados i que contengan un elemento con el punto al final de la regla k-sima (<A> b ) colocar rk en todas las celdas del estado. Las celdas que queden vacas representan errores sintcticos.

23

Procesadores de lenguajes

Tema 5. Anlisis sintctico ascendente Ejemplo

5.4 Algoritmos LR(0) y SLR

1: <S> <B> <A> end 2: <A> begin <C> 3: <C> codigo 4: <B> tipo 5: <B> id <B>

Estado 0 1 2 3 4 5 6 7 8 9 10

end

begin codigo d6 r4

tipo d3 r4 d3 r5 r1 r2 r3

id d4 r4 d4 r5 r1 r2 r3

$ aceptar

S 1

A 5

B 2

r4 d8 r5 r1 r2 r3

r4 d10 r5 r1 r2 r3

r4 7 9 r5 r1 r2 r3

r5 r1 r2 r3

24

Procesadores de lenguajes

Tema 5. Anlisis sintctico ascendente

5.4 Algoritmos LR(0) y SLR

El algoritmo LR(0) no requiere de la consideracin de ningn token de preanlisis (de ah el 0).


Cuando se alcanza un estado que slo tiene acciones de reduccin, se aplican stas sin necesidad de estudiar el siguiente token de la cadena de entrada. Cuando se alcanza un estado que no es de reduccin, se lee el token de la cadena de entrada y se ejecuta la accin de desplazar correspondiente (o la de aceptar o la generacin de un error).

25

Procesadores de lenguajes

Tema 5. Anlisis sintctico ascendente


Conflictos LR(0):

5.4 Algoritmos LR(0) y SLR

Los conflictos aparecen cuando una determinada celda de la seccin Accin de la tabla puede rellenarse con varios valores. Estos conflictos significan que la gramtica no es LR(0). Puede que la gramtica sea ambigua, o que sea LALR o LR(1).

Ejemplo de conflicto LR(0):


1: <E> <T> plus <E> 2: <E> <T> 3: <T> number Estado 0 1 2 3 4 5 number d4 r2 d4 r3 r1 plus $ E 1 5 r3 r1 r3 r1
26

T 2 2

aceptar d3, r2 r2

Procesadores de lenguajes

Tema 5. Anlisis sintctico ascendente

5.4 Algoritmos LR(0) y SLR

En el ejemplo anterior, el estado que presenta el conflicto es el siguiente:


<E> <T> plus <E> <E> <T>

El conflicto se debe a que en ese estado es posible reducir la regla 2 y tambin avanzar en el autmata consumiendo el token plus.

El conflicto se poda haber evitado si consideramos que si despus de <T>


viene el token plus entonces no se debera reducir la regla 2 (sustituyendo <T> por <E>) ya que despus de <E> no puede venir plus.

Para evitar estos conflictos es necesario considerar los conjuntos siguientes de cada smbolo no terminal y tener en cuenta un token de preanlisis. Esto es la base del algoritmo SLR.

27

Procesadores de lenguajes

Tema 5. Anlisis sintctico ascendente Algoritmo SLR:

5.4 Algoritmos LR(0) y SLR

Es idntico al algoritmo LR(0) salvo en la forma de rellenar las acciones de reduccin. Para los estados i que contengan un elemento con el punto al

final de la regla k-sima (<A> b ) colocar rk en todas las


celdas de los tokens pertenecientes a Siguientes( <A> ).

Ejemplo:
1: <E> <T> plus <E> 2: <E> <T> 3: <T> number Estado 0 1 2 3 4 5 number d4 d4 r3 r3 r1 plus d3 $ aceptar r2 5 2 E 1 T 2

28

Procesadores de lenguajes

Tema 5. Anlisis sintctico ascendente


5.1 Introduccin 5.2 Anlisis sintctico por desplazamiento y reduccin 5.3 El autmata reconocedor de prefijos viables 5.4 Algoritmos LR(0) y SLR

ndice

5.5 Algoritmos LR(1) y LALR


5.6 Gestin de errores 5.7 Clasificacin de gramticas

29

Procesadores de lenguajes

Tema 5. Anlisis sintctico ascendente


Ejemplo de conflicto SLR:
1: <S> <M> a 2: <S> b <M> c 3: <S> d c 4: <S> b d a 5: <M> d

5.5 Algoritmos LR(1) y LALR

Autmata:
<X> <S> <S> <M> a <S> b <M> c <S> d c <S> b d a <M> d 0 S M b <X> <S> 1 a M <S> <M> a 5 <S> b <M> c 6 c <S> b <M> c 9 <S> b d a 10

<S> <M> a 2 <S> b <M> c <S> b d a 3 <M> d <S> d c <M> d 4

d <S> b d a <M> d c
<S> d c

8
30

Procesadores de lenguajes

Tema 5. Anlisis sintctico ascendente


Tabla SLR:

5.5 Algoritmos LR(1) y LALR

Estado a b c d $ S M 0 d3 d4 1 2 1 aceptar 2 d5 3 d7 6 4 r5 d8 , r5 5 r1 6 d9 7 d10, r5 r5 8 r3 9 r2 10 r4 En el estado 0, el elemento <M> d proviene de <S> <M> a. Por tanto, en el estado 4, si se reduce la regla <M> d es porque el siguiente token debe ser a. Sin embargo el conflicto se produce slo cuando el siguiente token es c.

En el caso del estado 7, el elemento <M> d proviene de <S> b <M> c.


Por tanto, la reduccin slo debera realizarse cuando el siguiente token es c.
31

Procesadores de lenguajes

Tema 5. Anlisis sintctico ascendente

5.5 Algoritmos LR(1) y LALR

El algoritmo LR(1) consiste en ampliar los elementos, indicando no slo la regla a la que se refiere sino tambin el conjunto de smbolos que se espera detrs de esa regla. Por ejemplo, los estados 0 y 3 son:
<X> <S> <S> <M> a <S> b <M> c <S> d c <S> b d a <M> d $ $ $ $ $ a <S> b <M> c <S> b d a <M> d $ $ c

Las acciones de reduccin se asocian exclusivamente a los tokens que aparecen en los elementos donde el punto se encuentra al final de una regla

32

Procesadores de lenguajes

Tema 5. Anlisis sintctico ascendente

5.5 Algoritmos LR(1) y LALR

El algoritmo LR(1) tiende a construir tablas con un nmero de estados muy grande. El algoritmo LALR es una modificacin del LR(1) en la que dos estados se fusionan si sus elementos son idnticos y slo se

diferencian en los tokens de preanlisis. Esto permite reducir el


nmero de estados de la tabla. Esta reduccin puede originar conflictos, por lo que las gramticas LALR son ms estrictas que las LR(1).

33

Procesadores de lenguajes

Tema 5. Anlisis sintctico ascendente


5.1 Introduccin 5.2 Anlisis sintctico por desplazamiento y reduccin 5.3 El autmata reconocedor de prefijos viables 5.4 Algoritmos LR(0) y SLR

ndice

5.5 Algoritmos LR(1) y LALR


5.6 Gestin de errores 5.7 Clasificacin de gramticas

34

Procesadores de lenguajes

Tema 5. Anlisis sintctico ascendente

5.6 Gestin de errores

Los errores sintcticos aparecen cuando en la seccin Accin de la tabla no existe ninguna accin asociada al estado actual y al smbolo terminal de la entrada. El mensaje de error a generar es del tipo Encontrado token a, se

esperaba uno de los siguientes: b, c, d, .


El token encontrado (a) se refiere al token de la entrada y los tokens esperados (b, c, d, ) son aquellos que tengan acciones asociadas para el estado de la cima de la pila.

35

Procesadores de lenguajes

Tema 5. Anlisis sintctico ascendente

5.6 Gestin de errores

La recuperacin de errores en el anlisis ascendente es muy compleja, ya que los estados pueden representar el grado de reconocimiento de varias reglas a la vez.
I2 = { <S> <A> <B> end, <B> begin <C> } Este estado tiene solo una accin asociada al token begin

Para desarrollar una estrategia de recuperacin de errores se aade una


nueva regla con un token especial
<B> error Cualquier token que no sea begin se considera un error Cualquier token errneo se elimina de la entrada y genera una reduccin de esta regla.

La herramienta YACC utiliza la siguiente tcnica ante un error:


Desapila los estados hasta llegar a alguno que responda a una regla de error Desplaza la entrada y reduce la regla de error Desplaza la entrada hasta encontrar un token que no produzca error 36

Procesadores de lenguajes

Tema 5. Anlisis sintctico ascendente


5.1 Introduccin 5.2 Anlisis sintctico por desplazamiento y reduccin 5.3 El autmata reconocedor de prefijos viables 5.4 Algoritmos LR(0) y SLR

ndice

5.5 Algoritmos LR(1) y LALR


5.6 Gestin de errores 5.7 Clasificacin de gramticas

37

Procesadores de lenguajes

Tema 5. Anlisis sintctico ascendente

5.7 Clasificacin de gramticas

Gramticas libres de contexto: se utilizan para el anlisis sintctico y pueden ser ambiguas. Es el conjunto ms amplio Gramticas LR(k): son gramticas no ambiguas que pueden analizarse por un mtodo ascendente de orden k.

Gramticas LR(1): son gramticas no ambiguas que pueden


analizarse por un mtodo ascendente lineal (k=1). Son un subconjunto de las LR(k) Gramticas LALR(1): son un subconjunto de las LR(1) que pueden analizarse mediante el algoritmo LALR Gramticas SLR: son un subconjunto de las LALR que pueden analizarse mediante el algoritmo SLR.

38

Procesadores de lenguajes

Tema 5. Anlisis sintctico ascendente

5.7 Clasificacin de gramticas

Gramticas LL(k): son gramticas no ambiguas que pueden analizarse por un mtodo descendente con lookahead k. Son un subconjunto de LR(k). Gramticas LL(1): son gramticas no ambiguas que pueden

analizarse por un mtodo descendente con lookahead 1. Son un


subconjunto de LL(k) y de LR(1). Es importante sealar que un lenguaje puede ser generado por muchas gramticas de diferente tipo

39

Procesadores de lenguajes