Generación de analizador sintáctico ascendente

Anuncio
Generación de analizador sintáctico
ascendente
Yacc (bison, . . . )
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.1
Reconocedor de avance-reducción
Planteamiento clásico, originado por limitaciones de
memoria y velocidad, hoy en parte superadas:
Lectura del texto fuente de izquierda a derecha
Ascendente [bottom-up]: construcción del árbol
sintáctico de “abajo arriba” (hacia la raíz,
correspondiente al símbolo principal)
Avance-reducción [shift-reduce]:
• La decisión de reducir (y la regla a aplicar) se
toma en cuanto se acaba de reconocer la parte
derecha (pivote [handle])
• Limitado tamaño de la ventana [lookahead] de
contexto derecho usada en la decisión
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.2
Ejemplo de avance-reducción
S
B
A b
a
c
E
d
F
D
Entrada = abcdef
Pila vacía
C
e f
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.3
Ejemplo de avance-reducción
S
B
A b
a
c
E
d
F
D
Avanza
Pila = a
C
e f
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.3
Ejemplo de avance-reducción
S
B
A b
a
c
E
d
F
D
Reduce A→a
Pila = A
C
e f
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.3
Ejemplo de avance-reducción
S
B
A b
a
c
E
d
F
D
Avanza
Pila = Ab
C
e f
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.3
Ejemplo de avance-reducción
S
B
A b
a
c
E
d
F
D
Reduce B→Ab
Pila = B
C
e f
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.3
Ejemplo de avance-reducción
S
B
A b
a
c
E
d
F
D
Avanza
Pila = Bc
C
e f
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.3
Ejemplo de avance-reducción
S
B
A b
a
c
E
d
F
D
Avanza
Pila = Bcd
C
e f
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.3
Ejemplo de avance-reducción
S
B
A b
a
c
E
d
F
D
C
Avanza.
Pila = Bcde
(Secuencia de prefijos de
partes derechas)
e f
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.3
Ejemplo de avance-reducción
S
B
A b
a
c
E
d
F
D
Avanza
Pila = Bcdef
C
e f
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.3
Ejemplo de avance-reducción
S
B
A b
a
c
E
d
F
D
Reduce C→ef
Pila = BcdC
C
e f
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.3
Ejemplo de avance-reducción
S
B
A b
a
c
E
d
F
D
Reduce D→C
Pila = BcdD
C
e f
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.3
Ejemplo de avance-reducción
S
B
A b
a
c
E
d
F
D
Reduce E→dD
Pila = BcE
C
e f
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.3
Ejemplo de avance-reducción
S
B
A b
a
c
E
d
F
D
C
Reduce F→ε
Pila = BcEF
(Pila crece sin consumir
entrada)
e f
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.3
Ejemplo de avance-reducción
S
B
A b
a
c
E
d
F
D
Reduce S→BcEF
Pila = S
(Fin del reconocimiento)
C
e f
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.3
Implicaciones del avance-reducción
Reducciones en orden inverso de derivación derecha
[rightmost]
Las secuencias de símbolos ya cubiertos (pero no
reducidos):
son el “frente de avance” en la construcción
(virtual) del árbol,
son prefijos de forma sentencial derecha (prefijos
viables)
evolucionan como pila LIFO (todo prefijo de p.v.
es p.v.), y
componen globalmente un lenguaje regular
por tanto, podemos construir un AFD, llamado
autómata LR
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.4
Subárbol restante
Normalmente existirán múltiples subárboles restantes compatibles con
pila+ventana. Conforme se avanza se contruye el único correcto.
α1
α2
Pila = α1 · · · αm α
Resto entrada = y
Ventana = k : y
αm
α
?
top k : y
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.5
Subárbol restante
Normalmente existirán múltiples subárboles restantes compatibles con
pila+ventana. Conforme se avanza se contruye el único correcto.
S
α1 A 1 β 1
α2 A 2 β 2
Pila = α1 · · · αm α
Resto entrada = y = xxm · · · x1
Ventana = k : y
Am−1
αm A m β m
α
top
β
x
xm
x2
x1
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.5
Subárbol restante
Los posibles árboles restantes sólo dependen de la pila,
no de la sección de la entrada que ésta deriva.
S
α1 A 1 β 1
α2 A 2 β 2
Pila = α1 · · · αm α
Resto entrada = y
Ventana = k : y
Am−1
αm A m β m
α
top
β
x
xm
x2
x1
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.5
Ejemplo de AFD LR con k = 1
$-)
3
r2
T
(
ac:
T
S’→S
S
4
r1:
S→S-T
r2:
S→T
r3:
T→(S)
)
9
$-)
r3
(
(
a
1
-
a
a
5
r4:
7
T→a
S
6
T
8
$-)
r1
$-)
-
r4
2
$
ac
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.6
Reconocimiento con autómata LR
Gramática LR(k): si, usando ventana de k simbolos,
siempre es posible decidir
El autómata LR “lee” la pila y llega a un estado
“actual”
La acción de avance-reducción se decide en base al
estado actual y k terminales siguientes
Por construcción, a cada estado le corresponde un
único símbolo entrante
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.7
Ejemplo de tabla LR
$
-
1
2
3
)
4
ac
r2
r2
r4
6
T
5
2
3
5
5
6
9
8
r1
r1
r1
9
r3
r3
r3
AFD y gramática
long.
sı́mb.
r1
3
S
7
r2
1
S
r3
3
T
r4
1
T
3
r4
4
7
S
r2
4
r4
a
6
4
5
(
8
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.8
Utilización de la tabla LR
Para evitar repetir ineficientemente la lectura de la
pila, en lugar de pila de símbolos se utiliza pila de
estados
Toda transición implica empilar el nuevo estado
Terminales: se lee nuevo símbolo (avance)
Reducción:
1. Se desempilan tantos estados como símbolos
tiene la parte derecha de la regla
2. Se realiza transición desde el estado que resulta
en la cima con el símbolo no terminal de la parte
izquierda de la regla
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.9
Ejemplo de reconocimiento LR
$
-
1
S 2
(
4
ac
a S T
5 2 3
6
T 3 (1,S) (1,S)
( 4
(1,S)
4
a 5 (1,T) (1,T)
- 6
S 7
)
5 7 3
(1,T)
4
6
5
8
9
T 8 (3,S) (3,S)
(3,S)
) 9 (3,T) (3,T)
(3,T)
AFD y gramática
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.10
Ejemplo de reconocimiento LR
$
-
1
S 2
(
4
ac
a S T Pila
1
Resto entrada Decisión
a-(a-a)$
5 2 3
6
T 3 (1,S) (1,S)
( 4
(1,S)
4
a 5 (1,T) (1,T)
- 6
S 7
)
5 7 3
(1,T)
4
6
5
8
9
T 8 (3,S) (3,S)
(3,S)
) 9 (3,T) (3,T)
(3,T)
AFD y gramática
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.10
Ejemplo de reconocimiento LR
$
-
1
S 2
(
4
ac
a S T Pila
1
5 2 3 15
Resto entrada Decisión
a-(a-a)$ Avanzar
-(a-a)$
6
T 3 (1,S) (1,S)
( 4
(1,S)
4
a 5 (1,T) (1,T)
- 6
S 7
)
5 7 3
(1,T)
4
6
5
8
9
T 8 (3,S) (3,S)
(3,S)
) 9 (3,T) (3,T)
(3,T)
AFD y gramática
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.10
Ejemplo de reconocimiento LR
$
-
1
S 2
(
4
ac
a S T Pila
1
5 2 3 15
13
Resto entrada Decisión
a-(a-a)$ Avanzar
-(a-a)$ Red. T→a
-(a-a)$
6
T 3 (1,S) (1,S)
( 4
(1,S)
4
a 5 (1,T) (1,T)
- 6
S 7
)
5 7 3
(1,T)
4
6
5
8
9
T 8 (3,S) (3,S)
(3,S)
) 9 (3,T) (3,T)
(3,T)
AFD y gramática
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.10
Ejemplo de reconocimiento LR
$
-
1
S 2
(
4
ac
6
T 3 (1,S) (1,S)
( 4
4
- 6
1
5 2 3 15
13
12
Resto entrada
a-(a-a)$
-(a-a)$
-(a-a)$
-(a-a)$
Decisión
Avanzar
Red. T→a
Red. S→T
5 7 3
(1,T)
4
6
a S T Pila
(1,S)
a 5 (1,T) (1,T)
S 7
)
5
8
9
T 8 (3,S) (3,S)
(3,S)
) 9 (3,T) (3,T)
(3,T)
AFD y gramática
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.10
Ejemplo de reconocimiento LR
$
-
1
S 2
(
4
ac
6
T 3 (1,S) (1,S)
( 4
(1,S)
4
a 5 (1,T) (1,T)
- 6
S 7
)
1
5 2 3 15
13
12
126
Resto entrada
a-(a-a)$
-(a-a)$
-(a-a)$
-(a-a)$
(a-a)$
Decisión
Avanzar
Red. T→a
Red. S→T
Avanzar
5 7 3
(1,T)
4
6
a S T Pila
5
8
9
T 8 (3,S) (3,S)
(3,S)
) 9 (3,T) (3,T)
(3,T)
AFD y gramática
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.10
Ejemplo de reconocimiento LR
$
-
(
)
a S T Pila
1
1
4
5 2 3 15
13
S 2 ac
6
12
126
T 3 (1,S) (1,S) (1,S)
1264
( 4
4
a 5 (1,T) (1,T)
- 6
S 7
Decisión
Avanzar
Red. T→a
Red. S→T
Avanzar
Avanzar
5 7 3
(1,T)
4
6
Resto entrada
a-(a-a)$
-(a-a)$
-(a-a)$
-(a-a)$
(a-a)$
a-a)$
5
8
9
T 8 (3,S) (3,S)
(3,S)
) 9 (3,T) (3,T)
(3,T)
AFD y gramática
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.10
Ejemplo de reconocimiento LR
$
-
(
)
a S T Pila
1
1
4
5 2 3 15
13
S 2 ac
6
12
126
T 3 (1,S) (1,S) (1,S)
1264
( 4
4
5 7 3 12645
a 5 (1,T) (1,T)
- 6
S 7
Decisión
Avanzar
Red. T→a
Red. S→T
Avanzar
Avanzar
Avanzar
(1,T)
4
6
Resto entrada
a-(a-a)$
-(a-a)$
-(a-a)$
-(a-a)$
(a-a)$
a-a)$
-a)$
5
8
9
T 8 (3,S) (3,S)
(3,S)
) 9 (3,T) (3,T)
(3,T)
AFD y gramática
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.10
Ejemplo de reconocimiento LR
$
-
(
)
a S T Pila
1
1
4
5 2 3 15
13
S 2 ac
6
12
126
T 3 (1,S) (1,S) (1,S)
1264
( 4
4
5 7 3 12645
12643
a 5 (1,T) (1,T)
- 6
S 7
Decisión
Avanzar
Red. T→a
Red. S→T
Avanzar
Avanzar
Avanzar
Red. T→a
(1,T)
4
6
Resto entrada
a-(a-a)$
-(a-a)$
-(a-a)$
-(a-a)$
(a-a)$
a-a)$
-a)$
-a)$
5
8
9
T 8 (3,S) (3,S)
(3,S)
) 9 (3,T) (3,T)
(3,T)
AFD y gramática
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.10
Ejemplo de reconocimiento LR
$
-
(
)
a S T Pila
1
1
4
5 2 3 15
13
S 2 ac
6
12
126
T 3 (1,S) (1,S) (1,S)
1264
( 4
4
5 7 3 12645
12643
12647
a 5 (1,T) (1,T) (1,T)
- 6
S 7
4
6
5
Resto entrada
a-(a-a)$
-(a-a)$
-(a-a)$
-(a-a)$
(a-a)$
a-a)$
-a)$
-a)$
-a)$
Decisión
Avanzar
Red. T→a
Red. S→T
Avanzar
Avanzar
Avanzar
Red. T→a
Red. S→T
8
9
T 8 (3,S) (3,S)
(3,S)
) 9 (3,T) (3,T)
(3,T)
AFD y gramática
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.10
Ejemplo de reconocimiento LR
Resto entrada
1
a-(a-a)$
-(a-a)$
1
4
5 2 3 15
13
-(a-a)$
S 2 ac
6
12
-(a-a)$
126
(a-a)$
T 3 (1,S) (1,S) (1,S)
1264
a-a)$
-a)$
( 4
4
5 7 3 12645
12643
-a)$
12647
-a)$
a 5 (1,T) (1,T) (1,T)
126476
a)$
$
-
- 6
S 7
(
)
4
6
a S T Pila
5
Decisión
Avanzar
Red. T→a
Red. S→T
Avanzar
Avanzar
Avanzar
Red. T→a
Red. S→T
Avanzar
8
9
T 8 (3,S) (3,S)
(3,S)
) 9 (3,T) (3,T)
(3,T)
AFD y gramática
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.10
Ejemplo de reconocimiento LR
Resto entrada
1
a-(a-a)$
-(a-a)$
1
4
5 2 3 15
13
-(a-a)$
S 2 ac
6
12
-(a-a)$
126
(a-a)$
T 3 (1,S) (1,S) (1,S)
1264
a-a)$
-a)$
( 4
4
5 7 3 12645
12643
-a)$
12647
-a)$
a 5 (1,T) (1,T) (1,T)
126476
a)$
- 6
4
5 8 1264765
)$
$
S 7
-
6
(
)
a S T Pila
Decisión
Avanzar
Red. T→a
Red. S→T
Avanzar
Avanzar
Avanzar
Red. T→a
Red. S→T
Avanzar
Avanzar
9
T 8 (3,S) (3,S)
(3,S)
) 9 (3,T) (3,T)
(3,T)
AFD y gramática
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.10
Ejemplo de reconocimiento LR
Resto entrada
1
a-(a-a)$
-(a-a)$
1
4
5 2 3 15
13
-(a-a)$
S 2 ac
6
12
-(a-a)$
126
(a-a)$
T 3 (1,S) (1,S) (1,S)
1264
a-a)$
-a)$
( 4
4
5 7 3 12645
12643
-a)$
12647
-a)$
a 5 (1,T) (1,T) (1,T)
126476
a)$
- 6
4
5 8 1264765
)$
1264768
)$
$
S 7
-
6
(
)
a S T Pila
Decisión
Avanzar
Red. T→a
Red. S→T
Avanzar
Avanzar
Avanzar
Red. T→a
Red. S→T
Avanzar
Avanzar
Red. T→a
9
T 8 (3,S) (3,S)
(3,S)
) 9 (3,T) (3,T)
(3,T)
AFD y gramática
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.10
Ejemplo de reconocimiento LR
Resto entrada
1
a-(a-a)$
-(a-a)$
1
4
5 2 3 15
13
-(a-a)$
S 2 ac
6
12
-(a-a)$
126
(a-a)$
T 3 (1,S) (1,S) (1,S)
1264
a-a)$
-a)$
( 4
4
5 7 3 12645
12643
-a)$
12647
-a)$
a 5 (1,T) (1,T) (1,T)
126476
a)$
- 6
4
5 8 1264765
)$
1264768
)$
S 7
6
9
12647
)$
$
-
(
)
T 8 (3,S) (3,S)
(3,S)
) 9 (3,T) (3,T)
(3,T)
a S T Pila
Decisión
Avanzar
Red. T→a
Red. S→T
Avanzar
Avanzar
Avanzar
Red. T→a
Red. S→T
Avanzar
Avanzar
Red. T→a
Red. S→S
AFD y gramática
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.10
Ejemplo de reconocimiento LR
Resto entrada
1
a-(a-a)$
-(a-a)$
1
4
5 2 3 15
13
-(a-a)$
S 2 ac
6
12
-(a-a)$
126
(a-a)$
T 3 (1,S) (1,S) (1,S)
1264
a-a)$
-a)$
( 4
4
5 7 3 12645
12643
-a)$
12647
-a)$
a 5 (1,T) (1,T) (1,T)
126476
a)$
- 6
4
5 8 1264765
)$
1264768
)$
S 7
6
9
12647
)$
126479
$
T 8 (3,S) (3,S) (3,S)
$
-
) 9 (3,T) (3,T)
(
)
a S T Pila
Decisión
Avanzar
Red. T→a
Red. S→T
Avanzar
Avanzar
Avanzar
Red. T→a
Red. S→T
Avanzar
Avanzar
Red. T→a
Red. S→S
Avanzar
(3,T)
AFD y gramática
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.10
Ejemplo de reconocimiento LR
Resto entrada
1
a-(a-a)$
-(a-a)$
1
4
5 2 3 15
13
-(a-a)$
S 2 ac
6
12
-(a-a)$
126
(a-a)$
T 3 (1,S) (1,S) (1,S)
1264
a-a)$
-a)$
( 4
4
5 7 3 12645
12643
-a)$
12647
-a)$
a 5 (1,T) (1,T) (1,T)
126476
a)$
- 6
4
5 8 1264765
)$
1264768
)$
S 7
6
9
12647
)$
126479
$
T 8 (3,S) (3,S) (3,S)
1268
$
$
-
) 9 (3,T) (3,T)
(
)
a S T Pila
Decisión
Avanzar
Red. T→a
Red. S→T
Avanzar
Avanzar
Avanzar
Red. T→a
Red. S→T
Avanzar
Avanzar
Red. T→a
Red. S→S
Avanzar
Red. T→(
(3,T)
AFD y gramática
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.10
Ejemplo de reconocimiento LR
Resto entrada
1
a-(a-a)$
-(a-a)$
1
4
5 2 3 15
13
-(a-a)$
S 2 ac
6
12
-(a-a)$
126
(a-a)$
T 3 (1,S) (1,S) (1,S)
1264
a-a)$
-a)$
( 4
4
5 7 3 12645
12643
-a)$
12647
-a)$
a 5 (1,T) (1,T) (1,T)
126476
a)$
- 6
4
5 8 1264765
)$
1264768
)$
S 7
6
9
12647
)$
126479
$
T 8 (3,S) (3,S) (3,S)
1268
$
12
$
) 9 (3,T) (3,T) (3,T)
$
-
(
)
a S T Pila
Decisión
Avanzar
Red. T→a
Red. S→T
Avanzar
Avanzar
Avanzar
Red. T→a
Red. S→T
Avanzar
Avanzar
Red. T→a
Red. S→S
Avanzar
Red. T→(
Red. S→S
AFD y gramática
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.10
Ejemplo de reconocimiento LR
Resto entrada
1
a-(a-a)$
-(a-a)$
1
4
5 2 3 15
13
-(a-a)$
S 2 ac
6
12
-(a-a)$
126
(a-a)$
T 3 (1,S) (1,S) (1,S)
1264
a-a)$
-a)$
( 4
4
5 7 3 12645
12643
-a)$
12647
-a)$
a 5 (1,T) (1,T) (1,T)
126476
a)$
- 6
4
5 8 1264765
)$
1264768
)$
S 7
6
9
12647
)$
126479
$
T 8 (3,S) (3,S) (3,S)
1268
$
12
$
) 9 (3,T) (3,T) (3,T)
$
-
(
)
a S T Pila
Decisión
Avanzar
Red. T→a
Red. S→T
Avanzar
Avanzar
Avanzar
Red. T→a
Red. S→T
Avanzar
Avanzar
Red. T→a
Red. S→S
Avanzar
Red. T→(
Red. S→S
Aceptar
Fin del reconocimiento.
AFD y gramática
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.10
Items LR(0). Significado
El punto en la parte derecha corresponde con la posición de la cima de la
pila (por tanto α es un sufijo de pila).
S
α1 A 1 β 1
Am →α•β
α2 A 2 β 2
Am−1
αm A m β m
α
top
β
x
xm
x2
x1
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.11
Items LR(0). Significado
Dada la multiplicidad de árboles restantes compatibles con la pila, en cada
momento tendremos un conjunto de items, parte de los cuales se “desecharán” al progresar la lectura (distintos β y distintos A).
α1
Am →α•β
A0m →α0 •β 0
A00m →α00 •β 00
.
.
.
α2
αm
α
?
top k : y
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.11
Conjuntos de items LR(0)
Cierre:
Equivalente a transición-ε (sin avanzar en la lectura)
Items de la forma A→α•Bβ : se añaden al conjunto los
items B→•γi para cada una de las reglas B→γi
Transición con un símbolo X :
1. Se mueve el punto en los items con X : Se pasa de
A→α•Xβ a A→αX •β (núcleo [kernel], que identifica al
estado)
2. Se calcula el cierre del núcleo
Estado inicial:
Cierre de S 0 →•S
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.12
Acciones del autómata LR(0)
A cada conjunto de items le asociamos un estado del
AFD.
Acciones en cada estado:
A→α•aβ indican avanzar
B→γ • indican reducir B→γ
(Tras reducción aplicamos transición con B )
S’→S• indica aceptar
Si más de una acción, tenemos un conflicto: la gramática
no es LR(0)
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.13
Ejemplo de items y acciones
S
B
A b
a
c
E
d
F
D
C
e f
S’→•S
S→•BcEF
B→•Ab
A→•a (Avanzar)
.
.
.
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.14
Ejemplo de items y acciones
S
B
A b
a
c
E
d
F
D
C
A→a• (Reducir)
.
.
.
e f
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.14
Ejemplo de items y acciones
S
B
A b
a
c
E
d
F
D
C
B→A•b (Avanzar)
.
.
.
e f
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.14
Ejemplo de items y acciones
S
B
A b
a
c
E
d
F
D
C
B→Ab• (Reducir)
.
.
.
e f
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.14
Ejemplo de items y acciones
S
B
A b
a
c
E
d
F
D
C
S→B•cEF (Avanzar)
.
.
.
e f
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.14
Ejemplo de items y acciones
S
B
A b
a
c
E
d
F
D
C
S→Bc•EF
E→•dD (Avanzar)
.
.
.
e f
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.14
Ejemplo de items y acciones
S
B
A b
a
c
E
d
F
D
C
e f
E→d•D
D→•C
C→•ef (Avanzar)
.
.
.
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.14
Ejemplo de items y acciones
S
B
A b
a
c
E
d
F
D
C
C→e•f (Avanzar)
.
.
.
e f
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.14
Ejemplo de items y acciones
S
B
A b
a
c
E
d
F
D
C
C→ef• (Reducir)
.
.
.
e f
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.14
Ejemplo de items y acciones
S
B
A b
a
c
E
d
F
D
C
D→C• (Reducir)
.
.
.
e f
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.14
Ejemplo de items y acciones
S
B
A b
a
c
E
d
F
D
C
E→dD• (Reducir)
.
.
.
e f
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.14
Ejemplo de items y acciones
S
B
A b
a
c
E
d
F
D
C
S→BcE•F
F→• (Reducir)
.
.
.
e f
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.14
Ejemplo de items y acciones
S
B
A b
a
c
E
d
F
D
C
S→BcEF• (Reducir)
.
.
.
e f
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.14
Ejemplo de items y acciones
S
B
A b
a
c
E
d
F
D
C
S’→S• (Aceptar)
.
.
.
e f
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.14
Autómata LR(0) con conflictos
E→E+T|T
T→T*F|F
F→(E)|a
Estado Items
1
S’→•E
E→•T
T→•F
F→•(E)
F→•a
2
S’→E•
E→E•+T
3
E→T•
T→T•*F
4
T→F•
5
F→(•E)
E→•T
T→•F
F→•(E)
F→•a
6
F→a•
7
E→E+•T
T→•F
F→•(E)
F→•a
8
T→T*•F
F→•(E)
F→•a
9
F→(E•)
E→E•+T
10
E→E+T•
T→T•*F
11
T→T*F•
12
F→(E)•
Transic. Acciones
E→•E+T E:2
Avanzar
T→•T*F T:3
F:4
(:5
a:6
Aceptar
+:7
Avanzar
Reducir E→T
*:8
Avanzar
Reducir T→F
E→•E+T E:9
Avanzar
T→•T*F T:3
F:4
(:5
a:6
Reducir F→a
T→•T*F T:10
Avanzar
F:4
(:5
a:6
F:11
Avanzar
(:5
a:6
):12
Avanzar
+:7
Reducir E→E+T
*:8
Avanzar
Reducir T→T*F
Reducir F→(E)
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.15
Autómata SLR(1) sin conflictos
E→E+T|T
T→T*F|F
F→(E)|a
Sı́mb. Siguientes
S’
E
T
F
$
$,+,)
$,+,*,)
$,+,*,)
Estado Items
1
S’→•E
E→•T
T→•F
F→•(E)
F→•a
2
S’→E•
E→E•+T
3
E→T•
T→T•*F
4
T→F•
5
F→(•E)
E→•T
T→•F
F→•(E)
F→•a
6
F→a•
7
E→E+•T
T→•F
F→•(E)
F→•a
8
T→T*•F
F→•(E)
F→•a
9
F→(E•)
E→E•+T
10
E→E+T•
T→T•*F
11
T→T*F•
12
F→(E)•
Transic. Sı́mbolos:Acciones
E→•E+T E:2
(,a:Avanzar
T→•T*F T:3
F:4
(:5
a:6
$:Aceptar
+:7
+:Avanzar
$,+,):Reducir E→T
*:8
*:Avanzar
$,+,*,):Reducir T→F
E→•E+T E:9
(,a:Avanzar
T→•T*F T:3
F:4
(:5
a:6
$,+,*,):Reducir F→a
T→•T*F T:10
(,a:Avanzar
F:4
(:5
a:6
F:11
(,a:Avanzar
(:5
a:6
):12
),+:Avanzar
+:7
$,+,):Reducir E→E+T
*:8
*:Avanzar
$,+,*,):Reducir T→T*F
$,+,*,):Reducir F→(E)
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.16
Tabla SLR(1) de GET F
$
ac:
r1:
r2:
r3:
r4:
r5:
r6:
S’→E
E→E+T
E→T
T→T*F
T→F
F→(E)
F→a
1
2
3
4
5
6
7
8
9
10
11
12
+
* ( ) a E T
5
6 2 3
ac 7
r2 r2 8
r4 r4 r4
r2
r4
5
r6 r6 r6
6 9 3
4
r6
5
5
7
r1 r1 8
r3 r3 r3
r5 r5 r5
F
4
6
6
10 4
11
12
r1
r3
r5
Autómata y acciones
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.17
Autómata SLR(1) con conflicto
ac:
r1:
r2:
r3:
r4:
r5:
r6:
S’→S
S→E=E
S→f
E→T
E→E+T
T→f
T→T*f
Sı́mb. Siguientes
S’
S
E
T
$
$
$,=,+
$,=,+,*
Estado Items
1
S’→•S
S→•E=E
S→•f
E→•T
2
S’→S•
3
S→E•=E
E→E•+T
4
S→f•
T→f•
5
E→T•
T→T•*f
6
S→E=•E
E→•T
T→•f
7
E→E+•T
T→•f
8
T→T*•f
9
S→E=E•
E→E•+T
10
T→f•
11
E→E+T•
T→T•*f
12
T→T*f•
Transic. Sı́mbolos:Acciones
S:2
f:Avanzar
E→•E+T E:3
T→•f
f:4
T→•T*f T:5
$:Aceptar
=:6
=+:Avanzar
+:7
$:Reducir S→f
$=+*:Reducir T→f
$=+:Reducir E→T
*:8
*:Avanzar
E→•E+T E:9
f:Avanzar
T→•T*f T:5
f:10
T→•T*f T:11
f:Avanzar
f:10
f:12
f:Avanzar
$:Reducir S→E=E
+:7
+:Avanzar
$=+*:Reducir T→f
$=+:Reducir E→E+T
*:8
*:Avanzar
$=*+:Reducir T→T*f
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.18
Tabla SLR(1) con conflicto
ac:
r1:
r2:
r3:
r4:
r5:
r6:
S’→S
S→E=E
S→f
E→T
E→E+T
T→f
T→T*f
Sı́mb. Siguientes
S’
S
E
T
$
$
$,=,+
$,=,+,*
$
=
f
4
+
* S E T
2 3 5
1
2
ac
3
6
7
4 r2,r5 r5
r5 r5
5
r3 r3
r3 8
6
10
7
10
8
12
9
r1
7
10 r5 r5
r5 r5
11 r4 r4
r4 8
12 r6 r6
r6 r6
9 5
11
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.19
Autómata LR(0) de GSET
12
4
ac:
r1:
r2:
r3:
r4:
r5:
r6:
S’→S
S→E=E
S→f
E→T
E→E+T
T→f
T→T*f
f
f
2
8
*
11
+
9
f
10
S
1
Sı́mb. Siguientes
S’
S
E
T
$
$
$,=,+
$,=,+,*
T
*
T
5
7
f
E
T
+
3
=
E
6
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.20
Análisis del conflicto SLR(1)
Orígen (espúreo) del conflicto:
Según la gramática, sólo con las pilas E=f ó E=E+f es
apropiado r2: T→f ante $
Ello sólo ocurre en el estado 10, no en el 4
Por tanto, no tiene sentido r2 en el estado 4
Conclusión:
El conjunto de siguientes engloba todos los
contextos: no es suficientemente discriminatorio
para las gramáticas no-SLR(1)
Entonces, es necesario un método que calcule las
ventanas en conexión con el contexto izquierdo
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.21
Items LR(k). Significado
Existe un sufijo zm compatible con la pila (y adyacente a una frase x
derivada de β) tal que w = k : zm $
S
α1 A 1 β 1
α2 A 2 β 2
Am →α•β, w
Am−1
αm A m β m
α
β
cima
x
zm
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.22
Items LR(k). Cierre
Dado un ítem A→α•Bβ, w, donde w = k : z$
S
A→α•Bβ, w
α1 A 1 β 1
αm A
βm
α
β
B
cima
x
y
z
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.23
Items LR(k). Cierre
Dado un ítem A→α•Bβ, w, las nuevas ventanas vj ∈ {k : yw | β ⇒∗ y}
se hallan igualmente a continuación de las frases de B
S
A→α•Bβ, w
α1 A 1 β 1
B→•γ, v1
αm A
βm
α
β
B
cima
γ
x
y
z
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.23
Items LR(k). Cierre
Dado un ítem A→α•Bβ, w, las nuevas ventanas vj ∈ {k : yw | β ⇒∗ y}
se hallan igualmente a continuación de las frases de B
S
A→α•Bβ, w
α1 A 1 β 1
B→•γ, v1
B→•γ, vn
αm A
βm
α
β
B
cima
γ
x
y
z
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.23
Conjuntos de items LR(1)
Cierre:
Items de la forma A→α•Bβ, a: se añaden al conjunto
los items B→•γi , bj para cada regla B→γi y cada
bj ∈ Pr(βa)
Transición con un símbolo X :
1. Se mueve el punto en los items con X : Se pasa de
A→α•Xβ, b a A→αX •β, b (núcleo)
2. Se calcula el cierre del núcleo
Estado inicial:
Cierre de S 0 →•S, $
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.24
Acciones del autómata LR(1)
A cada conjunto de items le asociamos un estado del
AFD.
Acciones en cada estado:
A→α•aβ, b indican avanzar ante a
B→γ •, b indican reducir B→γ ante b
(Tras reducción aplicamos transición con B )
S 0 →S •, $ indica aceptar ante $
Si más de una acción ante un mismo terminal, tenemos un
conflicto: la gramática no es LR(1)
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.25
Ejemplo de items LR(1) y acciones
S
B
A b
a
c
E
d
F
D
C
e f
S’→•S,$
S→•BcEF,$
B→•Ab,c
A→•a,b (Avanzar ante a)
.
.
.
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.26
Ejemplo de items LR(1) y acciones
S
B
A b
a
c
E
d
F
D
C
A→a•,b (Reducir ante b)
.
.
.
e f
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.26
Ejemplo de items LR(1) y acciones
S
B
A b
a
c
E
d
F
D
C
B→A•b,c (Avanzar ante b)
.
.
.
e f
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.26
Ejemplo de items LR(1) y acciones
S
B
A b
a
c
E
d
F
D
C
B→Ab•,c (Reducir ante c)
.
.
.
e f
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.26
Ejemplo de items LR(1) y acciones
S
B
A b
a
c
E
d
F
D
C
S→B•cEF,$ (Avanzar ante c)
.
.
.
e f
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.26
Ejemplo de items LR(1) y acciones
S
B
A b
a
c
E
d
F
D
C
S→Bc•EF,$
E→•dD,$ (Avanzar ante d)
.
.
.
e f
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.26
Ejemplo de items LR(1) y acciones
S
B
A b
a
c
E
d
F
D
C
e f
E→d•D,$
D→•C,$
C→•ef,$ (Avanzar ante e)
.
.
.
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.26
Ejemplo de items LR(1) y acciones
S
B
A b
a
c
E
d
F
D
C
C→e•f,$ (Avanzar ante f)
.
.
.
e f
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.26
Ejemplo de items LR(1) y acciones
S
B
A b
a
c
E
d
F
D
C
C→ef•,$ (Reducir ante $)
.
.
.
e f
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.26
Ejemplo de items LR(1) y acciones
S
B
A b
a
c
E
d
F
D
C
D→C•,$ (Reducir ante $)
.
.
.
e f
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.26
Ejemplo de items LR(1) y acciones
S
B
A b
a
c
E
d
F
D
C
E→dD•,$ (Reducir ante $)
.
.
.
e f
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.26
Ejemplo de items LR(1) y acciones
S
B
A b
a
c
E
d
F
D
C
S→BcE•F,$
F→•,$ (Reducir ante $)
.
.
.
e f
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.26
Ejemplo de items LR(1) y acciones
S
B
A b
a
c
E
d
F
D
C
S→BcEF•,$ (Reducir ante $)
.
.
.
e f
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.26
Ejemplo de items LR(1) y acciones
S
B
A b
a
c
E
d
F
D
C
S’→S•,$ (Aceptar ante $)
.
.
.
e f
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.26
Autómata LR(1)
ac:
r1:
r2:
r3:
r4:
r5:
r6:
S’→S
S→E=E
S→f
E→T
E→E+T
T→f
T→T*f
SLR(1)
Estado Items
Transic. Sı́mbolos:Acciones
1
S’→•S,$
S:2
f:Avanzar
S→•E=E,$ E→•E+T,=+ E:3
S→•f,$
T→•f,=*+
f:4
E→•T,=+
T→•T*f,=*+ T:5a
2
S’→S•,$
$:Aceptar
3
S→E•=E,$
=:6
=+:Avanzar
E→E•+T,=+
+:7a
4
S→f•,$
$:Reducir S→f
T→f•,=*+
=*+:Reducir T→f
5a
E→T•,=+
=+:Reducir E→T
T→T•*f,=*+
*:8a
*:Avanzar
5b
E→T•,$+
$+:Reducir E→T
T→T•*f,$*+
*:8b
*:Avanzar
6
S→E=•E,$ E→•E+T,$+ E:9
f:Avanzar
E→•T,$+
T→•T*f,$*+ T:5b
T→•f,$*+
f:10b
7a
E→E+•T,=+ T→•T*f,=+* T:11a f:Avanzar
T→•f,=+*
f:10a
7b
E→E+•T,$+ T→•T*f,$+* T:11b f:Avanzar
T→•f,$+*
f:10b
8a
T→T*•f,=*+
f:12a f:Avanzar
8b
T→T*•f,$*+
f:12b f:Avanzar
9
S→E=E•,$
$:Reducir S→E=E
E→E•+T,$+
+:7b
+:Avanzar
10a
T→f•,=+*
=+*:Reducir T→f
10b
T→f•,$*+
$*+:Reducir T→f
11a
E→E+T•,=+
=+:Reducir E→E+T
T→T•*f,=+*
*:8a
*:Avanzar
11b
E→E+T•,$+
c
Generación de analizador sintáctico ascendente v1.1$+:Reducir
2005
José FortesE→E+T
Gálvez– p.27
T→T•*f,$+*
*:8b
*:Avanzar
12a
T→T*f•,=*+
=*+:Reducir T→T*
Autómata LR(1)
ac:
r1:
r2:
r3:
r4:
r5:
r6:
S’→S
S→E=E
S→f
E→T
E→E+T
T→f
T→T*f
SLR(1)
Estado Items
1
S’→•S,$
S→•E=E,$ E→•E+T,=+
S→•f,$
T→•f,=*+
E→•T,=+
T→•T*f,=*+
2
S’→S•,$
3
S→E•=E,$
E→E•+T,=+
4
S→f•,$
T→f•,=*+
5a
E→T•,=+
T→T•*f,=*+
5b
E→T•,$+
T→T•*f,$*+
6
S→E=•E,$ E→•E+T,$+
E→•T,$+
T→•T*f,$*+
T→•f,$*+
7a
E→E+•T,=+ T→•T*f,=+*
T→•f,=+*
7b
E→E+•T,$+ T→•T*f,$+*
T→•f,$+*
8a
T→T*•f,=*+
8b
T→T*•f,$*+
9
S→E=E•,$
E→E•+T,$+
10a
T→f•,=+*
10b
T→f•,$*+
11a
E→E+T•,=+
T→T•*f,=+*
11b
E→E+T•,$+
T→T•*f,$+*
12a
T→T*f•,=*+
12b
T→T*f•,$*+
Transic. Sı́mbolos:Acciones
S:2
f:Avanzar
E:3
f:4
T:5a
$:Aceptar
=:6
=+:Avanzar
+:7a
$:Reducir S→f
=*+:Reducir T→f
=+:Reducir E→T
*:8a
*:Avanzar
$+:Reducir E→T
*:8b
*:Avanzar
E:9
f:Avanzar
T:5b
f:10b
T:11a f:Avanzar
f:10a
T:11b f:Avanzar
f:10b
f:12a f:Avanzar
f:12b f:Avanzar
$:Reducir S→E=E
+:7b
+:Avanzar
=+*:Reducir T→f
$*+:Reducir T→f
=+:Reducir E→E+T
*:8a
*:Avanzar
$+:Reducir E→E+T
*:8b
*:Avanzar
=*+:Reducir T→T*
$*+:Reducir T→T*
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.27
Cierre LR(1) del estado 1
S’→•S,$
ac:
r1:
r2:
r3:
r4:
r5:
r6:
S’→S
S→E=E
S→f
E→T
E→E+T
T→f
T→T*f
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.28
Cierre LR(1) del estado 1
ac:
r1:
r2:
r3:
r4:
r5:
r6:
S’→S
S→E=E
S→f
E→T
E→E+T
T→f
T→T*f
S’→•S,$
S→•E=E,$
S→•f,$
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.28
Cierre LR(1) del estado 1
ac:
r1:
r2:
r3:
r4:
r5:
r6:
S’→S
S→E=E
S→f
E→T
E→E+T
T→f
T→T*f
S’→•S,$
S→•E=E,$
S→•f,$
E→•T,=
E→•E+T,=
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.28
Cierre LR(1) del estado 1
ac:
r1:
r2:
r3:
r4:
r5:
r6:
S’→S
S→E=E
S→f
E→T
E→E+T
T→f
T→T*f
S’→•S,$
S→•E=E,$
S→•f,$
E→•T,=
E→•E+T,=
T→•f,=
T→•T*F,=
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.28
Cierre LR(1) del estado 1
ac:
r1:
r2:
r3:
r4:
r5:
r6:
S’→S
S→E=E
S→f
E→T
E→E+T
T→f
T→T*f
S’→•S,$
S→•E=E,$
S→•f,$
E→•T,=
E→•E+T,=
T→•f,=
T→•T*F,=
E→•T,+
E→•E+T,+
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.28
Cierre LR(1) del estado 1
ac:
r1:
r2:
r3:
r4:
r5:
r6:
S’→S
S→E=E
S→f
E→T
E→E+T
T→f
T→T*f
S’→•S,$
S→•E=E,$
S→•f,$
E→•T,=
E→•E+T,=
T→•f,=
T→•T*F,=
E→•T,+
E→•E+T,+
T→•f,*
T→•T*F,*
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.28
Cierre LR(1) del estado 1
ac:
r1:
r2:
r3:
r4:
r5:
r6:
S’→S
S→E=E
S→f
E→T
E→E+T
T→f
T→T*f
S’→•S,$
S→•E=E,$
S→•f,$
E→•T,=
E→•E+T,=
T→•f,=
T→•T*F,=
E→•T,+
E→•E+T,+
T→•f,*
T→•T*F,*
T→•f,+
T→•T*F,+
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.28
Cierre LR(1) del estado 1
ac:
r1:
r2:
r3:
r4:
r5:
r6:
S’→S
S→E=E
S→f
E→T
E→E+T
T→f
T→T*f
S’→•S,$
S→•E=E,$
S→•f,$
E→•T,=
E→•E+T,=
T→•f,=
T→•T*F,=
E→•T,+
E→•E+T,+
T→•f,*
T→•T*F,*
T→•f,+
T→•T*F,+
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.28
Cierre LR(1) del estado 1
ac:
r1:
r2:
r3:
r4:
r5:
r6:
S’→S
S→E=E
S→f
E→T
E→E+T
T→f
T→T*f
S’→•S,$
S→•E=E,$
S→•f,$
E→•T,=
E→•E+T,=
T→•f,=
T→•T*F,=
E→•T,+
E→•E+T,+
T→•f,*
T→•T*F,*
T→•f,+
T→•T*F,+
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.28
Cierre LR(1) del estado 1
ac:
r1:
r2:
r3:
r4:
r5:
r6:
S’→S
S→E=E
S→f
E→T
E→E+T
T→f
T→T*f
S’→•S,$
S→•E=E,$
S→•f,$
E→•T,=
E→•E+T,=
T→•f,=
T→•T*F,=
E→•T,+
E→•E+T,+
T→•f,*
T→•T*F,*
T→•f,+
T→•T*F,+
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.28
Cierre LR(1) del estado 1
ac:
r1:
r2:
r3:
r4:
r5:
r6:
S’→S
S→E=E
S→f
E→T
E→E+T
T→f
T→T*f
S’→•S,$
S→•E=E,$
S→•f,$
E→•T,=
E→•E+T,=
T→•f,=
T→•T*F,=
E→•T,+
E→•E+T,+
T→•f,*
T→•T*F,*
T→•f,+
T→•T*F,+
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.28
Tabla LR(1) de GSET
$
ac:
r1:
r2:
r3:
r4:
r5:
r6:
S’→S
S→E=E
S→f
E→T
E→E+T
T→f
T→T*f
Tabla SLR(1)
Autómata LR(0)
Autómata LR(1)
1
2
3
4
5a
5b
6
7a
7b
8a
8b
9
10a
10b
11a
11b
12a
12b
=
f
4
+
* S E T
2 3 5a
ac
6
r2 r5
r3
r3
7a
r5 r5
r3 8a
r3 8b
10b
10a
10b
12a
12b
r1
r5
r5
r4
r4
r6
r6
9 5b
11a
11b
7b
r5
r5
r4
r4
r6
r6
r5
r5
8a
8b
r6
r6
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.29
El problema del tamaño de LR(k)
Es el método más potente posible de
avance-reducción con k símbolos de ventana
Calcula exactamente qué siguientes corresponden a
cada ítem de cada estado
Ello provoca una “explosión” de estados conforme k
crece
Tradicionalmente considerado inviable para k ≥ 1
Solución tradicional: LALR(1)
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.30
De LR(1) a LALR(1)
LR(1) replica los estados LR(0)
Añadiendo distintas ventanas
Igual parte LR(0) (corazón [core])
Si fusionamos estados LR(1) de igual corazón
Recuperamos autómata LR(0)
Conservamos parte de la información de
contexto en las ventanas LR(1)
Conclusión:
LALR(1) de potencia intermedia entre LR(0) y
LR(1)
Tradicionalmente considerado suficiente en la
práctica
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.31
Generación de LALR(1) en yacc
Demasiado costoso construir primero LR(1)
Se parte de una construcción de núcleos LR(0) y se
aplica un proceso iterativo:
El cálculo del cierre nos proporciona
(inicialmente sólo algunos) valores para las
ventanas de los ítems
Se propagan estos valores a través de
transiciones y cierres
Se compacta la tabla con valores por defecto:
Filas en zona de acción: reducción o error más
frecuente (da lugar a reducciones adicionales en
caso de error)
Columnas en zona de saltos: más frecuente
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.32
Autómata LALR(1)
ac:
r1:
r2:
r3:
r4:
r5:
r6:
S’→S
S→E=E
S→f
E→T
E→E+T
T→f
T→T*f
LR(1)
SLR(1)
Estado Items
1
S’→•S,$
S→•E=E,$ E→•E+T,=+
S→•f,$
T→•f,=*+
E→•T,=+
T→•T*f,=*+
2
S’→S•,$
3
S→E•=E,$
E→E•+T,=+
4
S→f•,$
T→f•,=*+
5
E→T•,=+$
T→T•*f,=*+$
6
S→E=•E,$ E→•E+T,$+
E→•T,$+
T→•T*f,$*+
T→•f,$*+
7
E→E+•T,=+$ T→•T*f,=+*$
T→•f,=+*
8
T→T*•f,=*+$
9
S→E=E•,$
E→E•+T,$+
10
T→f•,=+*$
11
E→E+T•,=+$
T→T•*f,=+*$
12
T→T*f•,=*+$
Transic. Sı́mbolos:Acciones
S:2
f:Avanzar
E:3
f:4
T:5
$:Aceptar
=:6
=+:Avanzar
+:7
$:Reducir S→f
=*+:Reducir T→f
=+$:Reducir E→T
*:8
*:Avanzar
E:9
f:Avanzar
T:5b
f:10b
T:11
f:Avanzar
f:10
f:12
f:Avanzar
$:Reducir S→E=E
+:7b
+:Avanzar
=+*$:Reducir T→f
=+$:Reducir E→E+T
*:8
*:Avanzar
=*+$:Reducir T→T*
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.33
Tabla LALR(1) de GSET
ac:
r1:
r2:
r3:
r4:
r5:
r6:
S’→S
S→E=E
S→f
E→T
E→E+T
T→f
T→T*f
Tabla LR(1)
Tabla SLR(1)
Aut. LR(0)
$
1
2
3
4
5
6
7
8
9
10
11
12
=
f
4
+
* S E T
2 3 5
ac
6
r2 r5
r3 r3
7
r5 r5
r3 8
10
10
12
r1
r5 r5
r4 r4
r6 r6
9 5
11
7
r5 r5
r4 8
r6 r6
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.34
Familias de gramáticas LR, LALR y LL
LR(0)
LALR(1)
LALR(2)
LALR
LL(1)
LR(1)
LL(2)
LR(2)
LR
LL
Además, las SLR(k) están incluídas en LALR(k), y guardan la misma relación con las demás
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.35
Familias de lenguajes LR y LL
LR(0)
LL(1)
LL(2)
SLR(1)=· · · =LR
LL
(Un lenguaje L es de una familia F si y sólo si existe un gramática del tipo F para L)
Toda gramática LR(k) puede transformarse en LR(1), LALR(1) y SLR(1)
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.36
Ambigüedad y LALR
Todas las gramáticas LR son no-ambiguas (¡pero no
al revés!)
Aunque el lenguaje a compilar sea no-ambiguo, a
veces puede ser interesante usar una gramática más
simple pero ambigua
Ejemplo: if-then-else es típicamente LALR
pero más natural y simple expresarlo de forma
ambigua
instr→if cond then instr
instr→if cond then instr else instr
instr→· · ·
Ello provoca conflictos en la tabla LALR que el
usuario puede intentar “resolver” manualmente
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.37
Tabla LALR(1) para gramática ambigu
ac:
r1:
r2:
r3:
r4:
S’→E
E→E-E
E→E*E
E→(E)
E→a
1
2
3
4
5
6
7
8
9
10
$
-
*
ac
5
6
(
3
)
3
r4
r4
r4
r1
r2
r3
6
r1,6
r2,6
r3
E
2
4
7
4
4
8
9
r4
3
3
5
r1,5
r2,5
r3
a
4
10
r1
r2
r3
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.38
Autómata LALR(1) para gramática
ambigua
E→E-E|E*E|(E)|a
Estado Items
1
S’→•E,$ E→•E-E,$-* E→•E*E,$-*
E→•(E),$-*
E→•a,$-*
2
S’→E•,$
E→E•-E,$-*
E→E•*E,$-*
3
E→(•E),$-*) E→•E-E,)-* E→•E*E,)-*
E→•(E),)-*
E→•a,)-*
4
E→a•,$-*)
5
E→E-•E,$-*) E→•E-E,$-*) E→•E*E,$-*)
E→•(E),$-*)
E→•a,$-*)
6
E→E*•E,$-*) E→•E-E,$-*) E→•E*E,$-*)
E→•(E),$-*)
E→•a,$-*)
7
E→(E•),$-*)
E→E•-E,)-*
E→E•*E,)-*
8
E→E-E•,$-*)
E→E•-E,$-*)
E→E•*E,$-*)
9
E→E*E•,$-*)
E→E•-E,$-*)
E→E•*E,$-*)
10
E→(E)•,$-*)
Transic. Sı́mbolos:Acciones
E:2
(a:Avanzar
(:3
a:4
$:Aceptar
-:5
-*:Avanzar
*:6
E:7
(a:Avanzar
(:3
a:4
$:Reducir E→a
E:8
(a:Avanzar
(:3
a:4
E:9
(a:Avanzar
(:3
a:4
):10
)-*:Avanzar
-:5
*:6
$-*):Reducir E→E-E
-:5
-*:Avanzar
*:6
$-*):Reducir E→E*E
-:5
-*:Avanzar
*:6
$-*):Reducir E→(E)
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.39
Estudio de casos conflictivos
Estado 8, ventana -
E
E
E - E - E
Reducir
E
E
E - E - E
Avanzar
Items
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.40
Estudio de casos conflictivos
Estado 8, ventana *
E
E
E - E * E
Reducir
E
E
E - E * E
Avanzar
Items
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.40
Estudio de casos conflictivos
Estado 9, ventana -
E
E
E * E - E
Reducir
E
E
E * E - E
Avanzar
Items
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.40
Estudio de casos conflictivos
Estado 9, ventana *
E
E
E * E * E
Reducir
E
E
E * E * E
Avanzar
Items
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.40
Tabla LALR(1) con ambigüedad resuelt
ac:
r1:
r2:
r3:
r4:
S’→E
E→E-E
E→E*E
E→(E)
E→a
Tabla original
1
2
3
4
5
6
7
8
9
10
$
-
*
ac
5
6
(
3
)
3
r4
r4
r4
r1
r2
r3
6
6
r2
r3
E
2
4
7
4
4
8
9
r4
3
3
5
r1
r2
r3
a
4
10
r1
r2
r3
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.41
Resolución de ambigüedad en yacc (1/2
En conflictos reducción-reducción se reduce la regla
más arriba en el texto
Para conflictos avance-reducción genera un avance
por defecto, pero podemos asociar a los símbolos
terminales (y a las reglas):
Precedencia: cuál de dos terminales próximos de
distinta precedencia se reduce antes
Asociatividad: en caso de igual precedencia, si se
reduce primero (a) el de la izquierda, (b) el de la
derecha ó (c) no es posible
Si no se especifica, la regla recibe mismos valores
que su terminal más a la derecha
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.42
Resolución de ambigüedad en yacc (2/2
El generador no informa sobre si lo que hacemos es
correcto o no.
Es un recurso manual
de cierto riesgo,
incompletamente documentado (conflictos
múltiples).
A usar sólo en casos típicos de ambigüedad.
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.43
Formato de un fichero bison
Declaraciones en C entre %{ y %}
Declaraciones especiales comenzadas por
%
%%
Secuencia de reglas BNF, con acciones en C entre llaves
que se ejecutarán al alcanzar ese punto el análisis:
Normalmente al final de la regla (al reducir, pues)
En otro punto de la parte derecha: bison inserta
allí un nuevo símbolo ad-hoc Ih y añade una regla
Ih →ε (tras cuya reducción se ejecutan las acciones),
lo que puede introducir conflictos
%%
Rutinas auxiliares —al menos yyerror(char*)— y/o main
si programa independiente
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.44
Generación
micomp.y
bison micomp.tab.c gcc
-d
-v micomp.output
micomp
micomp.tab.h
milex.l
flex
lex.yy.c
1.
2.
Editamos un fichero de especificación micomp.y
Normalmente junto con un analizador léxico flex
(con #include “micomp.tab.h”):
2.1 bison -d micomp.y
2.2 flex milex.l
3. Si usamos main() que llame a yyparse():
gcc -o micomp micomp.tab.c lex.yy.c -lfl
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.45
Contenido de micomp.tab.c
1.
2.
3.
Declaraciones C iniciales copiadas
Función yyparse() que analiza entrada según tabla
LALR(1):
Invoca yylex() automáticamente (códigos de
símbolos en micomp.tab.h)
En caso de error invoca yyerror(char*) e intenta
recuperación (resincronización)
Va ejecutando los bloques de código C en el
orden de avance-reducción
Rutinas auxiliares copiadas
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.46
Símbolos y declaraciones
Los símbolos terminales pueden aparecer como:
Caracter entre apóstrofos
Nombre (al que bison asocia un código), que hay
que declarar p.e.: %token NOMBRE
Posibilidad de declarar operadores en orden de menor a
mayor precedencia, indicando asociatividad: %left,
%right ó %nonassoc NOMBRE
Para asociar precedencia/asociatividad a una regla se le
añade %prec NOMBRE (es posible definir token auxiliar)
%start nombre S
permite declarar el símbolo inicial
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.47
Reglas y valores (atributos) de símbolos
Formato reglas BNF: A : X1 · · · Xn |...|...;
En las acciones, $i son atributos en la pila de análisis
asociados a Xi , y si i =0,-1,..., corresponden a
posiciones de la pila hacia el fondo. Normalmente
$$ (correspondiente a A) se calcula a partir de $i
En flex ponemos el valor (¡no el código!) del
token en yylval de tipo YYSTYPE
Podemos hacer YYSTYPE distinto de int, declarando
%union {....} y asociamos:
%token <campo¿nomb term (o %left, etc.)
%type <campo¿nomb noterm1,nomb noterm2,...
Podemos usar asimismo $<campo¿i para $i (ídem $$)
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.48
Algunas acciones especiales
la ponemos a 6= 0 para que se visualice el
análisis (precisa #define YYDEBUG 1 u opción -t)
YYABORT,YYACCEPT: terminan el analizador con
indicación de fracaso o éxito (0)
YYERROR: fuerza iniciar recuperación de error
Se puede llamar antes a yyerror(“...”)
yyerrok: fuerza retorno a modo no-error
yyclearin: borra antigua ventana errónea tras
recuperación
YYRECOVERING(): devuelve 6= 0 si está en modo error
yydebug:
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.49
Detección de errores en LR y bison
LR detecta error en cuanto (tras un avance) la
secuencia pila más ventana deja de ser legal
(detección inmediata de errores)
Debido a la fusión de estados, LALR sólo garantiza
que la pila es legal. Se permiten reducciones
adicionales, pero no se avanza en la entrada más allá
de lo que lo haría LR (prefijo correcto).
Las compactaciones de tabla de bison permiten
algunas reducciones más, pero conservan la
propiedad de prefijo correcto.
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.50
Tratamiento de errores en bison
El token especial error en partes derechas posibilita cierta
recuperación ante errores.
Mecanismo ante error (vía YYERROR entra por 2):
1.
Invoca yyerror(“parse error”)
2.
Mientras no pueda avanzar un token error, elimina el
estado en la cima de la pila. Avanza el token error.
3.
Mientras no pueda reanudar el análisis, elimina el terminal
de la ventana y lee el siguiente. Reanuda el análisis.
4.
Si consigue avanzar 3 terminales seguidos sin nuevo error:
fin de la recuperación. Si no, vuelve al punto 2.
5.
Si se acaba la pila, aborta análisis
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.51
Ejemplo bison (1/3)
/* miint.y: evaluador de lista de expresiones */
%{
#include <stdio.h>
extern FILE *yyin;
/* declarado en léxico */
extern int numlin;
/* léxico le da valores */
int yydebug=1;
/* modo debug si -t */
%}
%union { float real; int entero; }
%token <real> REAL
%token <entero> ENTERO
%type <real> exp
%left ’-’
%left ’*’
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.52
Ejemplo bison (2/3)
%%
lista : exp {printf("%f\n", $1);} ’;’ lista
|
/* admite 0 expresiones */
| error ’;’ {printf(" en expresion\n");} lista
;
exp
:
|
|
|
|
;
exp ’-’ exp
exp ’*’ exp
’(’ exp ’)’
REAL
ENTERO
{$$
{$$
{$$
{$$
{$$
=
=
=
=
=
$1 - $3;}
$1 * $3;}
$2;}
$1;}
$1;}
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.53
Ejemplo bison (3/3)
%%
int main(int argc, char** argv) {
if (argc>1) yyin=fopen(argv[1],"r");
yyparse();
}
void yyerror(char* mens) {
printf("Error en linea %i: %s ",numlin,mens);
}
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.54
Ejemplo bison: fichero flex asociado
%{
#include "miint.tab.h"
int numlin=1;
%}
dig [0-9]
%%
{dig}+
{yylval.entero=atoi(yytext); return ENTER
{dig}+\.{dig}+ {yylval.real=atof(yytext); return REAL;}
\n
numlin++;
[ \t] |
ˆ#.*
[*-;()]
return yytext[0];
.
yyerror("error lexico");
%%
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.55
Conclusión
LR(1) y LALR(1) permiten considerable flexibilidad
para definir una gramática
Es necesario usar un generador automático, dada la
complejidad del cálculo
Restricciones al orden en que se ejecutan las
acciones semánticas y flujo de valores de atributos
Más información en info bison y en libro “lex &
yacc”, de Levine et al. (681.3.06)
c
Generación de analizador sintáctico ascendente v1.1 2005
José Fortes Gálvez– p.56
Descargar