Está en la página 1de 67

TEMA 7

AUTÓMATAS CON PILA


7. AUTÓMATAS CON PILA

7.1. Introducción
7.2. Definición de Autómatas con pila.
7.3. Lenguaje aceptado por un autómata con pila.
7.4. Autómatas con pila y lenguajes libres del contexto.
7.4.1. Reconocimiento descendente. Gramáticas LL(k).
7.4.1.1. Proceso de Análisis Sintáctico Descendente.
7.4.1.2. Analizadores LL y autómatas de pila no deterministas
7.4.1.3. Implementación de Analizadores LL
 Transformación de una gramática para su análisis descendente.
 Construcción de los conjuntos PRIMERO Y SIGUIENTE.
 Condiciones LL(1).
7.4.1.4. Algoritmo de análisis sintáctico LL
 Construcción de Tablas LL.
7.4.2. Reconocimiento ascendente. Gramáticas LR(k).
7.4.2.1. Introducción
7.4.2.2. Proceso de Análisis Sintáctico Ascendente.
7.4.2.3. Analizadores LR y autómatas de pila no deterministas
7.4.2.4. Implementación de Analizadores LR
7.4.2.5. Algoritmo de análisis sintáctico LR
7.4.2.6. Construcción de Tablas LR.

TALF. Tema 7 nº 2
7.1. Introducción

 Los Autómatas con Pila son una extensión de los AFD a los que se les añade
una memoria (pila).
 En la pila se almacenan símbolos de la cadena de entrada y de la gramática, así
como caracteres especiales (#) para indicar el estado de pila vacía.
 Las transiciones son de la forma: (p,x,s;q,t)
 p=estado inicial
 q=estado al que llega p x, s; t q
 x= símbolo de la cadena de entrada
 s=símbolo que se desapila
 t=símbolo que se apila
 Gráficamente:

autómatas con pila


Cadena de ENTRADA Cadena de ENTRADA

x x
Cabeza de lectura Cabeza de lectura

CIMA CIMA
s t
r s´ r s´
p p
PILA PILA
q q
Mecanismo de control Mecanismo de control

TALF. Tema 7 nº 3
7.2. Definición de Autómatas con pila.

 Definición: Un Autómata a Pila se define como la séptupla:(∑, P, Q, A0, q0, f, F)


donde:
 ∑: alfabeto de entrada.
 P: alfabeto de la pila.
 Q: conjunto de estados.
 A0: símbolo inicial de la pila (#).
 q0: símbolo inicial del conjunto de estados.
 f: función de transición. Es una aplicación de
 Qx∑{λ}xP en el conjunto de partes de P(QxP)*.
 F: conjunto de estados finales o de aceptación.
 Función de transición. Interpretamos la función f de la siguiente forma:
 f(q, a, A) = {(q1,Z1),..., (qn,Zn)}: Si el AP se encuentra en el estado q, lee el
símbolo a de la cinta de entrada, y aparece el símbolo A en el tope de la pila,
pasará al estado qi (ni1), borrará el símbolo A de la pila e introducirá la
palabra Zi, situando la cabecera de la misma en el tope de la pila, y avanzando
una posición en la cinta de entrada.
 f(q, λ, A) = {(q1,Z1),..., (qn,Zn)}: Si el AP se encuentra en el estado q y
aparece el símbolo A en el tope de la pila, pasará al estado qi (ni1), borrará
el símbolo A de la pila e introducirá la palabra Zi, situando la cabecera de la
misma en el tope de la pila, y mantendrá la misma posición en la cinta de
entrada.

TALF. Tema 7 nº 4
7.2. Definición de Autómatas con pila.

 Descripciones instantáneas
Dado un AP, podemos describir el proceso de aceptación o rechazo de una palabra
de ∑* mediante una serie de descripciones instantáneas de la forma (q, x, Z) que
definen respectivamente el estado del AP, la entrada que queda por leer, y el
contenido de la pila en un momento dado.
 Decimos que una descripción instantánea (q, az, AZ) precede a otra (p, z, YZ) en
un paso y se expresa como:(q, az, AZ)(p, z, YZ), si (p, Y)f(q, a, A).
 Decimos que una descripción instantánea (q, az, AZ)precede a otra (p, z, YZ) en n
pasos y se expresa como:(q, az, AZ) * (p, z, YZ), si existen una serie de
descripciones que cumplen la relación de precedencia anterior de una en una.

 Autómata a Pila Determinista: Un AP es Determinista si verifica:


1. qQ, AP, cardinal(f(q, λ, A))>0  f(q, a, A) =, a∑.
2. qQ, AP, a∑{λ} cardinal(f(q, a, A))<2.

TALF. Tema 7 nº 5
7.3. Lenguaje aceptado por un autómata con pila.

 Lenguaje aceptado por un AP (M=(∑, P, Q, A0, q0, f, F)


 Lenguaje aceptado por criterio de estado final
LEF(M) = (x / (q0, x, A0) * (p, λ, X), pF, X  P*}
 Lenguaje aceptado por criterio de pila vacía
LPV(M) = (x / (q0, x, A0) * (p, λ, λ), pQ}
 Equivalencia
 LEFLPV λ,λ; #
i q0

1. Nuevo estado i tal que:


λ,λ; λ p

2. Nuevo estado p tal que:


λ,λ; λ

3. xP crear las transiciones: λ,x; λ


p
4. Nuevo estado f que será el final tal que: p
λ, #; λ
f

 LPVLEF λ,λ; #
i q0
1. Igual que el anterior.
qi λ, #; λ
2. Nuevo estado f tal que qQ: f

qj λ, #; λ

TALF. Tema 7 nº 6
7.3. Lenguaje aceptado por un autómata con pila. Ejemplo.

 Ejemplo: Autómata con pila que reconoce el lenguaje L={xnym, n>m}


 Aplicamos el algoritmo de LEFLPV

x, ;x y,x;

y,x;
1 2

x, ;x y,x; ,x;

, ; # y,x; , ;  , #; 
i 1 2 p f

TALF. Tema 7 nº 7
7.3. Lenguaje aceptado por un autómata con pila.

 Los lenguajes libres de contexto son reconocidos por los Autómatas a


Pila No Determinísticos.
 Los APND aceptan más lenguajes que los Autómatas a Pila
Determinísticos, por lo que no son equivalentes, aunque la mayoría de
los lenguajes de programación son reconocidos por los APD.
 Teorema
 A toda gramática G libre de contexto le corresponde
biunívocamente un AP que acepta por vaciado de pila el lenguaje
generado por ella.
 Existen dos métodos para construir un AP a partir de la GIC:
 Análisis descendente:gramáticas LL(k)
 Análisis ascendente:gramáticas LR(k)
donde:
 L  Left to right: la secuencia de tokens de entrada se analiza de izquierda
a derecha.
 L/R  Left-most/right-most: obtiene la derivación por la
izquierda/derecha.
 k  es el número de símbolos de entrada que es necesario conocer en cada
momento para poder hacer el análisis.

TALF. Tema 7 nº 8
7.4.1.1. Proceso de Análisis Sintáctico Descendente.

autómatas con pila


• El proceso comienza apilando el axioma de
CINTA DE ENTRADA la gramática. Continuamente mira lo que hay
en las últimas casillas de la pila:

 Si existe concordancia con un no


Cabeza de lectura
terminal de alguna de las reglas de
CIMA producción de la gramática analizada,
Indicador de stado elimina de la cima de la pila ese no
terminal y lo cambia por la cadena de la
parte derecha de la regla de producción.

 Si existe concordancia con un terminal


PILA y coincide con el carácter de la entrada,
Mecanismo de control
lo desapila y lee un carácter más de la
entrada.

• Si con este proceso se consigue agotar el contenido de la cinta de entrada y


de la pila, la palabra es reconocida. En otro caso no lo es.

TALF. Tema 7 nº 9
7.4.1.1. Proceso de Análisis Sintáctico.

Ejemplo: G = ({a}, {S}, S, {S ::= aS | a})


cadena de entrada= aa

PILA ENTRADA ACCIÓN

aa$ Apilar S

S aa$ S::=aS

aS aa$ Desapilar a; Leer()

S a$ S::=a
a a$ Desapilar a; Leer()

$ aceptar

TALF. Tema 7 nº 10
7.4.1.2. Analizadores LL y autómatas de pila no deterministas

1. Construir los cuatro estados del autómata: i el inicial, f el de aceptación y p


y q dos estados intermedios.
2. Se introducen las transiciones estándar para marcar la cima de la pila, para
apilar el axioma y para determinar cuándo queda vacía:
(i, , ; p,#), (p,,  ; q,S ) y (q,  ,#; f,  ).
3. Por cada símbolo terminal a T , introducimos una transición de la forma
(q,a,a;q,).
4. Por cada regla de la forma A::=  P, añadimos la transición (q,,A;q,).

, A; A  P

, ; # , S;  , #; 
i p q f

a, a; a T

TALF. Tema 7 nº 11
7.4.1.2. Analizadores LL y autómatas de pila no deterministas

 Ejemplo:
G = ({a, b, z}, {S, M, N}, S, {S ::= zMNz, M ::= aMa | z, N ::= bNb | z})

a,a;
b,b;
z,z;

, ;S , #; 
, ; # p
i q f

, S; zMNz
,N; bNb
, M; aMa
, N; z
, M; z

TALF. Tema 7 nº 12
7.4.1.2. Analizadores LL y autómatas de pila no deterministas
estado Pila Entrada Acción indeterminación

i λ zazabzbz$ (i, λ, λ ; p, #)

p # zazabzbz$ (p, λ, λ ; q, S)

q S# zazabzbz$
(q, λ, S ; q, zMNz)
q zMNz# zazabzbz$ (q, z,z;q,λ)
(q,λ,M;q, aMa)
q MNz# azabzbz$ (q,λ,M;q, aMa) | (q, λ, M ; q, z)
q aMaNz# azabzbz$ (q, a,a;q,λ)
(q, λ,M; q, z)
q MaNz# zabzbz$ (q, λ, M ; q, z)| (q,λ,M;q, aMa)

q zaNz# zabzbz$
(q, z,z;q,λ)
q aNz# abzbz$
(q, a,a;q,λ)
q Nz# bzbz$ (q,λ,N;q, bNb) | (q, λ, N ; q, z)

q bNbz# bzbz$ (q, b,b;q,λ)

q Nbz# zbz$
(q, λ, N ; q, z)
q zbz# zbz$ (q, z,z;q,λ)

q bz# bz$ (q, b,b;q,λ)

q z# z$
(q, z,z;q,λ)
q # $ (q, λ, #; f, λ)

f λ λ Aceptar

TALF. Tema 7 nº 13
7.4.1.2. Analizadores LL y autómatas de pila no deterministas
Acción
Si aceptamos una cadena usando este
(i, λ, λ ; p, #)
autómata podremos reconstruir la
(p, λ, λ ; q, S) secuencia de derivaciones que nos conduce
(q, λ, S ; q, zMNz) a ella a partir de S.
(q, z,z;q,λ)

(q,λ,M;q, aMa) | (q, λ, M ; q, z)


(q, a,a;q,λ)

(q, λ, M ; q, z)| (q,λ,M;q, aMa)

(q, z,z;q,λ)
(q, a,a;q,λ)
(q,λ,N;q, bNb) | (q, λ, N ; q, z)

(q, b,b;q,λ)

(q, λ, N ; q, z)
(q, z,z;q,λ)

(q, b,b;q,λ)

(q, z,z;q,λ)
(q, λ, #; f, λ)

Aceptar
S  zMNz zaMaNz  zazaNz zazabNbzzazabzbz
TALF. Tema 7 nº 14
7.4.1.3. Implementación de Analizadores LL
 Los analizadores sintácticos descendentes son lo que construyen el árbol
sintáctico de la sentencia a reconocer de una forma descendente,
comenzando por el símbolo inicial o raíz, hasta llegar a los símbolos
terminales que forman la sentencia.
 Se desea un análisis sintáctico descendente sin retroceso, por medio del uso
de gramáticas LL(k=1):
 pueden analizar sintácticamente sin retroceso, en forma descendente, examinando
en cada paso todos los símbolos procesados anteriormente y los k=1 símbolos más
a la derecha
 Para eliminar el retroceso en el análisis descendente, se ha de elegir
correctamente la producción correspondiente a cada no terminal que se
expande. Es decir que el análisis descendente ha de ser determinista, y
sólo se debe de dejar tomar una opción en la expansión de cada no terminal.
 Gramáticas LL(k)
 Son un subconjunto de las gramáticas libres de contexto. Permiten un análisis
descendente determinista (o sin retroceso), por medio del reconocimiento de la
cadena de entrada de izquierda a derecha ("Left to right") y que va tomando las
derivaciones más hacia la izquierda ("Leftmost") con sólo mirar los k tokens
situados a continuación de donde se halla.
 Por definición de gramática LL(k):
 Toda gramática LL(k) es no ambigua.
 no es recursiva a izquierdas.

TALF. Tema 7 nº 15
7.4.1.3. Implementación de Analizadores LL

 Análisis descendente sin retroceso.


 En el análisis descendente con retroceso se generan formas
sentenciales a partir del axioma dando marcha atrás en cuanto se
detecta que la forma generada no es viable, (es decir, no conduce a
ninguna sentencia del lenguaje). Este proceso de vuelta atrás es lento.
Para mejorar la eficiencia del mismo, sería muy útil saber a priori qué
alternativa del símbolo no terminal es más conveniente usar.
 Ejemplo:
 gramática
(1) S  cAd
(2) A  bcB
(3) A  a
(4) B  b
 Análisis de la sentencia cad.
 Partiendo del axioma, sólo se puede aplicar la regla 1, obteniendo la forma
sentencial cAd. Si se compara con la sentencia cad, se observa que ambas
comienzan con el caracter c. Por tanto, la subcadena Ad ha de generar el
resto de la sentencia, o sea, ad. En este instante existen dos alternativas que
se pueden emplear para modificar la forma sentencial, que corresponden a la
aplicación de las reglas 2 y 3.
 La aplicación de la regla 2 provoca la aparición del carácter b al principio de
la subcadena restante, mientras que la regla 3 provoca la aparición del
carácter a. Por tanto, como la subcadena que falta por generar para producir
la sentencia final es ad (empieza por a), puede deducirse que en este
instante la regla que debe emplearse es la regla 3, y no la 2.

TALF. Tema 7 nº 16
7.4.1.3. Implementación de Analizadores LL

 Análisis descendente sin retroceso.


 El método de análisis que hemos seguido consiste en leer la cadena de entrada
de izquierda a derecha, (L: Left to rigth) utilizando reglas de producción
izquierda (L: Left most) e inspeccionando un (1) solo símbolo de la entrada para
elegir la regla conveniente. Este análisis se denomina LL(1).
 Hay casos en los que este procedimiento no sirve.
 Supóngase, por ejemplo, que la gramatica fuese:
(1) S cAd
(2) A  aB
(3) Aa
(4) Bb
 Al analizar la tira de entrada cad, tras realizar la primera producción
obtendríamos la forma sentencial cAd, quedando como subcadena a analizar ad
(que comienza con a). Pero ahora hay dos reglas aplicables que comienzan por a
(las reglas número 2 y 3). Por tanto, no es posible decidir de forma automática
qué regla debe emplearse.
 Si se pretende que el análisis sea sin retroceso, es indispensable que la
gramática no tenga ciclos por la izquierda (no sea recursiva por la izquierda).
 No todas las gramáticas admiten un análisis descendente sin retroceso en el que
se pueda predecir la alternativa que debe usarse. En el siguiente apartado se
verá una condición necesaria y suficiente para que una gramática admita un
análisis LL(1).

TALF. Tema 7 nº 17
7.4.1.3. Implementación de Analizadores LL

 Transformación de una gramática para su análisis descendente


4.3.1. Construcción de los conjuntos PRIMERO Y SIGUIENTE
 Funciones asociadas a una gramática independiente del contexto, G que facilitan
la construcción de un analizador sintáctico predictivo.
 Defnición: Si  es una cadena de símbolos gramaticales, se llama PRIMERO()
al conjunto de símbolos terminales por los que comienzan las cadenas derivadas
de .
 Si  *, entonces  también pertenece a PRIMERO().
 Defnición: Se define SIGUIENTE(A), para el no terminal A como el conjunto de
símbolos terminales que pueden aparecer inmediatamente a la derecha de A en
alguna forma sentencial.
 Esto es, el conjunto de terminales a  T tales que haya una derivación de la
forma S*Aaβ para algunas cadenas  y β.
 En algún momento de la derivación puede haber existido símbolos entre A y a
pero derivaron en  (se anularon) y desaparecieron.
 Si A puede ser el símbolo situado más a la derecha en una forma sentencial,
entonces $SIGUIENTE(A) siendo $ el símbolo que delimita la entrada por la
derecha.

TALF. Tema 7 nº 18
7.4.1.3. Implementación de Analizadores LL

 Construcción de los conjuntos PRIMERO Y SIGUIENTE


 Cálculo de los Primeros:Para calcular PRIMERO(X) para todos los
símbolos gramaticales X, se aplican las reglas siguientes hasta que no se
puedan añadir más terminales a ningún conjunto PRIMERO.
1. Si X es un terminal, entonces PRIMERO(X) = {X}
2. Si X  entonces PRIMERO(X) = PRIMERO(X)  {}
3. Si X es un no terminal y X  Y1Y2 ……Yk
 Si existe un i tal que a  PRIMERO(Yi) y además
Y1Y2 ……Yi-1 *  esto es, si  está en PRIMERO(Y1 )….. PRIMERO(Yi-1)
entonces:
PRIMERO(X) = PRIMERO(X)  {a}
 Si  PRIMERO(Yj) para j = 1; 2;…..; k entonces:
PRIMERO(X) = PRIMERO(X)  {}
 Por ejemplo, todo los símbolos de PRIMERO(Y1) sin duda pertenecerán a
PRIMERO(X). Si Y1 no deriva a , entonces no se añade nada más a
PRIMERO(X), pero si Y1 * , entonces se añaden los elementos de
PRIMERO(Y2) y así sucesivamente.

TALF. Tema 7 nº 19
7.4.1.3. Implementación de Analizadores LL

 Se puede calcular el conjunto PRIMERO para cualquier cadena de la forma


X1X2……..Xn del siguiente modo:
 Añadir a PRIMERO(X1X2………Xn) los símbolos    a PRIMERO(X1).
 Si  PRIMERO(X1), añadir los símbolos de PRIMERO(X2).
 Si  está tanto en PRIMERO(X1) como en PRIMERO(X2), añadir
también los símbolos distintos de  de PRIMERO(X3) y así
sucesivamente.
 Por último, añadir  a PRIMERO(X1X2………Xn) si i, PRIMERO(Xi)
contiene a .
 Ejemplo:
gramática:
Primero
A  BCc | gDB A gbcda
B  bCDE |  B b
C  ca | DaB C cda
D  dD |  D d
E  gAf | c
E gc

TALF. Tema 7 nº 20
7.4.1.3. Implementación de Analizadores LL

 Cálculo de los Siguientes:para calcular SIGUIENTE(A)  A ∑N de


una gramática, aplicar las siguientes reglas hasta que no se pueda
añadir ningún elemento nuevo a ningún conjunto SIGUIENTE.
1. Incluir $ en SIGUIENTE(S), donde S es el símbolo inicial de la
gramática y $ es el delimitador de la entrada por la derecha (el
último símbolo de la entrada).
2. Si hay una producción A  Bβ (con β ≠) entonces todo los
símbolos de PRIMERO(β ) excepto  se incluyen en SIGUIENTE(B).
3. Si hay una producción de la forma A  B o bien A  Bβ con
PRIMERO(β), es decir, β* entonces todos los símbolos de
SIGUIENTE(A) se incluyen en SIGUIENTE(B).
 En la segunda regla se trata de identificar (para calcular sus
siguientes) símbolos no terminales que no aparezcan al final de las
reglas de producción, mientras que en la tercera regla se han de
localizar símbolos no terminales que estén al final de la regla de
producción, o bien estén seguidos por cadenas β que derivan en .

TALF. Tema 7 nº 21
7.4.1.3. Implementación de Analizadores LL

• Construcción de los conjuntos PRIMERO Y SIGUIENTE

 Ejemplo:
Primero Siguiente

A  BCc | gDB A gbcda $f

B  bCDE |  B b cdaf$g

C  ca | DaB C cda cdg

D  dD |  D d bgca$f

E  gAf | c E gc cdaf$g

TALF. Tema 7 nº 22
7.4.1.3. Implementación de Analizadores LL

 Condiciones LL(1)
 Símbolos directores
Ayudan a decidir qué regla utilizar en cada paso
 Construcción
 Conjunto Primero PRIM ()
 Conjunto Siguiente SIG (A)
 Regla
 DIR ( A :=  ) =
 SI λ PRIM() ENTONCES = PRIM ()– {λ}SIG(A)
 SINO = PRIM ()

TALF. Tema 7 nº 23
7.4.1.3. Implementación de Analizadores LL

 Condiciones necesarias para ser LL(1)


 No ambigua
 Factorizada por la izquierda
 No recursiva a izquierdas
 Condición necesaria y suficiente LL(1): Se dice que una
gramática cumple la condición LL(1) si para cada par de reglas
de la gramática que tengan el mismo antecedente la
intersección de sus símbolos directores es vacía. Es decir,
Si se tienen la producciones del no terminal A:
A  1 | 2|.....|n se debe cumplir que
1. PRIM(i)  PRIM(j)=  i  j i  *
2. Si λ  PIM(j) entonces
PRIM(i)  SIG(A)=  i j

TALF. Tema 7 nº 24
7.4.1.3. Implementación de Analizadores LL

 Analizador descendente predictivo dirigido por tabla


 Utiliza una tabla (tabla LL(1)) para decidir

i + i * i $ Entrada

Salida
Analizador sintáctico

$
Tabla LL(1)
(gramática LL(1))
Pila

TALF. Tema 7 nº 25
7.4.1.4. Algoritmo de análisis sintáctico LL

 Construcción de tablas LL(1)


 Las funciones Primero y Siguiente permiten rellenar siempre que sea
posible, las entradas de una tabla de análisis sintáctico predictivo para la
gramática.
 Para realizar el análisis sintáctico de una cadena generada por una
gramática LL(1) se define un procedimiento basado en el empleo de una
pila y una tabla de doble entrada. Este procedimiento consiste en asignar a
un par (símbolo leído (terminal), símbolo de pila (no terminal)) una regla de
la gramática.
 La tabla de análisis se obtiene mediante el siguiente algoritmo:
 Se define la tabla: TABLA : ∑N x [∑T {$}] [∑N  ∑T  {$}]*
 Algoritmo:
A 
 “a” terminal λ  PRIM()
TABLA[A,a]= 
fin 
Si λ  PRIM()
 “b” terminal  SIG(A)
TABLA[A,a]= λ
fin 
Fsi
fin 

TALF. Tema 7 nº 26
7.4.1.4. Algoritmo de análisis sintáctico LL

 Algoritmo:
Procedimiento Análisis_LL();
Inserta (S); // S= axioma
Leer(símbolo); // Preanálisis=símbolo
Mientras pila_no_vacía hacer
Caso cima_pila sea
´terminal´: Si cima_pila==símbolo entonces
Desapilar(símbolo);
Leer(símbolo);
sino
Error()
fsi
´No_terminal´: Si TABLA[cima_pila,símbolo] != ´error´ entonces
Desapilar(cima_pila);
Apila(TABLA[cima_pila,símbolo]);
sino
Error()
fsi
fcaso
fmientras
fprocedimiento

TALF. Tema 7 nº 27
7.4.1.4. Algoritmo de análisis sintáctico LL. Ejemplo.

1. Gramática 2. Gramática equivalente


E := E + E 1. E := TE’
E := E - E 2. E’ := +TE’
E := E * E 3. | -TE’
E := E / E 4. |λ
E := n 5. T := FT’
E := (E) 6. T’ := *FT’
7. | /FT’
3. Primeros y Siguientes 8. |λ
9. F := n
10. |(E)
PRIM SIG
4. Tabla LL(1)
E (n )$
E´ +- )$ + - * / ( ) n $

T n( +-)$ E 1 1
E´ 2 3 4 4
T´ */ +-)$
T 5 5
F n( +-*/)$
T´ 8 8 6 7 8 8
F 10 9

TALF. Tema 7 nº 28
7.4.1.4. Algoritmo de análisis sintáctico LL. Ejemplo.

 Análisis de una cadena


 Contruir una tabla con 3 columnas
 Pila
 Entrada procesada
 Salida
 Ejemplo anterior: análisis para la cadena n+n*n $

pila entrada salida


E$ n+n*n $ E := TE’
TE´$ n+n*n $ T := FT’
FT´E´$ n+n*n $ F := n
nT´E´$ n+n*n $ Emparejar(n)
T´E´$ +n*n $ T’ := λ
… … …

TALF. Tema 7 nº 29
7.4.2. Reconocimiento ascendente. Gramáticas LR(k).

• 7.4.2.1. Introducción. Concepto de analizador LR(k)

• la cadena de entrada se recorre de izquierda a derecha (Left


to Right)

• cuando una palabra es reconocida, en la cadena de


derivaciones que nos conduce a ella a partir del axioma
siempre se desarrolla el símbolo no terminal más a la
derecha (Rightmost symbol)
LR(k)
• k alude al número de símbolos dc lectura adelantada que
necesita el reconocedor para funcionar de manera
determinista

• bottom-up pues parten de la cadena de entrada e intentan


reducirla al axioma de la gramática aplicando las reglas de
producción en sentido inverso

TALF. Tema 7 nº 30
7.4.2.1. Introducción

Métodos de análisis sintáctico LR:


• Ventajas:
 Se puede construir analizadores LR para reconocer prácticamente todos los
lenguajes de programación para los que se pueden construir GIC.
 Es el método de análisis por desplazamiento y reducción sin retroceso más
general.
 Las clases de gramáticas que pueden analizarse es un supraconjunto de la
clase de gramáticas que se pueden analizar con analizadores sintácticos
predictivos.
 Puede detectar un error sintáctico tan pronto como sea posible hacerlo en un
examen de izquierda a derecha de la entrada.
• Inconvenientes:
 Demasiado trabajo realizar manualmente para una gramática de un lenguaje de programación típico, se necesita un
generador de analizadores sintácticos LR.

TALF. Tema 7 nº 31
7.4.2.2. Proceso de Análisis Sintáctico

• Continuamente mira si lo que hay en las


autómatas de pila últimas casillas de la pila concuerda con la parte
derecha de alguna de las reglas de producción
CINTA DE ENTRADA de la gramática analizada.

• Si existe concordancia, elimina de la cima de la


Cabeza de lectura
pila esa cadena y la cambia por la parte
izquierda de la regla de producción. A esta
CIMA acción se le llama reducción (reduction en la
terminología inglesa).
Indicador de stado

• Si no existe concordancia alguna, lee un


carácter más de la entrada y lo apila. A esta
acción se le suele llamar desplazamiento (shift
Mecanismo de control
PILA en la terminología inglesa).

• Si con este proceso se consigue agotar el contenido de la cinta de entrada y


en la cima de la pila queda el axioma de la gramática, la palabra es
reconocida. En otro caso no lo es.
TALF. Tema 7 nº 32
7.4.2.2. Proceso de Análisis Sintáctico.

Ejemplo: G = ({a}, {S}, S, {S ::= Sa | a})


cadena de entrada= aa

PILA ENTRADA ACCIÓN

aa$ Desplazar a

a a$ Reduce S::=a

S a$ Desplazar a

Sa $ reduce S::=Sa

S $ aceptar

TALF. Tema 7 nº 33
7.4.2.3. Analizadores LR y autómatas de pila no deterministas

1. Construir los cuatro estados del autómata: i el inicial, f el de aceptación y p


y q dos estados intermedios.
2. Se introducen las transiciones estándar para marcar la cima de la pila, para
determinar cuándo aparece en ella el axioma y para determinar cuándo
queda vacía: (i, ,; p,#), (p,,,S; q, ) y (q, ,,#; f,  ).
3. Por cada símbolo terminal a T , introducimos una transición de la forma
(p,a, ; p,a). Esta transición se corresponde con las acciones
desplazamiento
4. Por cada regla de la forma A::=  P, añadimos la transición (p,, ; p,A).
Estas transiciones se corresponden con las acciones reduce

,  ; A A  P

, ; # , S;  , #; 
i p q f
a,  ; a a T

TALF. Tema 7 nº 34
7.4.2.3. Analizadores LR y autómatas de pila no deterministas

 Ejemplo:
G = ({a, b, z}, {S, M, N}, S, {S ::= zMNz, M ::= aMa | z, N ::= bNb | z})

a,  ; a
b, ; b
z,  ; z

, S;  , #; 
, ; #
i p q f

, zMNz; S , bNb; M
, aMa;M , z;N
, z; M
TALF. Tema 7 nº 35
7.4.2.3. Analizadores LR y autómatas de pila no deterministas
estado Pila Entrada Acción indeterminación

I - zazabzbz$ Push #

p # zazabzbz$ shift z (p,a,; p,a)

*p #z azabzbz$ shift a | reduce::= M::= z | reduce N::=z

p #za zabzbz$ shift z


(p,,, z; p, M)
*p #zaz abzbz$ shift a | reduce M::= z | reduce N::=z

p #zaM abzbz$ shift a

*p #zaMa bzbz$ shift b | reduce M::= aMa


(p,,, z; p,N)
p #zM bzbz$ Shift b

p #zMb zbz$ shift z

*p #zMbz bz$ Shift z | reduce M::= z | reduce N::=z

P #zMbN bz$ Shift b

*p #zMbNb z$ Shift z | reduce N::= Bnb

P #zMN z$ Shift z

P #zMNz $ Reduce S::= zMNz | reduce M::=z | reduce N::=z

P #S $ Pop S

Q # $ Pop #

F - $ Accept

TALF. Tema 7 nº 36
7.4.2.3. Analizadores LR y autómatas de pila no deterministas

Acción Si aceptamos una cadena usando este


autómata podremos reconstruir la
Push #
secuencia de derivaciones que nos conduce
shift z a ella a partir de S. Para conseguirlo tan
sólo hay que estudiar las acciones reduce
shift a | reduce::= M::= z | reduce N::=z
en orden inverso:
shift z

shift a | reduce M::= z | reduce N::=z


z a z a b z b z
shift a

shift b | reduce M::= aMa M


Shift b
M
shift z

shift z | reduce M::= z | reduce N::=z


N
shift b N
shift z | reduce N::= bNb

shift z

Reduce S::= zMNz | reduce M::=z | reduce N::=z S


TALF. Tema 7 nº 37
7.4.2.3. Analizadores LR y autómatas de pila no deterministas

z a z a b z b z

1 M

2 M
3 N
4
N

5 S
S  zMNz zMbNbz  zMbzbz zaMabzbz azabzbz
TALF. Tema 7 nº 38
7.4.2.4. Implementación de Analizadores LR

PROBLEMAS PARA LA IMPLEMENTACIÓN

SOLUCIONES
1. AUTÓMATA NO DETERMINISTA

Explosión Combinatoria
Preanálisis(K)

2. MANEJO DE LA PILA

Reconocimiento de patrones Marcas=ER

TALF. Tema 7 nº 39
7.4.2.4. Implementación de Analizadores LR

 Ejemplo 2. G = ({x, y}, {S}, S, {S ::= xSy|xy})

x, ; x
y, ; y

, ; # , S;  , #; 
i p q f

, xSy; S
, xy;S

TALF. Tema 7 nº 40
7.4.2.4. Implementación de Analizadores LR.

Estado Pila Marca Entrada Acción

i - 0 xxxyyy$ Push #

p # 1 xxxyyy$ shift x
0=
p #x 2 xxyyy$ shift x

p #xx 2 xyyy$ shift x 1= #


p #xxx 2 yyy$ shift y

*p #xxxy 3 yy$ Reduce S::=xy


2 = #xx*
p #xxS 4 yy$ shift y
3 = #xx*y
*p #xxSy 5 y$ Reduce S::=xSy

p #xS 4 y$ shift y 4 = #xx*S


p #xSy 5 $ Reduce S::=xSy

p #S 4 $ Pop S
5 = #xx*S
q # 1 $ Pop #

f - 0 $ Accept

TALF. Tema 7 nº 41
7.4.2.4. Implementación de Analizadores LR.

Estado_Pila = Marca

Expresiones Regulares + Acciones

TABLA

SIMULADOR DEL AUTÓMATA

TALF. Tema 7 nº 42
7.4.2.5. Algoritmo de análisis sintáctico LR

ENTRADA

a1 ....... ai ...... an $

Sm-1
SALIDA
Xm-1
Programa para
.... análisis sintáctico LR
Sm

S1

X0

S0 acción ir_a
TABLA LR
PILA

Modelo de un analizador sintáctico LR

TALF. Tema 7 nº 43
7.4.2.5. Algoritmo de análisis sintáctico LR

 Modelo de un analizador sintáctico LR

 El programa conductor es el mismo para todo los analizadores


sintácticos LR, sólo cambian las tablas de un analizador a otro.

 El programa analizador lee caracteres de entrada de uno en uno, utiliza


una pila para almacenar una cadena de la forma

s0X1s1X2s2... Xmsm donde sm está en la cima de la pila.

 Cada Xi es un símbolo gramatical y cada si es un símbolo llamado estado


(o marca de la pila) que resume la información contenida debajo de él en
la pila.

 Se usan la combinación de marca en la cima de pila y el símbolo en


curso de la entrada para indexar la tabla de análisis sintáctico y
determinar la decisión de desplazamiento a reducción del analizador.

TALF. Tema 7 nº 44
7.4.2.5. Algoritmo de análisis sintáctico LR

TABLA LR
..
a1 a2 an $ A1 A2 ... An
.

0 acción0, a1 acción0, a2 acción0, an acción0,$ ir_a0, A1 ir_a0, A2 ir_a0, An

1 acción1, a1 acción1, a2 acción1, an acción1,$ ir_a1, A1 ir_a1, A2 ir_a1, An

.
.

k acciónk, a1 acciónk, a2 acciónk, an acciónk,$ ir_ak, A1 ir_ak, A2 ir_ak, An

Acción Ir_a
TALF. Tema 7 nº 45
7.4.2.5. Algoritmo de análisis sintáctico LR

 Análisis de la cadena de entrada

 Comenzará siempre introduciendo en la pila del autómata la marca


inicial, a la que se suele llamar 0. A partir de este momento, cada vez
que se introduce un símbolo en la pila, se mete a continuación un
símbolo de estado o marca. Por lo tanto, en cualquier instante, la pila
contendrá alternativamente símbolos de la gramática y marcas.

 Determina la fila m a estudiar, que vendrá siempre dada por la marca


que aparezca en la cima de la pila y la columna c dada por el símbolo en
curso de la entrada. Después consulta la entrada acción[m,c] y opera
así:

TALF. Tema 7 nº 46
7.4.2.5. Algoritmo de análisis sintáctico LR

Si Acción(m,c) es:

 aceptar entonces parar, pues la cadena de entrada pertenece al


lenguaje estudiado y el análisis sintáctico ha terminado.

 nada, entonces error, la cadena de entrada no pertenece al lenguaje


estudiado y el analizador llama a una rutina de recuperación de errores.

 desplazar i, entonces apilar el carácter actual de la entrada y después


la marca i en la cima de la pila, avanzando al siguiente símbolo de
entrada.

 reducir i entonces estudiar la i-ésima regla de producción de la


gramática. Si ésta es de la forma A::=  entonces se desapilan 2*||
símbolos, con lo que en la cima quedará una marca temporal m. A
continuación se introduce en la pila el símbolo A y se apila la marca de la
casilla ir_a[m,A].

 Si en la casilla existe más de una acción se deberían realizar todas en


paralelo, pero en la práctica este problema suele resolverse usando
métodos heurísticos.

TALF. Tema 7 nº 47
7.4.2.5. Algoritmo de análisis sintáctico LR

 Pseudocódigo del Algoritmo de análisis sintáctico LR

Una cadena de entrada w


Una gramática G = (T,, N , S, P)
Una tabla de análisis sintáctico LR para G

Analizador sintáctico

Si w está en L(G), un análisis ascendente de w,


de lo contrario se indica error

TALF. Tema 7 nº 48
7.4.2.5. Algoritmo de análisis sintáctico LR

marca := 0; push (marca); simbolo:=read(); entrada:=acción[marca,simbolo];


mientras entrada  aceptar  entrada  error hacer
si entrada= desplazar i entonces
push(simbolo); push(i); marca := i;
simbolo :=read(); /*leer el siguiente símbolo de entrada */
si no si entrada = reducir i entonces /* sea A::=  la regla nº i  P */
pop (2*||); m ::= top(); push (A); marca::= ir_a [m,A];
push(marca); /* meter el siguiente estado en la cima de la pila */
/* emitir_la_producción A::=  para ver análisis ascendente */
si no si entrada es conflictiva entonces
aplicar heurística
fin si;
entrada ::= acción [marca,simbolo];
fin mientras;
si entrada = aceptar entonces
return /*palabra reconocida*/
si no error()
fin si;

TALF. Tema 7 nº 49
7.4.2.5. Algoritmo de análisis sintáctico LR

1 S’::=S
 Ejemplo:
 G = ({x, y}, {S’, S}, S, {S’ ::= S , S ::= x S y | x y}) 2 S::=xSy
 Entrada xxyy
3 S::=xy

 Algoritmo de análisis
Pila Entrada Acción
x y $ S’ S push (0)
a := token();
0 xxyy$ Shift 2
0 Shift 2 1 REPEAT
Sea s el estado en el tope de la pila
0x2 xyy$ Shift 2 IF Acción [s, a] = dj
1 aceptar push (j)
0x2x2 yy$ Shift 3 a := token ();
2 Shift 2 Shift 3 4 ELSEIF Acción [s,a] = rk

0x2x2y3 y$ Reduce S::=xy FOR i := 1 TO Longitud (Parte


derecha de k)
3 Reduce 3 Reduce 3
pop ();
0x2S4 y$ Shift 5 p = cima ();
4 Shift 5 Sea A parte izquierda de k
0x2S4y5 $ Reduce S::=xSy push (irA [p, A])
5 Reduce 2 Reduce 2 ELSEIF Acción [s,a] = aceptar
0S1 $ aceptar Terminar con éxito
ELSE error
UNTIL true

TALF. Tema 7 nº 50
7.4.2.6. CONSTRUCCIÓN DE TABLAS LR.

Secuencias de símbolos de la pila = lenguaje regular


Marca i=ER i

Lenguaje de la pila= = i + 2 +....+ n


Ejemplo anterior: AUTOMÁTA FINITO PARA EL LENGUAJE DE LA PILA

0 = y
1 4 5
i = S S
S
2 = xx*
x y
3 = xx*y 0 2 3

4 = xx*S
5 = xx*Sy
TALF. Tema 7 nº 51
7.4.2.6. CONSTRUCCIÓN DE TABLAS LR

Gramática „ Construir un AF para el lenguaje de la pila Construir la tabla

„ gramática aumentada
• Elementos LR(0) Construcción canónica de conjuntos de elementos
• Cerradura(I)
• función ir_a

TALF. Tema 7 nº 52
7.4.2.6. CONSTRUCCIÓN DE TABLAS LR

 Definiciones previas:
 Si G es una gramática con símbolo inicial S, entonces G’, la gramática
aumentada para G, es G con un nuevo símbolo inicial S’ y la producción
S’  S. El propósito de esta nueva producción inicial es indicar al
analizador cuándo debe detener el análisis sintáctico y anunciar la
aceptación de la cadena.
 Un elemento del análisis sintáctico LR(0) de una gramática G es una
regla gramatical de G a la que se añade como información adicional un
punto que puede aparecer en cualquier lugar de la parte derecha.
 Ejemplo, para la regla S ::= xSy, los elementos LR(0) son:
S ::= xSy, S::=xSy, S::=xSy y S::=xSy.
 Las reglas de la forma A ::=  tan sólo tienen un elemento LR(0) que
se puede escribir de tres formas distintas:
 A:: = 
 A:: = 
 A ::= 

TALF. Tema 7 nº 53
7.4.2.6. CONSTRUCCIÓN DE TABLAS LR

 Función Cerradura: Si I es un conjunto de elementos LR(0) para una gramática G,


entonces Cerradura(I) es el conjunto de elementos LR(0) construido a partir de I por
las dos reglas:
1. Inicialmente, todo elemento LR(0) de I se añade a Cerradura(I).
2. Si A::=   B está en Cerradura(I) y B:: =  es una producción, entonces se
añade el elemento B:: =  a Cerradura(I), si todavía no está ahí. Se aplica esta
regla hasta que no se puedan añadir más elementos a Cerradura(I).
 Ejemplo
 Dado el estado I= {S::=AB} y el conjunto de producciones {A::=a|B, B::=b},
 Cerradura(I) = {S::=AB, A ::=a, A ::= B, B ::= b}
Al introducir el elemento A ::= B, es preciso añadir todas las B_producciones a la
Cerradura. En el caso general, es necesario repetir este proceso hasta que resulte
imposible añadir más elementos al conjunto Cerradura.

 Se define ir_a(I,X) como la cerradura del conjunto de todos los elementos [A::= X]
tales que [A::=   X ] esté en I
 Ejemplo
 Si I es el conjunto de elementos {[ S’::= S; S::= xSy; S::= xy]}
entonces ir_a(I,x) = {S::=x Sy ; S::= xSy ; S::= xy ; S::=x y}

TALF. Tema 7 nº 54
7.4.2.6. CONSTRUCCIÓN DE TABLAS LR

 Pseudocódigo del algoritmo Cerradura(I):


Entrada:
I // Estado al que calcular la Cerradura
P // Reglas de producción de la gramática
Proceso:
J:=I
Repetir
para cada elemento A:: =   B  J
para cada producción B::=  P tal que B::=   J
J := J  {B::= }
fin para
fin para
hasta que sea imposible añadir más elementos LR(0) a J
Salida: J

 Ejemplo: G= ({x,y}, {S’, S}, S’, {S’ ::=S, S ::=xSy | xy}).


Si I es el conjunto de un elemento {[S’::=S]}
entonces Cerradura(I) { S’::= S ; S::= xSy ; S::= xy}

TALF. Tema 7 nº 55
7.4.2.6. CONSTRUCCIÓN DE TABLAS LR.

 Pseudocódigo del algoritmo para construir C, colección canónica de conjuntos de elementos LR(0) para una gramática
aumentada G’

Procedure elementos (G’)


Begin
C:={cerradura({[S’::=S]})};
Repetir
Para cada conjunto de elementos I en C y cada símbolo gramatical X tal que ir_a (I,X)   y no esté en C hacer
Añadir ir_a(I,X) a C
Hasta que no se puedan añadir más conjuntos de elementos a C
end

 A partir de la Colección canónica de elementos con transiciones dadas por ir_a se construye el AF.

TALF. Tema 7 nº 56
7.4.2.6. CONSTRUCCIÓN DE TABLAS LR

 Construcción del AFD para G


 Entrada: G = (T,, N , S, P)
 Proceso:
q0 := Cerradura ({S’::=S}, P)
EM :=  // Estados marcados (estudiados)
ENM := {q0 } // Estados no marcados (no estudiados)
f := {} // Función de transición
mientras ENM  
sacar un estado T de ENM;
EM:=EM  T;
para cada A::= x  T
ir_a(T,x):= Cerradura({ A::= x   },P);
Si ir_a(T,x) (EM  ENM) entonces
ENM ::= ENM  ir_a(T,x);
fin si
f(T,x) = ir_a(T,x);
fin para
fin mientras
 Salida: A =(Q, , f, F, q0) // Q=EM; F=EM;  = T  N

TALF. Tema 7 nº 57
7.4.2.6. CONSTRUCCIÓN DE TABLAS LR. Ejemplo.

„ Ejemplo: Aplicar el algoritmo a G = ({x, y}, {S’, S}, S, {S’ ::= S , S ::= x S y | x y})
1. Estado inicial del autómata Cierre({S’::=„S) (Añadiendo al estado todos los elementos LR(0) iniciales de todas las S_producciones de la gramática.)

2. Dado que en este estado el punto de los elementos LR(0) está a la izquierda del símbolo S y del símbolo x, son posibles dos
0 transiciones etiquetadas con estos caracteres. La primera nos conduce hacia un estado etiquetado con S’::= S . La segunda
inicialmente nos conduciría hacia un estado etiquetado con los elementos {S::=xSy, S::=x . En esta situación, el punto ha
S' ::= „S quedado a la izquierda del símbolo no terminal S por lo que siguiendo los pasos del algoritmo deberíamos añadir a este estado los
S ::= xSy elementos LR(0) iniciales de todas las S-producciones .
S ::= xy

0
1
S' ::= S S
S’ ::= S
S ::=
xSy
S ::= xy
x
2

S ::=x Sy
S ::=x y
S ::= xSy
S ::= xy

TALF. Tema 7 nº 58
7.4.2.6. CONSTRUCCIÓN DE TABLAS LR

3. Si se continúa el estado 2 y todos los que a partir de éste aparezcan, se


obtiene el siguiente autómata completo para el lenguaje de la pila:

0 1
S' ::= S S
S’ ::= S
S::= xSy
S ::= xy
4 5
x y
S ::=xSy S::=xSy
2 S 
S ::=x Sy 3
S ::=x y y S ::= xy
S ::= xSy
S ::= xy

TALF. Tema 7 nº 59
7.4.2.6. CONSTRUCCIÓN DE TABLAS LR

GRAMATICA AMPLIADA G’ AFD TABLA LR


 Algoritmo para la construcción de la tabla LR
 Entrada: Una gramática aumentada G’.
 Salida: Las funciones acción e ir_a de la tabla de análisis sintáctico LR para G’.
 Proceso:
1. Construir el AFD para las palabras de la pila.
2. Los números de los estados del AFD constituirán las marcas o estados de la pila, cualquier numeración que realicemos será válida.
3. Las acciones de análisis sintáctico para el estado i se determinan como sigue:
3.1. Si [A::=  a] está en i y f (i ,a)=j , entonces acción[i,a]= “desplazar j”, a ∑T.

a
Por cada transición de la forma i j a  T añadir a acción (i,,j )= shift j

3.2. Si [A::= ] está en en i ,distinto de S’::=S  , entonces acción[i,a]=“reducir k”  a  SIG(A) siendo k el número de la regla A::= en el conjunto de
reglas de producción.
3.3. Si [S’::=S ] está en i , entonces acción[i,$]= “aceptar”.
4. Las transiciones ir_a para el estado i se construyen  A∑N utilizando la regla:
Si f(i ,A)= j , entonces ir_a[ i , A ]= j.
A
Por cada ransición de la forma i j A  N asignamos a la entrada ir_a(i,A) el valor j

5. Todas las entradas no definidas por las reglas 2 y 3 son consideradas “error”.
6. El estado inicial del analizador es el estado inicial del AFD, que contiene [S’::= S ].

TALF. Tema 7 nº 60
7.4.2.6. CONSTRUCCIÓN DE TABLAS LR

En cada paso se añade nuevas acciones

CONFLICTOS

desplazar i / reducir j (d/r) reducir i / reducir j (r/r)

LA GRAMÁTICA NO ES LR

INTENTAR TODAS LAS OPCIONES POSIBLES


CONFLICTOS
APLICAR REGLAS HEURÍSTICAS

„ Si acción[i,a] = desplazar i / reducir j se consulta la entrada, y si el „ Si acción[i,a] = reducir i / reducir j, se reduce la regla a la que se haya
carácter que aparece es a entonces se lleva a cabo la acción desplazar i. En asignado un número más bajo. Esto es, si i < j se reduce la regla número i, en

otro caso se opta por reducir. otro caso la regla número j.

TALF. Tema 7 nº 61
7.4.2.6. CONSTRUCCIÓN DE TABLAS LR

gramáticas independientes del contexto

Gramáticas LR libres de conflictos

Analizadores LR(0)
método LR(0)

solución
problema reducción de una regla como A::= tan sólo cuando el carácter
que se encuentra en la cinta de entrada pertenezca al conjunto
conflictos d/r siguiente (A).

TALF. Tema 7 nº 62
7.4.2.6. CONSTRUCCIÓN DE TABLAS LR

 Ejemplo: G = ({x, y}, {S’, S}, S, {S’ ::= S , S ::= x S y | x y})

0 1
S' ::= S
S S’ ::= S x y $ S’ S
S::=xS
y
0 Shift2 1
S ::=
xy 4 5
1 S’::=S 1 aceptar
x y
S S::=xSy
2 :=xSy 2 S::=xSy 2 Shift2 Shift3 4
S

S ::=x Sy 3 3 S::=xy 3 Reduce3 Reduce3


S ::=x y
S ::= xSy y
S ::= xy 4 Shift5
S ::= xy

5 Reduce2 Reduce2

TALF. Tema 7 nº 63
7.4.2.6. CONSTRUCCIÓN DE TABLAS LR

 Ejemplo: i e a $ S’ S
Construir el autómata para reconocer la sentencia if-then-else
sent :: = if exp then sent else sent 0 Shiift 2 Shiift 3 1
| if exp then sent
| otra_sent
1 aceptar
De forma reducida G = ({i, e, a}, {S’,S}, {S’::=S,S::= iSeS | iS | a})
2 Shiift 2 Shiift 3 4
1 S’::=S
0
1 2 S::=iSeS 3 Reduce 4 Reduce 4

S 3 S::=iS
S' ::= S S’ ::= S 4 Shiift 5 Reduce 3
S ::=  iSeS 4 S::= a
Reduce 3
S ::=  iS
S ::= a 5 Shiift 2 Shiift 3 6

i 2 6 Reduce 2 Reduce 2
4
a
S ::= iSeS S
S ::= iS S ::=iS eS S ::=iS
3 a S ::= iSeS i 
S ::= iS
S ::= a
S ::= a
e
CONFLICTO S/R
i
a S ::= iSeS S ::=
iSeS 5
S ::= iS
6 S ::= a
S ::=iSeS S

TALF. Tema 7 nº 64
7.4.2.6. CONSTRUCCIÓN DE TABLAS LR
 Ejemplo: analizar la traza del autómata guiado por la tabla de la gramática de if-then-else para la cadena de entrada iiaeaea$. Esta cadena se corresponde con la sentencia:
if exp then
if exp then
sent
else • La identación recoge el anidamiento deseado para esta sentencia pero no
sent siempre corresponde con el que realiza el analizador.
else
sent

Pila Entrada Acción


Pila Entrada Acción
0 iiaeaea$ Shift 2

0i2 iaeaea$ Shift 2 0 iiaeaea$ Shift 2


0i2i2 aeaea$ Shift 3
0i2 iaeaea$ Shift 2
0i2i2a3 eaea$ Reduce S::=a

0i2i2S4 eaea$ Shift 5 / Reduce S::=iS


0i2i2 aeaea$ Shift 3
0i2i2S4e5 aea$ Shift 3

0i2i2S4e5a3 ea$ 0i2i2a3 eaea$ Reduce S::=a


Reduce S::=a

0i2i2S4e5S6 ea$ Reduce S::=iSeS eaea$


0i2i2S4 Shift 5 / Reduce S::=iS
0i2S4 ea$ Shift 5 / Reduce S::=iS

0i2S4e5 a$ Shift 2 0i2S4 eaea$ Shift 5 / Reduce S::=iS


0i2S4e5a3 $ Reduce S::=iSeS
0S1 eaea$
0S1 $ aceptar
error

TALF. Tema 7 nº 65
7.4.2.6. CONSTRUCCIÓN DE TABLAS LR

 Ejemplo: obtener un analizador para listas de elementos que pueden estar vacías.
La estructura sintáctica es: Lista::= lista elemento | 
 G = ({i}, {S’, S }, S’, {S’ ::= S, S::=Si | })
0 1 2
S i
S' ::= S S' ::= S’ ::= S S' ::= S’ ::= Si
Si S' ::=  Si

S::=  Elemento LR(0) =S::= • Reducción con la marca 0


Traza con iii$
Pila Entrada Acción

TABLA LR(0) 0 iii$ Reduce S::=

0S1 iii$ Shift 2


i $ S’ S
0S1i2 Ii$ Reduce S::=Si
1 S’::=S 0 Reduce 3 Reduce 3 1 ii$
0S1 Shift 2

2 S::=Si 1 Shiift 2 aceptar 0S1i2 i$ Reduce S::=Si

0S1 i$ Shift 2
3 S::= 2 Reduce 2 Reduce 2
0S1i2 $ Reduce S::=Si

0S1 $ aceptar

TALF. Tema 7 nº 66
7.4.2.6. CONSTRUCCIÓN DE TABLAS LR

 Ejemplo: la misma gramática anterior pero con recursividad por la 0 1


dercha S
S' ::= S S’ ::= S 3
 G = ({i}, {S’, S }, S’, {S’ ::= S, S::=iS | }) S ::= iS
S ::=  S ::= iS
S
2
i
S ::= iS i
Pila Entrada Acción S ::= iS
S ::= 
0 iii$ Shift 2

0i2 ii$ Shift 2 i $ S’ S

0i2i2 i$ Shift 2 0 Shiift 2/ Reduce 3 Reduce 3 1

0i2i2i2 $ Reduce S::= λ

0i2i2i2S3 $ Reduce S::=iS 1 aceptar

0i2i2S3 $ Reduce S::=iS 2 Shiift 2/ Reduce 3 Reduce 3 3

0i2S3 $ Reduce S::=iS


0S1 $ 3 Reduce 2 Reduce 2
aceptar

TALF. Tema 7 nº 67

También podría gustarte