Generación de analizador sintáctico ascendente

131
Generación de analizador sintáctico ascendente Yacc (bison, . . . ) Generaci´ on de analizador sint´ actico ascendente v1.1 c 2005 Jos´ e Fortes G´ alvez– p.1

Transcript of Generación de analizador sintáctico ascendente

Page 1: Generación de analizador sintáctico ascendente

Generación de analizador sintácticoascendente

Yacc (bison, . . . )

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.1

Page 2: Generación de analizador sintáctico ascendente

Reconocedor de avance-reducción

Planteamiento clásico, originado por limitaciones dememoria y velocidad, hoy en parte superadas:

Lectura del texto fuente de izquierda a derecha

Ascendente [bottom-up]: construcción del árbolsintá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 partederecha (pivote [handle])

• Limitado tamaño de la ventana [lookahead] decontexto derecho usada en la decisión

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.2

Page 3: Generación de analizador sintáctico ascendente

Ejemplo de avance-reducción

a

A b

B c

d

e f

C

D

E F

S

Entrada = abcdef

Pila vacía

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.3

Page 4: Generación de analizador sintáctico ascendente

Ejemplo de avance-reducción

a

A b

B c

d

e f

C

D

E F

S

Avanza

Pila = a

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.3

Page 5: Generación de analizador sintáctico ascendente

Ejemplo de avance-reducción

a

A b

B c

d

e f

C

D

E F

S

Reduce A→aPila = A

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.3

Page 6: Generación de analizador sintáctico ascendente

Ejemplo de avance-reducción

a

A b

B c

d

e f

C

D

E F

S

Avanza

Pila = Ab

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.3

Page 7: Generación de analizador sintáctico ascendente

Ejemplo de avance-reducción

a

A b

B c

d

e f

C

D

E F

S

Reduce B→AbPila = B

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.3

Page 8: Generación de analizador sintáctico ascendente

Ejemplo de avance-reducción

a

A b

B c

d

e f

C

D

E F

S

Avanza

Pila = Bc

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.3

Page 9: Generación de analizador sintáctico ascendente

Ejemplo de avance-reducción

a

A b

B c

d

e f

C

D

E F

S

Avanza

Pila = Bcd

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.3

Page 10: Generación de analizador sintáctico ascendente

Ejemplo de avance-reducción

a

A b

B c

d

e f

C

D

E F

S

Avanza.

Pila = Bcde

(Secuencia de prefijos de

partes derechas)

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.3

Page 11: Generación de analizador sintáctico ascendente

Ejemplo de avance-reducción

a

A b

B c

d

e f

C

D

E F

S

Avanza

Pila = Bcdef

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.3

Page 12: Generación de analizador sintáctico ascendente

Ejemplo de avance-reducción

a

A b

B c

d

e f

D

E F

S

C

Reduce C→efPila = BcdC

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.3

Page 13: Generación de analizador sintáctico ascendente

Ejemplo de avance-reducción

a

A b

B c

d

e f

D

E F

S

C

Reduce D→CPila = BcdD

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.3

Page 14: Generación de analizador sintáctico ascendente

Ejemplo de avance-reducción

a

A b

B c

d

e f

D

E F

S

C

Reduce E→dDPila = BcE

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.3

Page 15: Generación de analizador sintáctico ascendente

Ejemplo de avance-reducción

a

A b

B c

d

e f

D

E F

S

C

Reduce F→εPila = BcEF

(Pila crece sin consumir

entrada)

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.3

Page 16: Generación de analizador sintáctico ascendente

Ejemplo de avance-reducción

a

A b

B c

d

e f

D

E F

S

C

Reduce S→BcEFPila = S

(Fin del reconocimiento)

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.3

Page 17: Generación de analizador sintáctico ascendente

Implicaciones del avance-reducción

Reducciones en orden inverso de derivación derecha[rightmost]

Las secuencias de símbolos ya cubiertos (pero noreducidos):

son el “frente de avance” en la construcción(virtual) del árbol,son prefijos de forma sentencial derecha (prefijosviables)evolucionan como pila LIFO (todo prefijo de p.v.es p.v.), ycomponen globalmente un lenguaje regularpor tanto, podemos construir un AFD, llamadoautómata LR

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.4

Page 18: Generación de analizador sintáctico ascendente

Subárbol restante

Normalmente existirán múltiples subárboles restantes compatibles con

pila+ventana. Conforme se avanza se contruye el único correcto.

Pila = α1 · · ·αmαResto entrada = y

= xxm · · ·x1

Ventana = k : y ?

α1

α

αm

α2

top k : y

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.5

Page 19: Generación de analizador sintáctico ascendente

Subárbol restante

Normalmente existirán múltiples subárboles restantes compatibles con

pila+ventana. Conforme se avanza se contruye el único correcto.

Pila = α1 · · ·αmαResto entrada = y = xxm · · ·x1

Ventana = k : y

β1

β2

α1

β

x x2 x1xm

βm

α

A1

A2

Am−1

Amαm

S

α2

top

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.5

Page 20: Generación de analizador sintáctico ascendente

Subárbol restante

Los posibles árboles restantes sólo dependen de la pila,no de la sección de la entrada que ésta deriva.

Pila = α1 · · ·αmαResto entrada = y

= xxm · · ·x1

Ventana = k : y

β1

β2

α1

β

x x2 x1xm

βm

α

A1

A2

Am−1

Amαm

S

α2

top

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.5

Page 21: Generación de analizador sintáctico ascendente

Ejemplo de AFD LR con k = 1

ac: S’→Sr1: S→S-Tr2: S→Tr3: T→(S)r4: T→a

$-) r2

7 9

6 8

1

3

2

5

4

T

a

(

S

T(

a

(

S )

T

$-)

r4

$-) r3

$-) r1

-

-

a

ac$

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.6

Page 22: Generación de analizador sintáctico ascendente

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 alestado actual y k terminales siguientes

Por construcción, a cada estado le corresponde unúnico símbolo entrante

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.7

Page 23: Generación de analizador sintáctico ascendente

Ejemplo de tabla LR

$ - ( ) a S T

1 4 5 2 3

2 ac 6

3 r2 r2 r2

4 4 5 7 3

5 r4 r4 r4

6 4 5 8

7 6 9

8 r1 r1 r1

9 r3 r3 r3

long. sımb.

r1 3 S

r2 1 S

r3 3 T

r4 1 T

AFD y gramáticaGeneracion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.8

Page 24: Generación de analizador sintáctico ascendente

Utilización de la tabla LR

Para evitar repetir ineficientemente la lectura de lapila, en lugar de pila de símbolos se utiliza pila deestados

Toda transición implica empilar el nuevo estadoTerminales: se lee nuevo símbolo (avance)

Reducción:1. Se desempilan tantos estados como símbolos

tiene la parte derecha de la regla2. Se realiza transición desde el estado que resulta

en la cima con el símbolo no terminal de la parteizquierda de la regla

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.9

Page 25: Generación de analizador sintáctico ascendente

Ejemplo de reconocimiento LR

$ - ( ) a S T

1 4 5 2 3

S 2 ac 6

T 3 (1,S) (1,S) (1,S)

( 4 4 5 7 3

a 5 (1,T) (1,T) (1,T)

- 6 4 5 8

S 7 6 9

T 8 (3,S) (3,S) (3,S)

) 9 (3,T) (3,T) (3,T)

AFD y gramática

Fin del reconocimiento.

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.10

Page 26: Generación de analizador sintáctico ascendente

Ejemplo de reconocimiento LR

$ - ( ) a S T

1 4 5 2 3

S 2 ac 6

T 3 (1,S) (1,S) (1,S)

( 4 4 5 7 3

a 5 (1,T) (1,T) (1,T)

- 6 4 5 8

S 7 6 9

T 8 (3,S) (3,S) (3,S)

) 9 (3,T) (3,T) (3,T)

AFD y gramática

Pila Resto entrada Decision1 a-(a-a)$

Fin del reconocimiento.

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.10

Page 27: Generación de analizador sintáctico ascendente

Ejemplo de reconocimiento LR

$ - ( ) a S T

1 4 5 2 3

S 2 ac 6

T 3 (1,S) (1,S) (1,S)

( 4 4 5 7 3

a 5 (1,T) (1,T) (1,T)

- 6 4 5 8

S 7 6 9

T 8 (3,S) (3,S) (3,S)

) 9 (3,T) (3,T) (3,T)

AFD y gramática

Pila Resto entrada Decision1 a-(a-a)$ Avanzar15 -(a-a)$

Fin del reconocimiento.

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.10

Page 28: Generación de analizador sintáctico ascendente

Ejemplo de reconocimiento LR

$ - ( ) a S T

1 4 5 2 3

S 2 ac 6

T 3 (1,S) (1,S) (1,S)

( 4 4 5 7 3

a 5 (1,T) (1,T) (1,T)

- 6 4 5 8

S 7 6 9

T 8 (3,S) (3,S) (3,S)

) 9 (3,T) (3,T) (3,T)

AFD y gramática

Pila Resto entrada Decision1 a-(a-a)$ Avanzar15 -(a-a)$ Red. T→a13 -(a-a)$

Fin del reconocimiento.

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.10

Page 29: Generación de analizador sintáctico ascendente

Ejemplo de reconocimiento LR

$ - ( ) a S T

1 4 5 2 3

S 2 ac 6

T 3 (1,S) (1,S) (1,S)

( 4 4 5 7 3

a 5 (1,T) (1,T) (1,T)

- 6 4 5 8

S 7 6 9

T 8 (3,S) (3,S) (3,S)

) 9 (3,T) (3,T) (3,T)

AFD y gramática

Pila Resto entrada Decision1 a-(a-a)$ Avanzar15 -(a-a)$ Red. T→a13 -(a-a)$ Red. S→T12 -(a-a)$

Fin del reconocimiento.

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.10

Page 30: Generación de analizador sintáctico ascendente

Ejemplo de reconocimiento LR

$ - ( ) a S T

1 4 5 2 3

S 2 ac 6

T 3 (1,S) (1,S) (1,S)

( 4 4 5 7 3

a 5 (1,T) (1,T) (1,T)

- 6 4 5 8

S 7 6 9

T 8 (3,S) (3,S) (3,S)

) 9 (3,T) (3,T) (3,T)

AFD y gramática

Pila Resto entrada Decision1 a-(a-a)$ Avanzar15 -(a-a)$ Red. T→a13 -(a-a)$ Red. S→T12 -(a-a)$ Avanzar126 (a-a)$

Fin del reconocimiento.

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.10

Page 31: Generación de analizador sintáctico ascendente

Ejemplo de reconocimiento LR

$ - ( ) a S T

1 4 5 2 3

S 2 ac 6

T 3 (1,S) (1,S) (1,S)

( 4 4 5 7 3

a 5 (1,T) (1,T) (1,T)

- 6 4 5 8

S 7 6 9

T 8 (3,S) (3,S) (3,S)

) 9 (3,T) (3,T) (3,T)

AFD y gramática

Pila Resto entrada Decision1 a-(a-a)$ Avanzar15 -(a-a)$ Red. T→a13 -(a-a)$ Red. S→T12 -(a-a)$ Avanzar126 (a-a)$ Avanzar1264 a-a)$

Fin del reconocimiento.

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.10

Page 32: Generación de analizador sintáctico ascendente

Ejemplo de reconocimiento LR

$ - ( ) a S T

1 4 5 2 3

S 2 ac 6

T 3 (1,S) (1,S) (1,S)

( 4 4 5 7 3

a 5 (1,T) (1,T) (1,T)

- 6 4 5 8

S 7 6 9

T 8 (3,S) (3,S) (3,S)

) 9 (3,T) (3,T) (3,T)

AFD y gramática

Pila Resto entrada Decision1 a-(a-a)$ Avanzar15 -(a-a)$ Red. T→a13 -(a-a)$ Red. S→T12 -(a-a)$ Avanzar126 (a-a)$ Avanzar1264 a-a)$ Avanzar12645 -a)$

Fin del reconocimiento.

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.10

Page 33: Generación de analizador sintáctico ascendente

Ejemplo de reconocimiento LR

$ - ( ) a S T

1 4 5 2 3

S 2 ac 6

T 3 (1,S) (1,S) (1,S)

( 4 4 5 7 3

a 5 (1,T) (1,T) (1,T)

- 6 4 5 8

S 7 6 9

T 8 (3,S) (3,S) (3,S)

) 9 (3,T) (3,T) (3,T)

AFD y gramática

Pila Resto entrada Decision1 a-(a-a)$ Avanzar15 -(a-a)$ Red. T→a13 -(a-a)$ Red. S→T12 -(a-a)$ Avanzar126 (a-a)$ Avanzar1264 a-a)$ Avanzar12645 -a)$ Red. T→a12643 -a)$

Fin del reconocimiento.

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.10

Page 34: Generación de analizador sintáctico ascendente

Ejemplo de reconocimiento LR

$ - ( ) a S T

1 4 5 2 3

S 2 ac 6

T 3 (1,S) (1,S) (1,S)

( 4 4 5 7 3

a 5 (1,T) (1,T) (1,T)

- 6 4 5 8

S 7 6 9

T 8 (3,S) (3,S) (3,S)

) 9 (3,T) (3,T) (3,T)

AFD y gramática

Pila Resto entrada Decision1 a-(a-a)$ Avanzar15 -(a-a)$ Red. T→a13 -(a-a)$ Red. S→T12 -(a-a)$ Avanzar126 (a-a)$ Avanzar1264 a-a)$ Avanzar12645 -a)$ Red. T→a12643 -a)$ Red. S→T12647 -a)$

Fin del reconocimiento.

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.10

Page 35: Generación de analizador sintáctico ascendente

Ejemplo de reconocimiento LR

$ - ( ) a S T

1 4 5 2 3

S 2 ac 6

T 3 (1,S) (1,S) (1,S)

( 4 4 5 7 3

a 5 (1,T) (1,T) (1,T)

- 6 4 5 8

S 7 6 9

T 8 (3,S) (3,S) (3,S)

) 9 (3,T) (3,T) (3,T)

AFD y gramática

Pila Resto entrada Decision1 a-(a-a)$ Avanzar15 -(a-a)$ Red. T→a13 -(a-a)$ Red. S→T12 -(a-a)$ Avanzar126 (a-a)$ Avanzar1264 a-a)$ Avanzar12645 -a)$ Red. T→a12643 -a)$ Red. S→T12647 -a)$ Avanzar126476 a)$

Fin del reconocimiento.

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.10

Page 36: Generación de analizador sintáctico ascendente

Ejemplo de reconocimiento LR

$ - ( ) a S T

1 4 5 2 3

S 2 ac 6

T 3 (1,S) (1,S) (1,S)

( 4 4 5 7 3

a 5 (1,T) (1,T) (1,T)

- 6 4 5 8

S 7 6 9

T 8 (3,S) (3,S) (3,S)

) 9 (3,T) (3,T) (3,T)

AFD y gramática

Pila Resto entrada Decision1 a-(a-a)$ Avanzar15 -(a-a)$ Red. T→a13 -(a-a)$ Red. S→T12 -(a-a)$ Avanzar126 (a-a)$ Avanzar1264 a-a)$ Avanzar12645 -a)$ Red. T→a12643 -a)$ Red. S→T12647 -a)$ Avanzar126476 a)$ Avanzar1264765 )$

Fin del reconocimiento.

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.10

Page 37: Generación de analizador sintáctico ascendente

Ejemplo de reconocimiento LR

$ - ( ) a S T

1 4 5 2 3

S 2 ac 6

T 3 (1,S) (1,S) (1,S)

( 4 4 5 7 3

a 5 (1,T) (1,T) (1,T)

- 6 4 5 8

S 7 6 9

T 8 (3,S) (3,S) (3,S)

) 9 (3,T) (3,T) (3,T)

AFD y gramática

Pila Resto entrada Decision1 a-(a-a)$ Avanzar15 -(a-a)$ Red. T→a13 -(a-a)$ Red. S→T12 -(a-a)$ Avanzar126 (a-a)$ Avanzar1264 a-a)$ Avanzar12645 -a)$ Red. T→a12643 -a)$ Red. S→T12647 -a)$ Avanzar126476 a)$ Avanzar1264765 )$ Red. T→a1264768 )$

Fin del reconocimiento.

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.10

Page 38: Generación de analizador sintáctico ascendente

Ejemplo de reconocimiento LR

$ - ( ) a S T

1 4 5 2 3

S 2 ac 6

T 3 (1,S) (1,S) (1,S)

( 4 4 5 7 3

a 5 (1,T) (1,T) (1,T)

- 6 4 5 8

S 7 6 9

T 8 (3,S) (3,S) (3,S)

) 9 (3,T) (3,T) (3,T)

AFD y gramática

Pila Resto entrada Decision1 a-(a-a)$ Avanzar15 -(a-a)$ Red. T→a13 -(a-a)$ Red. S→T12 -(a-a)$ Avanzar126 (a-a)$ Avanzar1264 a-a)$ Avanzar12645 -a)$ Red. T→a12643 -a)$ Red. S→T12647 -a)$ Avanzar126476 a)$ Avanzar1264765 )$ Red. T→a1264768 )$ Red. S→S-T12647 )$

Fin del reconocimiento.

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.10

Page 39: Generación de analizador sintáctico ascendente

Ejemplo de reconocimiento LR

$ - ( ) a S T

1 4 5 2 3

S 2 ac 6

T 3 (1,S) (1,S) (1,S)

( 4 4 5 7 3

a 5 (1,T) (1,T) (1,T)

- 6 4 5 8

S 7 6 9

T 8 (3,S) (3,S) (3,S)

) 9 (3,T) (3,T) (3,T)

AFD y gramática

Pila Resto entrada Decision1 a-(a-a)$ Avanzar15 -(a-a)$ Red. T→a13 -(a-a)$ Red. S→T12 -(a-a)$ Avanzar126 (a-a)$ Avanzar1264 a-a)$ Avanzar12645 -a)$ Red. T→a12643 -a)$ Red. S→T12647 -a)$ Avanzar126476 a)$ Avanzar1264765 )$ Red. T→a1264768 )$ Red. S→S-T12647 )$ Avanzar126479 $

Fin del reconocimiento.

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.10

Page 40: Generación de analizador sintáctico ascendente

Ejemplo de reconocimiento LR

$ - ( ) a S T

1 4 5 2 3

S 2 ac 6

T 3 (1,S) (1,S) (1,S)

( 4 4 5 7 3

a 5 (1,T) (1,T) (1,T)

- 6 4 5 8

S 7 6 9

T 8 (3,S) (3,S) (3,S)

) 9 (3,T) (3,T) (3,T)

AFD y gramática

Pila Resto entrada Decision1 a-(a-a)$ Avanzar15 -(a-a)$ Red. T→a13 -(a-a)$ Red. S→T12 -(a-a)$ Avanzar126 (a-a)$ Avanzar1264 a-a)$ Avanzar12645 -a)$ Red. T→a12643 -a)$ Red. S→T12647 -a)$ Avanzar126476 a)$ Avanzar1264765 )$ Red. T→a1264768 )$ Red. S→S-T12647 )$ Avanzar126479 $ Red. T→(S)1268 $

Fin del reconocimiento.

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.10

Page 41: Generación de analizador sintáctico ascendente

Ejemplo de reconocimiento LR

$ - ( ) a S T

1 4 5 2 3

S 2 ac 6

T 3 (1,S) (1,S) (1,S)

( 4 4 5 7 3

a 5 (1,T) (1,T) (1,T)

- 6 4 5 8

S 7 6 9

T 8 (3,S) (3,S) (3,S)

) 9 (3,T) (3,T) (3,T)

AFD y gramática

Pila Resto entrada Decision1 a-(a-a)$ Avanzar15 -(a-a)$ Red. T→a13 -(a-a)$ Red. S→T12 -(a-a)$ Avanzar126 (a-a)$ Avanzar1264 a-a)$ Avanzar12645 -a)$ Red. T→a12643 -a)$ Red. S→T12647 -a)$ Avanzar126476 a)$ Avanzar1264765 )$ Red. T→a1264768 )$ Red. S→S-T12647 )$ Avanzar126479 $ Red. T→(S)1268 $ Red. S→S-T12 $

Fin del reconocimiento.

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.10

Page 42: Generación de analizador sintáctico ascendente

Ejemplo de reconocimiento LR

$ - ( ) a S T

1 4 5 2 3

S 2 ac 6

T 3 (1,S) (1,S) (1,S)

( 4 4 5 7 3

a 5 (1,T) (1,T) (1,T)

- 6 4 5 8

S 7 6 9

T 8 (3,S) (3,S) (3,S)

) 9 (3,T) (3,T) (3,T)

AFD y gramática

Pila Resto entrada Decision1 a-(a-a)$ Avanzar15 -(a-a)$ Red. T→a13 -(a-a)$ Red. S→T12 -(a-a)$ Avanzar126 (a-a)$ Avanzar1264 a-a)$ Avanzar12645 -a)$ Red. T→a12643 -a)$ Red. S→T12647 -a)$ Avanzar126476 a)$ Avanzar1264765 )$ Red. T→a1264768 )$ Red. S→S-T12647 )$ Avanzar126479 $ Red. T→(S)1268 $ Red. S→S-T12 $ Aceptar

Fin del reconocimiento.

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.10

Page 43: Generación de analizador sintáctico ascendente

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).

Am→α•ββ1

β2

α1

β

x x2 x1xm

βm

α

A1

A2

Am−1

Amαm

S

α2

top

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.11

Page 44: Generación de analizador sintáctico ascendente

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 “desecha-

rán” al progresar la lectura (distintos β y distintos A).

Am→α•βA′m→α′•β′A′′m→α′′•β′′.

.

.?

α1

α

αm

α2

top k : y

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.11

Page 45: Generación de analizador sintáctico ascendente

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 lositems 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 deA→α•Xβ a A→αX•β (núcleo [kernel], que identifica alestado)

2. Se calcula el cierre del núcleo

Estado inicial:

Cierre de S′→•SGeneracion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.12

Page 46: Generación de analizador sintáctico ascendente

Acciones del autómata LR(0)

A cada conjunto de items le asociamos un estado delAFD.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)

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.13

Page 47: Generación de analizador sintáctico ascendente

Ejemplo de items y acciones

a

A b

B c

d

e f

C

D

E F

S

S’→•SS→•BcEFB→•AbA→•a (Avanzar)

.

.

.Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.14

Page 48: Generación de analizador sintáctico ascendente

Ejemplo de items y acciones

a

A b

B c

d

e f

C

D

E F

S

A→a• (Reducir)

.

.

.

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.14

Page 49: Generación de analizador sintáctico ascendente

Ejemplo de items y acciones

a

A b

B c

d

e f

C

D

E F

S

B→A•b (Avanzar)

.

.

.

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.14

Page 50: Generación de analizador sintáctico ascendente

Ejemplo de items y acciones

a

A b

B c

d

e f

C

D

E F

S

B→Ab• (Reducir)

.

.

.

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.14

Page 51: Generación de analizador sintáctico ascendente

Ejemplo de items y acciones

a

A b

B c

d

e f

C

D

E F

S

S→B•cEF (Avanzar)

.

.

.

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.14

Page 52: Generación de analizador sintáctico ascendente

Ejemplo de items y acciones

a

A b

B c

d

e f

C

D

E F

S

S→Bc•EFE→•dD (Avanzar)

.

.

.

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.14

Page 53: Generación de analizador sintáctico ascendente

Ejemplo de items y acciones

a

A b

B c

d

e f

C

D

E F

S

E→d•DD→•CC→•ef (Avanzar)

.

.

.

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.14

Page 54: Generación de analizador sintáctico ascendente

Ejemplo de items y acciones

a

A b

B c

d

e f

C

D

E F

S

C→e•f (Avanzar)

.

.

.

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.14

Page 55: Generación de analizador sintáctico ascendente

Ejemplo de items y acciones

a

A b

B c

d

e f

C

D

E F

S

C→ef• (Reducir)

.

.

.

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.14

Page 56: Generación de analizador sintáctico ascendente

Ejemplo de items y acciones

a

A b

B c

d

e f

D

E F

S

C

D→C• (Reducir)

.

.

.

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.14

Page 57: Generación de analizador sintáctico ascendente

Ejemplo de items y acciones

a

A b

B c

d

e f

D

E F

S

C

E→dD• (Reducir)

.

.

.

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.14

Page 58: Generación de analizador sintáctico ascendente

Ejemplo de items y acciones

a

A b

B c

d

e f

D

E F

S

C

S→BcE•FF→• (Reducir)

.

.

.

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.14

Page 59: Generación de analizador sintáctico ascendente

Ejemplo de items y acciones

a

A b

B c

d

e f

D

E F

S

C

S→BcEF• (Reducir)

.

.

.

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.14

Page 60: Generación de analizador sintáctico ascendente

Ejemplo de items y acciones

a

A b

B c

d

e f

D

E F

S

C

S’→S• (Aceptar)

.

.

.

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.14

Page 61: Generación de analizador sintáctico ascendente

Autómata LR(0) con conflictos

E→E+T|TT→T*F|FF→(E)|a

Estado Items Transic. Acciones1 S’→•E E→•E+T E:2 Avanzar

E→•T T→•T*F T:3T→•F F:4F→•(E) (:5F→•a a:6

2 S’→E• AceptarE→E•+T +:7 Avanzar

3 E→T• Reducir E→TT→T•*F *:8 Avanzar

4 T→F• Reducir T→F5 F→(•E) E→•E+T E:9 Avanzar

E→•T T→•T*F T:3T→•F F:4F→•(E) (:5F→•a a:6

6 F→a• Reducir F→a7 E→E+•T T→•T*F T:10 Avanzar

T→•F F:4F→•(E) (:5F→•a a:6

8 T→T*•F F:11 AvanzarF→•(E) (:5F→•a a:6

9 F→(E•) ):12 AvanzarE→E•+T +:7

10 E→E+T• Reducir E→E+TT→T•*F *:8 Avanzar

11 T→T*F• Reducir T→T*F12 F→(E)• Reducir F→(E)

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.15

Page 62: Generación de analizador sintáctico ascendente

Autómata SLR(1) sin conflictos

E→E+T|TT→T*F|FF→(E)|a

Sımb. SiguientesS’ $E $,+,)T $,+,*,)F $,+,*,)

Estado Items Transic. Sımbolos:Acciones1 S’→•E E→•E+T E:2 (,a:Avanzar

E→•T T→•T*F T:3T→•F F:4F→•(E) (:5F→•a a:6

2 S’→E• $:AceptarE→E•+T +:7 +:Avanzar

3 E→T• $,+,):Reducir E→TT→T•*F *:8 *:Avanzar

4 T→F• $,+,*,):Reducir T→F5 F→(•E) E→•E+T E:9 (,a:Avanzar

E→•T T→•T*F T:3T→•F F:4F→•(E) (:5F→•a a:6

6 F→a• $,+,*,):Reducir F→a7 E→E+•T T→•T*F T:10 (,a:Avanzar

T→•F F:4F→•(E) (:5F→•a a:6

8 T→T*•F F:11 (,a:AvanzarF→•(E) (:5F→•a a:6

9 F→(E•) ):12 ),+:AvanzarE→E•+T +:7

10 E→E+T• $,+,):Reducir E→E+TT→T•*F *:8 *:Avanzar

11 T→T*F• $,+,*,):Reducir T→T*F12 F→(E)• $,+,*,):Reducir F→(E)

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.16

Page 63: Generación de analizador sintáctico ascendente

Tabla SLR(1) de GETF

ac: S’→Er1: E→E+Tr2: E→Tr3: T→T*Fr4: T→Fr5: F→(E)r6: F→a

$ + * ( ) a E T F1 5 6 2 3 42 ac 73 r2 r2 8 r24 r4 r4 r4 r45 5 6 9 3 46 r6 r6 r6 r67 5 6 10 48 5 6 119 7 1210 r1 r1 8 r111 r3 r3 r3 r312 r5 r5 r5 r5

Autómata y acciones

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.17

Page 64: Generación de analizador sintáctico ascendente

Autómata SLR(1) con conflicto

ac: S’→Sr1: S→E=Er2: S→fr3: E→Tr4: E→E+Tr5: T→fr6: T→T*f

Sımb. SiguientesS’ $S $E $,=,+T $,=,+,*

Estado Items Transic. Sımbolos:Acciones1 S’→•S S:2 f:Avanzar

S→•E=E E→•E+T E:3S→•f T→•f f:4E→•T T→•T*f T:5

2 S’→S• $:Aceptar3 S→E•=E =:6 =+:Avanzar

E→E•+T +:74 S→f• $:Reducir S→f

T→f• $=+*:Reducir T→f5 E→T• $=+:Reducir E→T

T→T•*f *:8 *:Avanzar6 S→E=•E E→•E+T E:9 f:Avanzar

E→•T T→•T*f T:5T→•f f:10

7 E→E+•T T→•T*f T:11 f:AvanzarT→•f f:10

8 T→T*•f f:12 f:Avanzar9 S→E=E• $:Reducir S→E=E

E→E•+T +:7 +:Avanzar10 T→f• $=+*:Reducir T→f11 E→E+T• $=+:Reducir E→E+T

T→T•*f *:8 *:Avanzar12 T→T*f• $=*+:Reducir T→T*f

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.18

Page 65: Generación de analizador sintáctico ascendente

Tabla SLR(1) con conflicto

ac: S’→Sr1: S→E=Er2: S→fr3: E→Tr4: E→E+Tr5: T→fr6: T→T*f

Sımb. SiguientesS’ $S $E $,=,+T $,=,+,*

$ = f + * S E T1 4 2 3 52 ac3 6 74 r2,r5 r5 r5 r55 r3 r3 r3 86 10 9 57 10 118 129 r1 710 r5 r5 r5 r511 r4 r4 r4 812 r6 r6 r6 r6

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.19

Page 66: Generación de analizador sintáctico ascendente

Autómata LR(0) de GSET

ac: S’→Sr1: S→E=Er2: S→fr3: E→Tr4: E→E+Tr5: T→fr6: T→T*f

Sımb. SiguientesS’ $S $E $,=,+T $,=,+,*

8

7 9

1

4

3

5

2

f

E

*

6

12

11

10

S

T

=

+

*

T

f

E

f

f

+

T

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.20

Page 67: Generación de analizador sintáctico ascendente

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 esapropiado 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 loscontextos: no es suficientemente discriminatoriopara las gramáticas no-SLR(1)

Entonces, es necesario un método que calcule lasventanas en conexión con el contexto izquierdo

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.21

Page 68: Generación de analizador sintáctico ascendente

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$

Am→α•β,w

β1

β2

α1

β

x

βm

α

A1

A2

Am−1

Amαm

S

α2

zmcima

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.22

Page 69: Generación de analizador sintáctico ascendente

Items LR(k). Cierre

Dado un ítem A→α•Bβ,w, donde w = k : z$

A→α•Bβ,w β1α1

β

A1

S

cima

x y

α B

βm

z

αmA

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.23

Page 70: Generación de analizador sintáctico ascendente

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

A→α•Bβ,w

B→•γ, v1

β1α1

β

A1

S

cima

x

γ

y

α B

βm

z

αmA

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.23

Page 71: Generación de analizador sintáctico ascendente

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

A→α•Bβ,w

B→•γ, v1

B→•γ, vn

β1α1

β

A1

S

cima

x

γ

y

α B

βm

z

αmA

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.23

Page 72: Generación de analizador sintáctico ascendente

Conjuntos de items LR(1)

Cierre:

Items de la forma A→α•Bβ, a: se añaden al conjuntolos items B→•γi, bj para cada regla B→γi y cadabj ∈ Pr(βa)

Transición con un símbolo X:

1. Se mueve el punto en los items con X: Se pasa deA→α•Xβ, b a A→αX•β, b (núcleo)

2. Se calcula el cierre del núcleo

Estado inicial:

Cierre de S′→•S, $

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.24

Page 73: Generación de analizador sintáctico ascendente

Acciones del autómata LR(1)

A cada conjunto de items le asociamos un estado delAFD.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′→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)

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.25

Page 74: Generación de analizador sintáctico ascendente

Ejemplo de items LR(1) y acciones

a

A b

B c

d

e f

C

D

E F

S

S’→•S,$S→•BcEF,$B→•Ab,cA→•a,b (Avanzar ante a)

.

.

.Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.26

Page 75: Generación de analizador sintáctico ascendente

Ejemplo de items LR(1) y acciones

a

A b

B c

d

e f

C

D

E F

S

A→a•,b (Reducir ante b)

.

.

.

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.26

Page 76: Generación de analizador sintáctico ascendente

Ejemplo de items LR(1) y acciones

a

A b

B c

d

e f

C

D

E F

S

B→A•b,c (Avanzar ante b)

.

.

.

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.26

Page 77: Generación de analizador sintáctico ascendente

Ejemplo de items LR(1) y acciones

a

A b

B c

d

e f

C

D

E F

S

B→Ab•,c (Reducir ante c)

.

.

.

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.26

Page 78: Generación de analizador sintáctico ascendente

Ejemplo de items LR(1) y acciones

a

A b

B c

d

e f

C

D

E F

S

S→B•cEF,$ (Avanzar ante c)

.

.

.

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.26

Page 79: Generación de analizador sintáctico ascendente

Ejemplo de items LR(1) y acciones

a

A b

B c

d

e f

C

D

E F

S

S→Bc•EF,$E→•dD,$ (Avanzar ante d)

.

.

.

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.26

Page 80: Generación de analizador sintáctico ascendente

Ejemplo de items LR(1) y acciones

a

A b

B c

d

e f

C

D

E F

S

E→d•D,$D→•C,$C→•ef,$ (Avanzar ante e)

.

.

.

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.26

Page 81: Generación de analizador sintáctico ascendente

Ejemplo de items LR(1) y acciones

a

A b

B c

d

e f

C

D

E F

S

C→e•f,$ (Avanzar ante f)

.

.

.

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.26

Page 82: Generación de analizador sintáctico ascendente

Ejemplo de items LR(1) y acciones

a

A b

B c

d

e f

C

D

E F

S

C→ef•,$ (Reducir ante $)

.

.

.

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.26

Page 83: Generación de analizador sintáctico ascendente

Ejemplo de items LR(1) y acciones

a

A b

B c

d

e f

D

E F

S

C

D→C•,$ (Reducir ante $)

.

.

.

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.26

Page 84: Generación de analizador sintáctico ascendente

Ejemplo de items LR(1) y acciones

a

A b

B c

d

e f

D

E F

S

C

E→dD•,$ (Reducir ante $)

.

.

.

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.26

Page 85: Generación de analizador sintáctico ascendente

Ejemplo de items LR(1) y acciones

a

A b

B c

d

e f

D

E F

S

C

S→BcE•F,$F→•,$ (Reducir ante $)

.

.

.

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.26

Page 86: Generación de analizador sintáctico ascendente

Ejemplo de items LR(1) y acciones

a

A b

B c

d

e f

D

E F

S

C

S→BcEF•,$ (Reducir ante $)

.

.

.

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.26

Page 87: Generación de analizador sintáctico ascendente

Ejemplo de items LR(1) y acciones

a

A b

B c

d

e f

D

E F

S

C

S’→S•,$ (Aceptar ante $)

.

.

.

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.26

Page 88: Generación de analizador sintáctico ascendente

Autómata LR(1)

ac: S’→Sr1: S→E=Er2: S→fr3: E→Tr4: E→E+Tr5: T→fr6: T→T*f

SLR(1)

Estado Items Transic. Sımbolos:Acciones1 S’→•S,$ S:2 f:Avanzar

S→•E=E,$ E→•E+T,=+ E:3S→•f,$ T→•f,=*+ f:4E→•T,=+ T→•T*f,=*+ T:5a

2 S’→S•,$ $:Aceptar3 S→E•=E,$ =:6 =+:Avanzar

E→E•+T,=+ +:7a4 S→f•,$ $:Reducir S→f

T→f•,=*+ =*+:Reducir T→f5a E→T•,=+ =+:Reducir E→T

T→T•*f,=*+ *:8a *:Avanzar5b E→T•,$+ $+:Reducir E→T

T→T•*f,$*+ *:8b *:Avanzar6 S→E=•E,$ E→•E+T,$+ E:9 f:Avanzar

E→•T,$+ T→•T*f,$*+ T:5bT→•f,$*+ f:10b

7a E→E+•T,=+ T→•T*f,=+* T:11a f:AvanzarT→•f,=+* f:10a

7b E→E+•T,$+ T→•T*f,$+* T:11b f:AvanzarT→•f,$+* f:10b

8a T→T*•f,=*+ f:12a f:Avanzar8b T→T*•f,$*+ f:12b f:Avanzar9 S→E=E•,$ $:Reducir S→E=E

E→E•+T,$+ +:7b +:Avanzar10a T→f•,=+* =+*:Reducir T→f10b T→f•,$*+ $*+:Reducir T→f11a E→E+T•,=+ =+:Reducir E→E+T

T→T•*f,=+* *:8a *:Avanzar11b E→E+T•,$+ $+:Reducir E→E+T

T→T•*f,$+* *:8b *:Avanzar12a T→T*f•,=*+ =*+:Reducir T→T*f12b T→T*f•,$*+ $*+:Reducir T→T*f

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.27

Page 89: Generación de analizador sintáctico ascendente

Autómata LR(1)

ac: S’→Sr1: S→E=Er2: S→fr3: E→Tr4: E→E+Tr5: T→fr6: T→T*f

SLR(1)

Estado Items Transic. Sımbolos:Acciones1 S’→•S,$ S:2 f:Avanzar

S→•E=E,$ E→•E+T,=+ E:3S→•f,$ T→•f,=*+ f:4E→•T,=+ T→•T*f,=*+ T:5a

2 S’→S•,$ $:Aceptar3 S→E•=E,$ =:6 =+:Avanzar

E→E•+T,=+ +:7a4 S→f•,$ $:Reducir S→f

T→f•,=*+ =*+:Reducir T→f5a E→T•,=+ =+:Reducir E→T

T→T•*f,=*+ *:8a *:Avanzar5b E→T•,$+ $+:Reducir E→T

T→T•*f,$*+ *:8b *:Avanzar6 S→E=•E,$ E→•E+T,$+ E:9 f:Avanzar

E→•T,$+ T→•T*f,$*+ T:5bT→•f,$*+ f:10b

7a E→E+•T,=+ T→•T*f,=+* T:11a f:AvanzarT→•f,=+* f:10a

7b E→E+•T,$+ T→•T*f,$+* T:11b f:AvanzarT→•f,$+* f:10b

8a T→T*•f,=*+ f:12a f:Avanzar8b T→T*•f,$*+ f:12b f:Avanzar9 S→E=E•,$ $:Reducir S→E=E

E→E•+T,$+ +:7b +:Avanzar10a T→f•,=+* =+*:Reducir T→f10b T→f•,$*+ $*+:Reducir T→f11a E→E+T•,=+ =+:Reducir E→E+T

T→T•*f,=+* *:8a *:Avanzar11b E→E+T•,$+ $+:Reducir E→E+T

T→T•*f,$+* *:8b *:Avanzar12a T→T*f•,=*+ =*+:Reducir T→T*f12b T→T*f•,$*+ $*+:Reducir T→T*f

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.27

Page 90: Generación de analizador sintáctico ascendente

Cierre LR(1) del estado 1

ac: S’→Sr1: S→E=Er2: S→fr3: E→Tr4: E→E+Tr5: T→fr6: T→T*f

S’→•S,$

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.28

Page 91: Generación de analizador sintáctico ascendente

Cierre LR(1) del estado 1

ac: S’→Sr1: S→E=Er2: S→fr3: E→Tr4: E→E+Tr5: T→fr6: T→T*f

S’→•S,$S→•E=E,$S→•f,$

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.28

Page 92: Generación de analizador sintáctico ascendente

Cierre LR(1) del estado 1

ac: S’→Sr1: S→E=Er2: S→fr3: E→Tr4: E→E+Tr5: T→fr6: T→T*f

S’→•S,$S→•E=E,$S→•f,$E→•T,=E→•E+T,=

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.28

Page 93: Generación de analizador sintáctico ascendente

Cierre LR(1) del estado 1

ac: S’→Sr1: S→E=Er2: S→fr3: E→Tr4: E→E+Tr5: T→fr6: T→T*f

S’→•S,$S→•E=E,$S→•f,$E→•T,=E→•E+T,=T→•f,=T→•T*F,=

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.28

Page 94: Generación de analizador sintáctico ascendente

Cierre LR(1) del estado 1

ac: S’→Sr1: S→E=Er2: S→fr3: E→Tr4: E→E+Tr5: T→fr6: 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,+

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.28

Page 95: Generación de analizador sintáctico ascendente

Cierre LR(1) del estado 1

ac: S’→Sr1: S→E=Er2: S→fr3: E→Tr4: E→E+Tr5: T→fr6: 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,*

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.28

Page 96: Generación de analizador sintáctico ascendente

Cierre LR(1) del estado 1

ac: S’→Sr1: S→E=Er2: S→fr3: E→Tr4: E→E+Tr5: T→fr6: 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,+

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.28

Page 97: Generación de analizador sintáctico ascendente

Cierre LR(1) del estado 1

ac: S’→Sr1: S→E=Er2: S→fr3: E→Tr4: E→E+Tr5: T→fr6: 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,+

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.28

Page 98: Generación de analizador sintáctico ascendente

Cierre LR(1) del estado 1

ac: S’→Sr1: S→E=Er2: S→fr3: E→Tr4: E→E+Tr5: T→fr6: 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,+

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.28

Page 99: Generación de analizador sintáctico ascendente

Cierre LR(1) del estado 1

ac: S’→Sr1: S→E=Er2: S→fr3: E→Tr4: E→E+Tr5: T→fr6: 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,+

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.28

Page 100: Generación de analizador sintáctico ascendente

Cierre LR(1) del estado 1

ac: S’→Sr1: S→E=Er2: S→fr3: E→Tr4: E→E+Tr5: T→fr6: 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,+

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.28

Page 101: Generación de analizador sintáctico ascendente

Tabla LR(1) de GSET

ac: S’→Sr1: S→E=Er2: S→fr3: E→Tr4: E→E+Tr5: T→fr6: T→T*f

Tabla SLR(1)

Automata LR(0)

Automata LR(1)

$ = f + * S E T1 4 2 3 5a2 ac3 6 7a4 r2 r5 r5 r55a r3 r3 8a5b r3 r3 8b6 10b 9 5b7a 10a 11a7b 10b 11b8a 12a8b 12b9 r1 7b10a r5 r5 r510b r5 r5 r511a r4 r4 8a11b r4 r4 8b12a r6 r6 r612b r6 r6 r6

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.29

Page 102: Generación de analizador sintáctico ascendente

El problema del tamaño de LR(k)

Es el método más potente posible deavance-reducción con k símbolos de ventana

Calcula exactamente qué siguientes corresponden acada ítem de cada estado

Ello provoca una “explosión” de estados conforme kcrece

Tradicionalmente considerado inviable para k ≥ 1

Solución tradicional: LALR(1)

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.30

Page 103: Generación de analizador sintáctico ascendente

De LR(1) a LALR(1)

LR(1) replica los estados LR(0)Añadiendo distintas ventanasIgual parte LR(0) (corazón [core])

Si fusionamos estados LR(1) de igual corazónRecuperamos autómata LR(0)Conservamos parte de la información decontexto en las ventanas LR(1)

Conclusión:

LALR(1) de potencia intermedia entre LR(0) yLR(1)

Tradicionalmente considerado suficiente en lapráctica Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.31

Page 104: Generación de analizador sintáctico ascendente

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 seaplica un proceso iterativo:

El cálculo del cierre nos proporciona(inicialmente sólo algunos) valores para lasventanas de los ítemsSe propagan estos valores a través detransiciones y cierres

Se compacta la tabla con valores por defecto:Filas en zona de acción: reducción o error másfrecuente (da lugar a reducciones adicionales encaso de error)Columnas en zona de saltos: más frecuente

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.32

Page 105: Generación de analizador sintáctico ascendente

Autómata LALR(1)

ac: S’→Sr1: S→E=Er2: S→fr3: E→Tr4: E→E+Tr5: T→fr6: T→T*f

LR(1)

SLR(1)

Estado Items Transic. Sımbolos:Acciones1 S’→•S,$ S:2 f:Avanzar

S→•E=E,$ E→•E+T,=+ E:3S→•f,$ T→•f,=*+ f:4E→•T,=+ T→•T*f,=*+ T:5

2 S’→S•,$ $:Aceptar3 S→E•=E,$ =:6 =+:Avanzar

E→E•+T,=+ +:74 S→f•,$ $:Reducir S→f

T→f•,=*+ =*+:Reducir T→f5 E→T•,=+$ =+$:Reducir E→T

T→T•*f,=*+$ *:8 *:Avanzar6 S→E=•E,$ E→•E+T,$+ E:9 f:Avanzar

E→•T,$+ T→•T*f,$*+ T:5bT→•f,$*+ f:10b

7 E→E+•T,=+$ T→•T*f,=+*$ T:11 f:AvanzarT→•f,=+* f:10

8 T→T*•f,=*+$ f:12 f:Avanzar9 S→E=E•,$ $:Reducir S→E=E

E→E•+T,$+ +:7b +:Avanzar10 T→f•,=+*$ =+*$:Reducir T→f11 E→E+T•,=+$ =+$:Reducir E→E+T

T→T•*f,=+*$ *:8 *:Avanzar12 T→T*f•,=*+$ =*+$:Reducir T→T*f

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.33

Page 106: Generación de analizador sintáctico ascendente

Tabla LALR(1) de GSET

ac: S’→Sr1: S→E=Er2: S→fr3: E→Tr4: E→E+Tr5: T→fr6: T→T*f

Tabla LR(1)

Tabla SLR(1)

Aut. LR(0)

$ = f + * S E T1 4 2 3 52 ac3 6 74 r2 r5 r5 r55 r3 r3 r3 86 10 9 57 10 118 129 r1 710 r5 r5 r5 r511 r4 r4 r4 812 r6 r6 r6 r6

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.34

Page 107: Generación de analizador sintáctico ascendente

Familias de gramáticas LR, LALR y LL

LR(0)LALR(1)LALR(2)

LALR

LR(1)

LR(2)

LR

LL(1)

LL(2)

LL

Además, las SLR(k) están incluídas en LALR(k), y guardan la misma relación con las demás

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.35

Page 108: Generación de analizador sintáctico ascendente

Familias de lenguajes LR y LL

LR(0)

LL(1)

LL(2)

LLSLR(1)=· · · =LR

(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)

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.36

Page 109: Generación de analizador sintáctico ascendente

Ambigüedad y LALR

Todas las gramáticas LR son no-ambiguas (¡pero noal revés!)

Aunque el lenguaje a compilar sea no-ambiguo, aveces puede ser interesante usar una gramática mássimple pero ambigua

Ejemplo: if-then-else es típicamente LALRpero más natural y simple expresarlo de formaambiguainstr→if cond then instr

instr→if cond then instr else instr

instr→· · ·Ello provoca conflictos en la tabla LALR que elusuario puede intentar “resolver” manualmente

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.37

Page 110: Generación de analizador sintáctico ascendente

Tabla LALR(1) para gramática ambigua

ac: S’→Er1: E→E-Er2: E→E*Er3: E→(E)r4: E→a

$ - * ( ) a E1 3 4 22 ac 5 63 3 4 74 r4 r4 r4 r45 3 4 86 3 4 97 5 6 108 r1 r1,5 r1,6 r19 r2 r2,5 r2,6 r210 r3 r3 r3 r3

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.38

Page 111: Generación de analizador sintáctico ascendente

Autómata LALR(1) para gramáticaambigua

E→E-E|E*E|(E)|aEstado Items Transic. Sımbolos:Acciones1 S’→•E,$ E→•E-E,$-* E→•E*E,$-* E:2 (a:Avanzar

E→•(E),$-* (:3E→•a,$-* a:4

2 S’→E•,$ $:AceptarE→E•-E,$-* -:5 -*:AvanzarE→E•*E,$-* *:6

3 E→(•E),$-*) E→•E-E,)-* E→•E*E,)-* E:7 (a:AvanzarE→•(E),)-* (:3E→•a,)-* a:4

4 E→a•,$-*) $:Reducir E→a5 E→E-•E,$-*) E→•E-E,$-*) E→•E*E,$-*) E:8 (a:Avanzar

E→•(E),$-*) (:3E→•a,$-*) a:4

6 E→E*•E,$-*) E→•E-E,$-*) E→•E*E,$-*) E:9 (a:AvanzarE→•(E),$-*) (:3E→•a,$-*) a:4

7 E→(E•),$-*) ):10 )-*:AvanzarE→E•-E,)-* -:5E→E•*E,)-* *:6

8 E→E-E•,$-*) $-*):Reducir E→E-EE→E•-E,$-*) -:5 -*:AvanzarE→E•*E,$-*) *:6

9 E→E*E•,$-*) $-*):Reducir E→E*EE→E•-E,$-*) -:5 -*:AvanzarE→E•*E,$-*) *:6

10 E→(E)•,$-*) $-*):Reducir E→(E)

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.39

Page 112: Generación de analizador sintáctico ascendente

Estudio de casos conflictivos

Estado 8, ventana -

-E E - E

E

-E E -

E

E

Reducir Avanzar

E E

Items

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.40

Page 113: Generación de analizador sintáctico ascendente

Estudio de casos conflictivos

Estado 8, ventana *

-E E * E

E

-E E *

E

E

Reducir Avanzar

E E

Items

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.40

Page 114: Generación de analizador sintáctico ascendente

Estudio de casos conflictivos

Estado 9, ventana -

*E E - E

E

-

E

E

Reducir Avanzar

*E E

E E

Items

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.40

Page 115: Generación de analizador sintáctico ascendente

Estudio de casos conflictivos

Estado 9, ventana *

*E E * E

E

*

E

E

Reducir Avanzar

*E E

E E

Items

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.40

Page 116: Generación de analizador sintáctico ascendente

Tabla LALR(1) con ambigüedad resuelta

ac: S’→Er1: E→E-Er2: E→E*Er3: E→(E)r4: E→a

Tabla original

$ - * ( ) a E1 3 4 22 ac 5 63 3 4 74 r4 r4 r4 r45 3 4 86 3 4 97 5 6 108 r1 r1 6 r19 r2 r2 r2 r210 r3 r3 r3 r3

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.41

Page 117: Generación de analizador sintáctico ascendente

Resolución de ambigüedad en yacc (1/2)

En conflictos reducción-reducción se reduce la reglamás arriba en el texto

Para conflictos avance-reducción genera un avancepor defecto, pero podemos asociar a los símbolosterminales (y a las reglas):

Precedencia: cuál de dos terminales próximos dedistinta precedencia se reduce antesAsociatividad: en caso de igual precedencia, si sereduce primero (a) el de la izquierda, (b) el de laderecha ó (c) no es posible

Si no se especifica, la regla recibe mismos valoresque su terminal más a la derecha

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.42

Page 118: Generación de analizador sintáctico ascendente

Resolución de ambigüedad en yacc (2/2)

El generador no informa sobre si lo que hacemos escorrecto o no.

Es un recurso manualde cierto riesgo,incompletamente documentado (conflictosmúltiples).

A usar sólo en casos típicos de ambigüedad.

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.43

Page 119: Generación de analizador sintáctico ascendente

Formato de un fichero bison

Declaraciones en C entre %{ y %}

Declaraciones especiales comenzadas por %

%%

Secuencia de reglas BNF, con acciones en C entre llavesque 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 insertaallí un nuevo símbolo ad-hoc Ih y añade una reglaIh→ε (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 Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.44

Page 120: Generación de analizador sintáctico ascendente

Generaciónbison

micomp.tab.h

gccmicomp.tab.c

-d

-v

micomp.y

milex.l lex.yy.c

micomp

flex

micomp.output

1. Editamos un fichero de especificación micomp.y

2. 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

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.45

Page 121: Generación de analizador sintáctico ascendente

Contenido de micomp.tab.c

1. Declaraciones C iniciales copiadas

2. Función yyparse() que analiza entrada según tablaLALR(1):

Invoca yylex() automáticamente (códigos desímbolos en micomp.tab.h)En caso de error invoca yyerror(char*) e intentarecuperación (resincronización)Va ejecutando los bloques de código C en elorden de avance-reducción

3. Rutinas auxiliares copiadas

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.46

Page 122: Generación de analizador sintáctico ascendente

Símbolos y declaraciones

Los símbolos terminales pueden aparecer como:

Caracter entre apóstrofos

Nombre (al que bison asocia un código), que hayque declarar p.e.: %token NOMBRE

Posibilidad de declarar operadores en orden de menor amayor precedencia, indicando asociatividad: %left,%right ó %nonassoc NOMBRE

Para asociar precedencia/asociatividad a una regla se leañade %prec NOMBRE (es posible definir token auxiliar)

%start nombre S permite declarar el símbolo inicial

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.47

Page 123: Generación de analizador sintáctico ascendente

Reglas y valores (atributos) de símbolos

Formato reglas BNF: A : X1 · · ·Xn |...|...;

En las acciones, $i son atributos en la pila de análisisasociados a Xi, y si i =0,-1,..., corresponden aposiciones 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!) deltoken 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 $$)Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.48

Page 124: Generación de analizador sintáctico ascendente

Algunas acciones especiales

yydebug: la ponemos a 6= 0 para que se visualice elanálisis (precisa #define YYDEBUG 1 u opción -t)

YYABORT,YYACCEPT: terminan el analizador conindicació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 trasrecuperación

YYRECOVERING(): devuelve 6= 0 si está en modo error

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.49

Page 125: Generación de analizador sintáctico ascendente

Detección de errores en LR y bison

LR detecta error en cuanto (tras un avance) lasecuencia pila más ventana deja de ser legal(detección inmediata de errores)

Debido a la fusión de estados, LALR sólo garantizaque la pila es legal. Se permiten reduccionesadicionales, 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 permitenalgunas reducciones más, pero conservan lapropiedad de prefijo correcto.

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.50

Page 126: Generación de analizador sintáctico ascendente

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

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.51

Page 127: Generación de analizador sintáctico ascendente

Ejemplo bison (1/3)

/* miint.y: evaluador de lista de expresiones */

%{

#include <stdio.h>

extern FILE *yyin; /* declarado en lexico */

extern int numlin; /* lexico 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 ’*’

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.52

Page 128: Generación de analizador sintáctico ascendente

Ejemplo bison (2/3)

%%

lista : exp {printf("%f\n", $1);} ’;’ lista

| /* admite 0 expresiones */

| error ’;’ {printf(" en expresion\n");} lista

;

exp : exp ’-’ exp {$$ = $1 - $3;}

| exp ’*’ exp {$$ = $1 * $3;}

| ’(’ exp ’)’ {$$ = $2;}

| REAL {$$ = $1;}

| ENTERO {$$ = $1;}

;

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.53

Page 129: Generación de analizador sintáctico ascendente

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);

}

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.54

Page 130: Generación de analizador sintáctico ascendente

Ejemplo bison: fichero flex asociado

%{

#include "miint.tab.h"

int numlin=1;

%}

dig [0-9]

%%

{dig}+ {yylval.entero=atoi(yytext); return ENTERO;}

{dig}+\.{dig}+ {yylval.real=atof(yytext); return REAL;}

\n numlin++;

[ \t] |

ˆ#.*

[*-;()] return yytext[0];

. yyerror("error lexico");

%%

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.55

Page 131: Generación de analizador sintáctico ascendente

Conclusión

LR(1) y LALR(1) permiten considerable flexibilidadpara definir una gramática

Es necesario usar un generador automático, dada lacomplejidad del cálculo

Restricciones al orden en que se ejecutan lasacciones 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)

Generacion de analizador sintactico ascendente v1.1 c©2005 Jose Fortes Galvez– p.56