Вы находитесь на странице: 1из 20

Anlisis sintctico (Look ahead LR)

Anlisis Sintctico LR

Este tipo de anlisis se puede realizar mediante 3 tcnicas: LR(k): Leen la entrada de izquierda a derecha (Left to rigth). SLR(1): Mejora el LR(1) pero hace uso de la bsqueda hacia delante. LALR(1): Ms potente que SLR(1) y ms sencillo que LR(1).

Anlisis Sintctico LALR Conceptos


Significa lookahead LR Esta tcnica generalmente se usa en la practica. Este es un anlisis sintctico de bsqueda hacia adelante. Esta tcnica es mas larga de realizar, pero tambin es la mas efectiva. Es una tcnica intermedia entre SLR(1) y LR(k). Aqu bsicamente lo que se hace la unin de los conjuntos de elementos que tengan elementos comunes en sus goto(Ui, ), y que nicamente vare la parte del lookahead de cada conjunto.

Anlisis Sintctico LALR Algoritmo ENCONTRANDO FIRS Y FOLLOW


Simbolo Si x es terminal
Si x ->e X -> YZW Simbolo Si x -> YM

First/Primero F(x) ={x}


Anadir e al F(x) Anadir F(U) al F(x) Follow/Look a head 1. F(Y) =F(M) 2. Si el F(M) contiene e entonces aadir el first(X) al F(Y) Anadir el F(x) al F(Y)

Si x es simbolo inicial F(x) {$}

Si x -> Y

Anlisis Sintctico LALR Algoritmo Por ejemplo si tenemos dos conjuntos Ui y Uj


Ui = X->Y Z {a} Uj = X->Y Z {b}

Podemos hacer la unin de sus lookahead , creando as un conjunto Uij, as:

Ui = X->Y Z {a} Uj = X->Y Z {b}


Uij = X->Y Z {a,b}

Anlisis Sintctico LALR Algoritmo


Entrada: Gramtica aumentada G Mtodo:
Construir la coleccin de conjuntos de elementos LR(1). Para cada conjunto en LR(1), encontrar todos los conjuntos con los mismos elementos y sustituir todos por su unin de lookahead. Construir las acciones de anlisis sintctico para cada nuevo estado (accin e ir_a iguales que el algoritmo de LR Cannico).

Anlisis Sintctico LALR Ejemplo


Construiremos las transiciones de la siguiente gramtica: (1)S A (2)S xb (3)A aAb (4)A B (5)B x Necesitaremos aumentarla, asi: (0)S S$ (1)S A (2)S xb (3)A aAb (4)A B (5)B x

Anlisis Sintctico LALR Ejemplo


Haciendo las transiciones (siguiendo la plantilla del mtodo LR) , hacemos los goto de nuestros conjuntos: Para empezar nuestro So:
Lookahead

1. 2. 3. 4. 5. 6.

S -> S {$} S -> A {$} S -> xb {$} A -> aAb {$} A -> B {$} B -> x {$}

Ahora hacemos los goto(Si, ), donde Si es el conjunto que vamos a crear y es el terminal o no terminal a donde vamos a movernos; copiando sus lookahead de la produccin padre.
(0)S S (1)S A (2)S xb (3)A aAb (4)A B (5)B x

Creando Goto
S1: Goto (So, S):
S -> S {$}

S4: Goto (So, x) S -> x b A ->x {$} {$}

S2: Goto (So, A) S -> A {$}


S3: Goto (So, B) A -> B {$} S5: Goto(So, a) S5:Goto(S0, a) A -> a Ab {$} A -> aAb {$} A -> B {$} B -> x {$}

Anlisis Sintctico LALR Ejemplo


S1:Goto(S0,S) S -> S {$} S2:Goto(S0, A) S -> A {$} S4:Goto (S0, x) S -> x b {$} A -> x {$} S5:Goto(S0, a) A -> a Ab {$} A -> aAb {$} A -> B {$} A -> x {$}
Tendremos en cuenta que cuando movemos el con un No terminal y este es el ultimo elemento este pasa a ser un kernel.

S3:Goto (S0, B) A -> B {$}

Anlisis Sintctico LALR Ejemplo


S13:Goto (S4,b) S -> xb S6:Goto (S5,A): A -> a Ab A -> aAb A-> B B -> x S7:Goto (S5,a) Goto(S7,a): A -> a Ab A -> aAb A -> B B -> x {$} {$} {b} {b} {b} {b} {b} {b} {b} S8:Goto (S5,B)(Goto S7,B) A -> B {$} S9:Goto (S5,x) Goto(S7,x): B -> x {$}

Anlisis Sintctico LALR Ejemplo


S10:Goto (S6,b) S -> xb {$}

S11:Goto (S7,A) S -> aAb S12:Goto (S11,b) S -> aAb

{b}

{$}

S1

S -> S {$} S

S3

S10 A -> B {$} S -> A {$} S2 S6 b A -> aA b {$} A a x x B S8 S9 B -> x {b}

A -> aAb {$}

S0

B
S -> S {$} S -> A {$} S -> xb {$} A -> aAb {$} A -> B {$} B -> x {$} x A

S5

S7
A -> a Ab {b} A -> aAb {b} A-> B {b} B -> x {b} a B S11 A -> aA b {b} A

A -> a Ab {$} A -> aAb {b} A-> B {b} B -> x {b}

S4 b

S13

A -> B {b}

S -> xb {$} B -> x {$}

S -> xb {$}

S12 A -> aAb {b}

Ahora trataremos de unir todos los conjuntos que tengan elementos en comn y tambin uniendo sus lookahead. Con estos Conjuntos: S3 con S8 S5 con S7 Nota: al unir estos S6 con S11 conjuntos tenemos que unir tambin sus S10 con S12

transiciones.

Teniendo
S3={AB S8={AB {$}} {b}

Pasaremos a:
S3_8={AB {$,b}

Y as con todos los dems..

S1

S -> S {$} S

S3_8

A -> B {b,$} S2 B

S10_12 b

A -> aAb {$,b}

S0

B
S -> S {$} S -> A {$} S -> xb {$} A -> aAb {$} A -> B {$} B -> x {$} x A

S -> A {$}

S5_7

S6_11

A
A -> a Ab {$,b} A -> aAb {b} A-> B {b} B -> x {b} x

A -> aA b {$, b}

S9
B -> x {b}

S4 b

S13 S -> xb {$}

S -> xb {$} B -> x {$}

Construccin de la Tabla de AS
1. Construir la coleccin de conjuntos de elementos. 2. Ui es el estado i. Las acciones se determinan:
1.

2.
3.

Si A -> a est en Ui e ir_a(Ui, a) = Uj entonces desplazar j en accin[i, a]. Si A -> est en Ui entonces reducir A -> en accin [i, a] para toda a en Look a head(A). Si S -> S est en Ui entonces aceptar en accin[i,$].

3. Si ir_a(Ui, A) = Uj, entonces ir_a(i, A) = j 4. Todas las entradas no definidas por 2 y 3 son error. 5. El estado inicial del analizador es el que contiene [S -> S]

Evaluar Cadena Estados Si a

Construccin de Tabla de AS
Terminales x b $ S S 1 Acepta r1 r4 d13 d5_7 d10_12 r5 r3 r3 r2 d9 r4 r5 6_11 A 2 B d5_7 d4

No terminales

0 1 2 3_8 4 5_7 6_11 9 10_12 13

3_8

3_8

Los Goto son desplazar y los kernel son reducir

Evaluar una cadena de entrada.


Cadena de entrada: aaxbb Para iniciar en nuestra pila tenemos 0 y a la par tenemos nuestra cadena de entrada. Vamos evaluando (0,a)=S5_7, movemos a la pila a, seguido de 5_7
Pila 0 0a5_7 Entrada aaxbb$ axbb$ Tabla LALR (0,a) = S5_7 (5_7,a)= S5_7
(0)S S$ (1)S A (2)S xb (3)A aAb (4)A B (5)B x

Cuando encontramos un ri en la tabla, nos vamos al numero de produccin que lo produjo y reemplazamos la produccin por el no terminal.

Pila
0

Entrada aaxbb$ axbb$ xbb%$ bb$

Tabla LALR
(0,a)= S5_7 (5_7,a)= S5_7 (5_7,x)= S9 (9,b) = r5 -> B -> x (5_7,B) = 3_8

0a5_7a5_7 0a5_7 0a5_7a5_7x9 0a5_7a5_7B 0a5_7a5_7B3_8 0a5_7a5_7A 0a5_7a5_7A6_11 0a5_7A 0a5_7A6_11 0a5_7A6_11b10_12 0A 0A2 0S 0S1

bb$ bb$ bb$ bb$


b$ b$ $

Ver Tabla

(3_8,b) = r4 -> A -> B


(5_7,A)= 6_11 (6_11,b) =S10_12 (10_12,b)=r3 -> A -> aAb (5_7, A)= 6_11 (6_11,b)=S10_12 (10_12,$)=r3-> A->aAb (0,A)=2

0a5_7a5_7A6_11b10_12 b$

(0)S S$ (1)S A (2)S xb (3)A aAb (4)A B (5)B x

$ $
$ $

(2,$)=r1 -> S->A (0,S)=1 (1,$)= ACEPTADA

*Si la casilla esta vacia es error

Cadena Aceptada
FIN

Вам также может понравиться