Construcción de GOTO y la tabla de SLR:

Anuncio
Construcción de GOTO y la tabla de SLR:
En este apartado se describe un método de marcación de los estados de SLR que es mas apropiado que
‘ejecutarse’ a mano. El método salvo la notación es equivalente al método de la teoría. Al utilizar
notación distinta se intenta hacer la construcción de la tabla ‘a mano’ más fácil.
No se recomienda imprimir estas paginas.
Suponemos que la gramática es la misma como del ejemplo del LL1.
Empezamos con estado 0. Lo marcamos como superíndice antes del S:
S'->
S ->
A ->
A ->
B ->
B ->
C ->
C ->
0
S
A
p
a
q
b
r
c
B
C
A
b
B
c
C
d
Producimos la cerradura, marcando todos los principios de clausuras que empiezan con los símbolos no
terminales ante los que esta la marca actual (0). En el caso - hemos puesto marca ante de S. Marcamos el
principio de la única producción de S: S -> ABC.
S'->
S ->
A ->
A ->
B ->
B ->
C ->
C ->
0
0
S
A
p
a
q
b
r
c
B
C
A
b
B
c
C
d
Hemos puesto la marca ante otro símbolo no terminal A. Marcamos el principio de todas las clausuras
A -> ... .
S'->
S ->
A ->
A ->
B ->
B ->
C ->
C ->
0
0
0
0
S
A
p
a
q
b
r
c
B
C
A
b
B
c
C
d
No hay mas símbolos no terminales antes quienes hemos puesto la marca (0). Por lo tanto la cerradura
esta terminada.
Se elige una posición donde existe una marca a la izquierda de un símbolo (terminal o no), pero
no existe una marca correspondiente a la derecha del este símbolo. Marcamos este punto y todos los
puntos que propagan desde el estado elegido traspasando el mismo símbolo con el siguiente número
disponible. Si elegimos por ejemplo el (único) estado 0 y el símbolo ‘a’ de A->aAb produciendo estado 1
obtenemos:
S'->
0 S
S ->
0 A
A ->
0 p
A ->
0 a
B ->
q
B ->
b
C ->
r
C ->
c
Escribimos aparte GOTO(0,a)->1
1
B
C
A
b
B
c
C
d
B
C
A
b
B
c
C
d
Cerradura:
S'->
S ->
A ->
A ->
B ->
B ->
C ->
C ->
0
0
1,0
1,0
S
A
p
a
q
b
r
c
1
Sigamos con el terminal a de A->a A b y estado 1, produciendo estado x.
S'->
S ->
A ->
A ->
B ->
B ->
C ->
C ->
0
0
1,0
1,0
S
A
p
a
q
b
r
c
x,1
B
C
A
b
B
c
C
d
B
C
A
b
B
c
C
d
Cerradura:
S'->
S ->
A ->
A ->
B ->
B ->
C ->
C ->
0
0
x,1,0
x,1,0
S
A
p
a
q
b
r
c
x,1
Se observa que el estado x coincide con el estado 1. Eliminamos las cerraduras de x (donde x aparece en
primera posición de cada clausura) y marcamos el resto de x con 1. (el punto señala omisión de estado).
S'->
S ->
A ->
A ->
B ->
B ->
C ->
C ->
------GOTO(1,a)=1
0
0
1,0
1,0
S
A
p
a
q
b
r
c
1.1
B
C
A
b
B
c
C
d
Sigamos con estado 1 y el A de A-> a A b, produciendo estado 2. La cerradura no hace nada.
S'->
S ->
A ->
A ->
B ->
B ->
C ->
C ->
------GOTO(1,A)=2
0
0
1,0
1,0
S
A
p
a
q
b
r
c
B
1.1
A
C
2
b
B
c
C
d
Notar, que los estados con punto no propagan (tal como existe una copia).
Seguimos:
S'->
S ->
A ->
A ->
B ->
B ->
C ->
C ->
------GOTO(0,p)=3
0
0
1,0
1,0
S
A
p
a
q
b
r
c
B
3
1.1
A
C
2
b
B
c
C
d
Hemos llegado hasta el final de una clausura. En este punto se reduce la producción A->p, es decir, se
sustituye p por A. Para reducir correctamente es necesario reducir A->p sólo si el símbolo siguiente puede
seguir A en el flujo de entrada.
Entonces se reduce A->q sólo si el token esta en el FOLLOW(A). El A puede ser seguido sólo por b y p.
Por lo tanto: REDUCE(3,b)=(A->p), REDUCE(3,p)=(A->p).
S'->
S ->
A ->
A ->
B ->
B ->
C ->
C ->
------GOTO(1,p)=3
0
0
1,0
1,0
S
A
p
a
q
b
r
c
B
3.3
1.1
S'->
0 S
S ->
0 A
A ->
1,0 p
3.3
A ->
1,0 a
1.1
B ->
q
B ->
b
C ->
r
C ->
c
------GOTO(2,b)=4; REDUCE(4,{b,q})= A->aAb
A
C
2
b
B
c
C
d
B
C
A
2
b
B
c
C
d
4
S'->
S ->
A ->
A ->
B ->
B ->
C ->
C ->
------GOTO(0,A)=5
0
0
1,0
1,0
5
5
S
A
p
a
q
b
r
c
S'->
0
S ->
0
A ->
1,0
A ->
1,0
B ->
6,5
B ->
6,5
C ->
C ->
------GOTO(5,b)=6; GOTO(6,b)=6
S
A
p
a
q
b
r
c
S'->
S ->
A ->
A ->
B ->
B ->
C ->
C ->
------GOTO(6,B)=7
S
A
p
a
q
b
r
c
0
0
1,0
1,0
6,5
6,5
5
3.3
1.1
B
A
C
2
b
B
c
C
d
5
3.3
1.1
B
C
6.6
B
c
C
d
5
3.3
1.1
B
C
A
2
b
6.6
B
7
c
A
2
C
b
4
4
d
S'->
0 S
S ->
0 A
5 B
C
A ->
1,0 p
3.3
A ->
1,0 a
1.1 A
2 b
B ->
6,5 q
8.8
B ->
6,5 b
6.6 B
7 c
C ->
r
C ->
c
C
d
------GOTO({5,6},q)=8; REDUCE(8,FOLLOW(B))=REDUCE(8,{c,r})=B->q
S'->
0 S
S ->
0 A
5 B
A ->
1,0 p
3.3
A ->
1,0 a
1.1 A
B ->
6,5 q
8.8
B ->
6,5 b
6.6 B
C ->
r
C ->
c
C
------GOTO(7,b)=9; REDUCE(9,FOLLOW(B))=B->bBc
4
4
C
2
b
4
7
c
9
d
S'->
S ->
A ->
A ->
B ->
B ->
C ->
C ->
------GOTO(5,B)=10;
0
0
1,0
1,0
6,5
6,5
10
10
S
A
p
a
q
b
r
c
S'->
0 S
S ->
0 A
A ->
1,0 p
A ->
1,0 a
B ->
6,5 q
B ->
6,5 b
C ->
11,10 r
C ->
11,10 c
------GOTO(10,c)=11; GOTO(11,c)=11
S'->
S ->
A ->
A ->
B ->
B ->
C ->
C ->
------GOTO(11,C)=12
0
0
1,0
1,0
6,5
6,5
11,10
11,10
S
A
p
a
q
b
r
c
5
3.3
1.1
8.8
6.6
B
10
C
A
2
b
4
B
7
c
9
C
d
5
3.3
1.1
8.8
6.6
B
10
C
A
2
b
4
B
7
c
9
11.11
C
5
3.3
1.1
8.8
6.6
B
10
C
A
2
b
4
B
7
c
9
11.11
C
12
d
d
S'->
0 S
S ->
0 A
5 B
10 C
A ->
1,0 p
3.3
A ->
1,0 a
1.1 A
2 b
4
B ->
6,5 q
8.8
B ->
6,5 b
6.6 B
7 c
9
C ->
11,10 r
13.13
C ->
11,10 c
11.11 C
12 d
------GOTO({10,11}, r)=13; REDUCE(13,FOLLOW(C))= REDUCE(13,{d,$})=C->r
S'->
0 S
S ->
0 A
5 B
A ->
1,0 p
3.3
A ->
1,0 a
1.1 A
B ->
6,5 q
8.8
B ->
6,5 b
6.6 B
C ->
11,10 r
13.13
C ->
11,10 c
11.11 C
------GOTO(12,d)=14; REDUCE(14,{d,$})= C->cCd
10
C
2
b
4
7
c
9
12
d
14
S'->
0 S
S ->
0 A
5 B
10 C
A ->
1,0 p
3.3
A ->
1,0 a
1.1 A
2 b
B ->
6,5 q
8.8
B ->
6,5 b
6.6 B
7 c
C ->
11,10 r
12.12
C ->
11,10 c
11.11 C
12 d
------GOTO(10,C)=15; REDUCE(15,FOLLOW(S))=REDUCE(15,$)=S->ABC
15
4
9
14
S'->
0 S
16
S ->
0 A
5 B
10 C
15
A ->
1,0 p
3.3
A ->
1,0 a
1.1 A
2 b
4
B ->
6,5 q
8.8
B ->
6,5 b
6.6 B
7 c
9
C ->
11,10 r
12.12
C ->
11,10 c
11.11 C
12 d
14
------GOTO(15,S)=16; REDUCE(16,FOLLOW(S))=REDUCE(16,$)=(S’==ACCEPT)
Adjuntamos todos los GOTOs y REDUCE que hemos producido en la tabla del analizador.
S A B C a p b Q c r
0 16 5
1 3
1
2
1 3
2
4
3
R R
4
R R
5
10
6 8
6
7
6 8
7
9
8
R R
9
R R
10
15
11 13
11
12
11 13
12
13
14
15
16
d
$
Clausura
A->p
A->aAb
B->q
B->bBc
14
R R C->r
R R C->cCd
R S->ABC
OK S’->S
Alternativamente se puede rellenar la tabla después de todo el proceso arriba. Se pueden calcular
FOLLOW después de rellenar la tabla, etc.
Descargar