Está en la página 1de 141

Compiladores

Clasificacin de Gramticas y Manejo de Errores

Resumen
Repaso de parseo LR y algunas clarificaciones

Clasificacin de gramticas
Lenguajes LR

Eliminando Ambiguedad
Manejo de errores y recuperacin de errores

Oscar Bonilla

Universidad Galileo

LR(0) y LR(1), donde est el look ahead?


Tanto LR(0) como LR(1) tienen el mismo engine de ejecucin, la diferencia est en la construccin de la tabla de parseo
Entonces, dnde est el look ahead?

Oscar Bonilla

Universidad Galileo

LR(0) y LR(1), donde est el look ahead?


Shift sn
ve el smbolo de entrada, ya sea lo consume o termina de parsear (accept o error) no es un look ahead

Goto sn
slo ve el stack

Reduce n
LR(0) misma reduccin para todos los inputs no look ahead LR(1) necesitamos el smbolo de entrada un look ahead

Oscar Bonilla

Universidad Galileo

State s0 s1 s2 s3 s4 s5

( shift to s2 error shift to s2 error reduce (2) reduce (3)

ACTION ) error error shift to s5 shift to s4 reduce (2) reduce (3)

Goto $ error accept error error reduce (2) reduce (3) X goto s1 goto s3

LR(0)

State s0 s1 s2 s3 s4 s5 s6
Oscar Bonilla

( shift to s1 shift to s2 shift to s2 error error error error

ACTION ) reduce (5) reduce (5) reduce (5) shift to s4 reduce (4) error error

Goto $ reduce (5) reduce (5) reduce (5) error reduce (4) accept reduce (2)
5

SL (1)

X goto s5

Y goto s6 goto s3 goto s3

Universidad Galileo

Algunas Definiciones
Qu es una gramtica XY(k)? (X, Y {L, R}) Una gramtica G es una gramtica XY(k) si y slo si podemos crear una tabla de parseo XY(k) sin ningn conflicto shift/reduce o reduce/reduce

Oscar Bonilla

Universidad Galileo

Construccin de un Parse Engine LR(0)


Agregamos la produccin especial S S $ Encontramos los tems de la CFG Creamos el DFA
Comenzamos con el tem S S $ Usando las funciones closure y goto LR(0) Parser Engine

Construimos la tabla de parseo

Oscar Bonilla

Universidad Galileo

Construccin de un parse engine SLR(1)


Agregamos la produccin especial S S $ Calcular el conjunto follow para todos los noterminales Encontrar los tems LR(0) de la CFG Crear el DFA
Comenzamos con el tem S S $ Usando las funciones closure y goto SLR Parser Engine

Construir la tabla de parseo


Usando el DFA y la informacin del conjunto follow
Oscar Bonilla

Universidad Galileo

Construccin de un parse engine LR(1)


Agregamos la produccin especial S S $ Encontramos los tems LR(1) de la CFG Creamos el DFA
Comenzamos con el tem [S S $, ?] Usamos las funciones closure y goto
LR(1) Parser Engine

Construimos la tabla de parseo

Oscar Bonilla

Universidad Galileo

Resumen
Repaso de parseo LR y algunas clarificaciones

Clasificacin de gramticas
Lenguajes LR

Eliminando Ambiguedad
Manejo de errores y recuperacin de errores

Oscar Bonilla

10

Universidad Galileo

Clasificacin de Gramticas
Context free

Oscar Bonilla

11

Universidad Galileo

Clasificacin de Gramticas
Context free

G0 regular

Oscar Bonilla

12

Universidad Galileo

Gramticas Regulares
Una gramtica que puede ser expresada usando una expresin regular es una gramtica regular Lenguaje Ejemplo:
Cero o ms parntesis abiertos seguidos de cero o ms parntesis cerrados

G0 = { ( ) | a, b >= 0 } Gramtica
S XY$ X (X | Y )Y |
Oscar Bonilla

13

Universidad Galileo

Clasificacin de Gramticas
Context free

LR(0)

G0 regular

G1

Oscar Bonilla

14

Universidad Galileo

Gramticas LR(0)
Una gramtica que puede crear una tabla de parseo LR(0) sin ningn conflicto shift/reduce o reduce/reduce Lenguaje Ejemplo:
Uno o ms parntesis abiertos seguidos de un nmero igual de parntesis cerrados

G1 = { ( ) | n > 0 } La gramtica
<S> <X> $ <X> ( <X> ) | ( )
Oscar Bonilla

15

Universidad Galileo

Clasificacin de Gramticas
Context free

SLR(1) LR(0)

G0 regular

G1 G2

Oscar Bonilla

16

Universidad Galileo

Gramticas SLR(1)
Una gramtica que puede crear una tabla de parseo SLR(1) sin ningn conflicto shift/reduce o reduce/reduce Lenguaje Ejemplo:
Cero o ms parntesis abiertos seguidos de un nmero igual de parntesis cerrados

G2 = { ( ) | n >= 0 } La gramtica
<S> <X> $ <X> ( <X> ) |
Oscar Bonilla

17

Universidad Galileo

Clasificacin de Gramticas
Context free

LALR(1) SLR(1) LR(0)

G0 regular

G1 G2 G3

Oscar Bonilla

18

Universidad Galileo

Gramticas LALR(1)
Una gramtica que puede crear una tabla de parseo LALR(1) sin ningn conflicto shift/reduce o reduce/reduce Lenguaje Ejemplo:
???

G3 = { ??? } La gramtica

Oscar Bonilla

19

Universidad Galileo

Clasificacin de Gramticas
Context free

LR(1) LALR(1) SLR(1) LR(0)

G0 regular

G1 G2 G3 G4

Oscar Bonilla

20

Universidad Galileo

Gramticas LR(1)
Una gramtica que puede crear una tabla de parseo LR(1) sin ningn conflicto shift/reduce o reduce/reduce Lenguaje Ejemplo:
Cero o ms parntesis abiertos seguidos de un nmero igual de parntesis cerrados o un solo parntesis abierto

G4 = { ( ) | n >= 0 } { ( } La gramtica
<S> <X> $ <X> ( | <Y> <Y> ( <Y> ) |

Oscar Bonilla

21

Universidad Galileo

Clasificacin de Gramticas
Context free LR(k) LR(1) LALR(1) SLR(1) LR(0)

G0 regular

G1 G2 G3 G4 G5

Oscar Bonilla

22

Universidad Galileo

Gramticas LR(k)
Una gramtica que puede crear una tabla de parseo LR(k) sin ningn conflicto shift/reduce o reduce/reduce Lenguaje Ejemplo:
Cero o ms parntesis abiertos seguidos de un nmero igual de parntesis cerrados o un nmero igual de corchetes cerrados

G5 = { ( ) | n >= 0 } { ( ] | n >= 0 } La gramtica


<S> <X> <Y> <Z> <X> $ <Y> | <Z> ( <Y> ) | ( <Z> ] |

Oscar Bonilla

23

Universidad Galileo

Clasificacin de Gramticas
Context free unambiguous LR(k) LR(1) LALR(1) SLR(1) LR(0)

G0 regular

G1 G2 G3 G4 G5 G6

Oscar Bonilla

24

Universidad Galileo

Gramticas no Ambiguas
Una gramtica es no ambigua s y slo s tiene una secuencia de derivacin derecha (rightmost) nica (parse tree) Ejemplo: G6 = { [( ) | n >= 0 } { ]( ) La gramtica
<S> <X> <Y> <Z> <X> $ [ <Y> | ] <Z> ( <Y> ) | ( <Z> )) | n n n 2n

| n >= 0 }

Oscar Bonilla

25

Universidad Galileo

Clasificacin de Gramticas
Context free unambiguous LR(k) LR(1) LALR(1) SLR(1) LR(0)

G0 regular

G1 G2 G3 G4 G5 G6 G7

Oscar Bonilla

26

Universidad Galileo

Gramticas Ambiguas
Una gramtica es ambigua s y slo s tiene ms de una secuencia de derivacin por la derecha Ejemplo: i j k G7 = { ( ) ( | i = j or j = k } La gramtica
<S> <X> $ <X> <P> <Q> | <R> <S> <P> ( <P> ) | <Q> ( <Q> | <R> ( <R> | <S> ) <S> ( |
Oscar Bonilla

27

Universidad Galileo

Clasificacin de Gramticas
Context free unambiguous LR(k) LR(1) LALR(1) SLR(1) LR(0)

G0 regular

G1 G2 G3 G4 G5 G6 G7

Oscar Bonilla

28

Universidad Galileo

Clasificacin de Gramticas
Context free unambiguous LR(k) LR(1) LALR(1) SLR(1) LR(0)

G0 regular

G1 G2 G3 G4 G5 G6 G7

LL(0)

Oscar Bonilla

29

Universidad Galileo

Clasificacin de Gramticas
Context free unambiguous LR(k) LR(1) LALR(1) SLR(1) LR(0)

G0 regular

G1 G2 G3 G4 G5 G6 G7

LL(0) LL(1)

Oscar Bonilla

30

Universidad Galileo

Pregunta
Qu hay acerca del lenguaje? G8 = { ( ) ( | i = j = k }
i j k

Oscar Bonilla

31

Universidad Galileo

Resumen
Repaso de parseo LR y algunas clarificaciones

Clasificacin de gramticas
Lenguajes LR

Eliminando Ambiguedad
Manejo de errores y recuperacin de errores

Oscar Bonilla

32

Universidad Galileo

Lenguajes LR
Un lenguaje libre de contexto es un lenguaje LR s y slo s puede ser generado por una gramtica LR(k) para algn k

Oscar Bonilla

33

Universidad Galileo

Lenguajes LR
El conjunto de lenguajes LR es independiente de la distancia de lookahead k Dada cualquier gramtica LR(k) Gk, existe una gramtica LR(0) G0 tal que L(Gk) = L(G0) Para todos los lenguajes que vimos con gramticas SLR(1), LALR(1) y LR(1), podramos haber encontrado una gramtica LR(0)!!!
Oscar Bonilla

34

Universidad Galileo

Ejemplo
Lenguaje Cero o ms parntesis abiertos seguidos de un nmero igual de parntesis cerrados o un solo parntesis abierto

Gramtica LR(1)
<S> <X> <X> <Y> <Y>

<X> $ <Y> ( ( <Y> )

Hay alguna gramtica LR(0) para este lenguaje?

Oscar Bonilla

35

Universidad Galileo

26

Ejemplo Expandido DFA


<S> <X> <X> <Y> <Y>
s0

<X> $ <Y> ( ( <Y> ) (


s1 s2

<S> <X> <X> <Y> <Y>

<X> $ Y ( ( <Y> )

( Y

<X> <Y> <Y> <Y>

( ( <Y> ) ( <Y> )

<Y> ( <Y> ) <Y> ( <Y> ) <Y>

Y
s3

Y )
s4
<Y> ( <Y> )
Universidad Galileo

X
s5
<S> <X> $
Oscar Bonilla

<Y> ( <Y> )

s6

<X> <Y>
36

26

Ejemplo Expandido DFA


<S> <X> <X> <Y> <Y>
s0

<X> $ <Y> ( ( <Y> ) (


s1 s2

<S> <X> <X> <Y> <Y>

<X> $ Y ( ( <Y> )

( Y

<X> <Y> <Y> <Y>

( ( <Y> ) ( <Y> )

<Y> ( <Y> ) <Y> ( <Y> ) <Y>

Y
s3

Y )
s4
<Y> ( <Y> )
Universidad Galileo

X
s5
<S> <X> $
Oscar Bonilla

<Y> ( <Y> )

s6

<X> <Y>
37

Ejemplo
Lenguaje Cero o ms parntesis abiertos seguidos de un nmero igual de parntesis cerrados o un solo parntesis abierto

Gramtica LR(1)
<S> <X> <X> <Y> <Y>

<X> $ <Y> ( ( <Y> )

Gramtica LR(0)
<S> <X> <X> <X> <Y> <Y> <Z>
38

<X> $ <Y> ( <Z> <Z> ( <Y> ) <Z>


Universidad Galileo

Oscar Bonilla

DFA del Ejemplo


<S> <X> <X> <X> <Y> <Y> <Z> <X> $ <Y> ( <Z> <Z> ( <Y> ) <Z>

s7

<Z>

Z Z (

s2

s0
<S> <X> <X> <X> <Y> <Y>

<X> $ <Y> ( <Z> <Z> ( <Y> ) <Z>

Z
s1

<Y> ( <Y> ) <Y> ( <Y> ) <Y> <Z>

( Y
s6

<Y> <X> <Y> <Y>

( <Y> ) ( <Z> ( <Y> ) <Z>

Y
s3

Y )
s4
<Y> ( <Y> )
Universidad Galileo

X
s5
<S> <X> $
Oscar Bonilla

<Y> ( <Y> ) <X> <Y>


39

DFA del Ejemplo


<S> <X> <X> <X> <Y> <Y> <Z> <X> $ <Y> ( <Z> <Z> ( <Y> ) <Z>

s7

<Z>

Z Z (

s2

s0
<S> <X> <X> <X> <Y> <Y>

<X> $ <Y> ( <Z> <Z> ( <Y> ) <Z>

Z
s1

<Y> ( <Y> ) <Y> ( <Y> ) <Y> <Z>

( Y
s6

<Y> <X> <Y> <Y>

( <Y> ) ( <Z> ( <Y> ) <Z>

Y
s3

Y )
s4
<Y> ( <Y> )
Universidad Galileo

X
s5
<S> <X> $
Oscar Bonilla

<Y> ( <Y> ) <X> <Y>


40

Lenguajes LR
El conjunto de lenguajes LR es independiente de la distancia de lookahead k Dada cualquier gramtica LR(k) Gk, existe una gramtica LR(0) G0 tal que L(Gk) = L(G0) Para todos los lenguajes que vimos con gramticas SLR(1), LALR(1) y LR(1), podramos haber encontrado una gramtica LR(0)!!! Pero esto puede ser muy difcil!!!
Oscar Bonilla

41

Universidad Galileo

Resumen
Repaso de parseo LR y algunas clarificaciones

Clasificacin de gramticas
Lenguajes LR

Eliminando Ambiguedad
Manejo de errores y recuperacin de errores

Oscar Bonilla

42

Universidad Galileo

Lenguajes Ambiguos
Un lenguaje libre de contexto es inherentemente ambiguo si toda gramtica que genera el lenguaje es ambigua

Sin embargo, la mayora de gramticas ambiguas encontradas en la prctica son para lenguajes no ambiguos
Queremos hacerlas no ambiguas

Oscar Bonilla

43

Universidad Galileo

Gramticas Ambiguas
Si tenemos una gramtica ambigua para un lenguaje no ambiguo, podemos:
Escribir una gramtica no ambigua Usar precedencia y asociatividad para resolver los conflictos en las acciones del parser

Oscar Bonilla

44

Universidad Galileo

Ejemplo
<E> <E> + <E> | <E> * <E> | ( <E> ) | id

Oscar Bonilla

45

Universidad Galileo

Ejemplo
<E> <E> + <E> | <E> * <E> | ( <E> ) | id

Escribiendo una gramtica no ambigua

Oscar Bonilla

46

Universidad Galileo

Ejemplo
<E> <E> + <E> | <E> * <E> | ( <E> ) | id

Escribiendo una gramtica no ambigua


<E> <E> + <T> | <T>

<T> <T> * <F> | <F>


<F> ( <E> ) | id

Oscar Bonilla

47

Universidad Galileo

<S> <E> $

<E> <E> + <E> | <E> * <E> | ( <E> ) | id

Oscar Bonilla

48

Universidad Galileo

<S> <E> $

<E> <E> + <E> | <E> * <E> | ( <E> ) | id


s0
<S> <E> <E> <E> <E> <E> <E> + <E> <E> * <E> ( <E> ) id

s2
<S> <E> <E> <E> <E> ( <E> ) <E> + <E> <E> * <E> ( <E> ) id

s6
<E> <E> + <E> <E> <E> * <E> <E> ( <E> )

s1
<S> <E> <E> <E> + <E> <E> <E> * <E>

s3
<E> id

s7
<E> <E> + <E> <E> <E> + <E> <E> <E> * <E>

s8 s4
<S> <E> <E> <E> <E> <E> + <E> <E> + <E> <E> * <E> ( <E> ) id

s5
<S> <E> <E> <E> <E> <E> * <E> <E> + <E> <E> * <E> ( <E> ) id
49

<S> <E> * <E> <E> <E> + <E> <E> <E> * <E>

s9
<E> ( <E> )
Universidad Galileo

Oscar Bonilla

s0

id
Oscar Bonilla

id
50

id
Universidad Galileo

s7 s4 s1 s0

<E> + <E> $

id
Oscar Bonilla

id
51

id
Universidad Galileo

s7
<E> <E> + <E> <E> <E> + <E> <E> <E> * <E>

Shift or reduce
s7 s4 s1 s0 <E> + <E> $

id
Oscar Bonilla

id
52

id
Universidad Galileo

Usando Precedencia y Asociatividad


Construimos el DFA y construimos la tabla de parseo Cuando hay un conflicto usamos la informacin de precedencia y asociatividad

Oscar Bonilla

53

Universidad Galileo

Otro Ejemplo
<stmt> if <expr> then <stmt> else <stmt> <stmt> if <expr> then <stmt> <stmt> other

Oscar Bonilla

54

Universidad Galileo

Otro Ejemplo
<stmt> if <expr> then <stmt> else <stmt> <stmt> if <expr> then <stmt> <stmt> other if ... then if ... then else if ... then else

Oscar Bonilla

55

Universidad Galileo

Otro Ejemplo
<stmt> if <expr> then <stmt> else <stmt> <stmt> if <expr> then <stmt> <stmt> other if ... then if ... then else if ... then else

Oscar Bonilla

56

Universidad Galileo

Otro Ejemplo
<stmt> if <expr> then <stmt> else <stmt> <stmt> if <expr> then <stmt> <stmt> other if ... then if ... then else if ... then else

Oscar Bonilla

57

Universidad Galileo

Otro Ejemplo
<stmt> if <expr> then <stmt> else <stmt> <stmt> if <expr> then <stmt> <stmt> other if ... then if ... then else if ... then else

Oscar Bonilla

58

Universidad Galileo

Otro Ejemplo
<stmt> if <expr> then <stmt> else <stmt> <stmt> if <expr> then <stmt> <stmt> other if ... then if ... then else if ... then else

Asociatividad izquierda, esto es lo que queremos!

Oscar Bonilla

59

Universidad Galileo

Otro Ejemplo
<stmt> if <expr> then <stmt> else <stmt> <stmt> if <expr> then <stmt> <stmt> other <S> <E> $ <E> i <E> o <E> <E> i <E> <E> <A>

Oscar Bonilla

60

Universidad Galileo

<S> <E> $ <E> i <E> o <E> | i <E> | <A>


s0
<S> <E> <E> <E> <E> i <E> o <E> <I> <E> <A>

s2

E A

<S> <E>

s3

s1
<E> <E> <E> <E> <E>

i
i <E> o <E> i <E> i <E> o <E> i <E> <A>

<S> <A>

A
A i o
s5
<E> <E> <E> <E>
61

s6
<E> i <E> o <E>

E
i <E> o <E> i <E> o <E> i <E> <A>
Universidad Galileo

E
s4
<E> i <E> o <E> <E> i <E>

Oscar Bonilla

<S> <E> $ <E> i <E> o <E> | i <E> | <A>


s0
<S> <E> <E> <E> <E> i <E> o <E> <I> <E> <A>

s2

E A

<S> <E>

s3

s1
<E> <E> <E> <E> <E>

i
i <E> o <E> i <E> i <E> o <E> i <E> <A>

<S> <A>

A
A i o
s5
<E> <E> <E> <E>
62

s6
<E> i <E> o <E>

E
i <E> o <E> i <E> o <E> i <E> <A>
Universidad Galileo

E
s4
<E> i <E> o <E> <E> i <E>

Oscar Bonilla

<S> <E> $ <E> i <E> o <E> | i <E> | <A>

State s0 s1 s2 s3 s4 s5 s6

i shift to s1 shift to s2 error reduce reduce error reduce

error error accept reduce shift to s5/reduce reduce shift to s6 error reduce reduce

ACTION o error error error reduce

Goto $ E goto s2 goto s4 A goto s3 goto s3

goto s3

Oscar Bonilla

63

Universidad Galileo

<S> <E> $ <E> i <E> o <E> | i <E> | <A>

State s0 s1 s2 s3 s4 s5 s6

i shift to s1 shift to s2 error reduce reduce error reduce

error error accept reduce shift to s5/reduce reduce shift to s6 error reduce reduce

ACTION o error error error reduce

Goto $ E goto s2 goto s4 A goto s3 goto s3

goto s6

goto s3

Follow(<E>) = { i, o, $ }

Oscar Bonilla

64

Universidad Galileo

State s0 s1 s2 s3 s4 s5 s6

i shift to s1 shift to s2 error reduce reduce error reduce

error error accept reduce shift to s5/reduce reduce shift to s6 error reduce reduce

ACTION o error error error reduce

Goto $ E goto s2 goto s4 A goto s3 goto s3

goto s6

goto s3

s0

i
Oscar Bonilla

a
65

a
Universidad Galileo

State s0 s1 s2 s3 s4 s5 s6

i shift to s1 shift to s2 error reduce reduce error reduce

error error accept reduce shift to s5/reduce reduce shift to s6 error reduce reduce

ACTION o error error error reduce

Goto $ E goto s2 goto s4 A goto s3 goto s3

goto s6

goto s3

s1 s0

i $

i
Oscar Bonilla

a
66

a
Universidad Galileo

State s0 s1 s2 s3 s4 s5 s6

i shift to s1 shift to s2 error reduce reduce error reduce

error error accept reduce shift to s5/reduce reduce shift to s6 error reduce reduce

ACTION o error error error reduce

Goto $ E goto s2 goto s4 A goto s3 goto s3

goto s6

goto s3

s1 s1 s0

i i $

i
Oscar Bonilla

a
67

a
Universidad Galileo

State s0 s1 s2 s3 s4 s5 s6

i shift to s1 shift to s2 error reduce reduce error reduce

error error accept reduce shift to s5/reduce reduce shift to s6 error reduce reduce

ACTION o error error error reduce

Goto $ E goto s2 goto s4 A goto s3 goto s3

goto s6

goto s3

s3 s1 s1 s0

A i i $

i
Oscar Bonilla

a
68

a
Universidad Galileo

State s0 s1 s2 s3 s4 s5 s6

i shift to s1 shift to s2 error reduce reduce error reduce

error error accept reduce shift to s5/reduce reduce shift to s6 error reduce reduce

ACTION o error error error reduce

Goto $ E goto s2 goto s4 A goto s3 goto s3

goto s6

goto s3

s1 s1 s0

E i i $

i
Oscar Bonilla

a
69

a
Universidad Galileo

State s0 s1 s2 s3 s4 s5 s6

i shift to s1 shift to s2 error reduce reduce error reduce

error error accept reduce shift to s5/reduce reduce shift to s6 error reduce reduce

ACTION o error error error reduce

Goto $ E goto s2 goto s4 A goto s3 goto s3

goto s6

goto s3

s4 s1 s1 s0

E i i $

i
Oscar Bonilla

a
70

a
Universidad Galileo

State s0 s1 s2 s3 s4 s5 s6

i shift to s1 shift to s2 error reduce reduce error reduce

error error accept reduce shift to s5/reduce reduce shift to s6 error reduce reduce

ACTION o error error error reduce

Goto $ E goto s2 goto s4 A goto s3 goto s3

goto s6

goto s3

s4 s1 s1 s0

E i i $

i
Oscar Bonilla

a
71

a
Universidad Galileo

State s0 s1 s2 s3 s4 s5 s6

i shift to s1 shift to s2 error reduce reduce error reduce

error error accept reduce shift to s5/reduce reduce shift to s6 error reduce reduce

ACTION o error error error reduce

Goto $ E goto s2 goto s4 A goto s3 goto s3

goto s6

goto s3

s4 s1 s1 s0

E i i $

Como asocia por la izquierda, hacemos el shift

i
Oscar Bonilla

a
72

a
Universidad Galileo

State s0 s1 s2 s3 s4 s5 s6

i shift to s1 shift to s2 error reduce reduce error reduce

error error accept reduce shift to s5/reduce reduce shift to s6 error reduce reduce

ACTION o error error error reduce

Goto $ E goto s2 goto s4 A goto s3 goto s3

goto s6

goto s3

s5 s4 s1 s1 s0

o E i i $

i
Oscar Bonilla

a
73

a
Universidad Galileo

State s0 s1 s2 s3 s4 s5 s6

i shift to s1 shift to s2 error reduce reduce error reduce

error error accept reduce shift to s5/reduce reduce shift to s6 error reduce reduce

ACTION o error error error reduce

Goto $ E goto s2 goto s4 A goto s3 goto s3

goto s6

goto s3

s3 s5 s4 s1 s1 s0

A o E i i $

i
Oscar Bonilla

a
74

a
Universidad Galileo

State s0 s1 s2 s3 s4 s5 s6

i shift to s1 shift to s2 error reduce reduce error reduce

error error accept reduce shift to s5/reduce reduce shift to s6 error reduce reduce

ACTION o error error error reduce

Goto $ E goto s2 goto s4 A goto s3 goto s3

goto s6

goto s3

s5 s4 s1 s1 s0

E o E i i $

i
Oscar Bonilla

a
75

a
Universidad Galileo

State s0 s1 s2 s3 s4 s5 s6

i shift to s1 shift to s2 error reduce reduce error reduce

error error accept reduce shift to s5/reduce reduce shift to s6 error reduce reduce

ACTION o error error error reduce

Goto $ E goto s2 goto s4 A goto s3 goto s3

goto s6

goto s3

s6 s5 s4 s1 s1 s0

E o E i i $

i
Oscar Bonilla

a
76

a
Universidad Galileo

State s0 s1 s2 s3 s4 s5 s6

i shift to s1 shift to s2 error reduce reduce error reduce

error error accept reduce shift to s5/reduce reduce shift to s6 error reduce reduce

ACTION o error error error reduce

Goto $ E goto s2 goto s4 A goto s3 goto s3

goto s6

goto s3

s1 s0

E i $

i
Oscar Bonilla

a
77

a
Universidad Galileo

State s0 s1 s2 s3 s4 s5 s6

i shift to s1 shift to s2 error reduce reduce error reduce

error error accept reduce shift to s5/reduce reduce shift to s6 error reduce reduce

ACTION o error error error reduce

Goto $ E goto s2 goto s4 A goto s3 goto s3

goto s6

goto s3

s4 s1 s0

E i $

i
Oscar Bonilla

a
78

a
Universidad Galileo

State s0 s1 s2 s3 s4 s5 s6

i shift to s1 shift to s2 error reduce reduce error reduce

error error accept reduce shift to s5/reduce reduce shift to s6 error reduce reduce

ACTION o error error error reduce

Goto $ E goto s2 goto s4 A goto s3 goto s3

goto s6

goto s3

s0

E $

i
Oscar Bonilla

a
79

a
Universidad Galileo

State s0 s1 s2 s3 s4 s5 s6

i shift to s1 shift to s2 error reduce reduce error reduce

error error accept reduce shift to s5/reduce reduce shift to s6 error reduce reduce

ACTION o error error error reduce

Goto $ E goto s2 goto s4 A goto s3 goto s3

goto s6

goto s3

s3 s0

E $

i
Oscar Bonilla

a
80

a
Universidad Galileo

Resumen
Repaso de parseo LR y algunas clarificaciones

Clasificacin de gramticas
Lenguajes LR

Eliminando Ambiguedad
Manejo de errores y recuperacin de errores

Oscar Bonilla

81

Universidad Galileo

Manejo de Errores
Los programas no siempre son correctos!! El compilador tiene que:
Reportar clara y exactamente la presencia de errores Recuperarse de cada error lo suficientemete rpido para poder detectar errores subsiguientes Tratar de evitar mensajes falsos de error

Oscar Bonilla

82

Universidad Galileo

Tipos de Errores
Lxicos Sintcticos Semnticos Lgicos

Oscar Bonilla

83

Universidad Galileo

Errores Lxicos
Un error que produce un token erroneo Errores lxicos posibles
Un identificador, palabra reservada u operador mal escrito (typo)

Oscar Bonilla

84

Universidad Galileo

Errores Sintcticos
Un programa que no satisface la CFG del lenguaje Ejemplos
Expresin aritmtica con parntesis no balanceados Un punto y coma faltante

Oscar Bonilla

85

Universidad Galileo

Errores Semnticos
Un error que necesita informacin sensitiva al contexto para ser identificado Ejemplos
Un operador aplicado a un tipo incompatible de operando Accesar una variable no declarada

Oscar Bonilla

86

Universidad Galileo

Errores Lgicos
Errores en el modelo de ejecucin Ejemplos
Recursin infinita Accesar un arreglo fuera de los lmites Dereferenciar un null pointer

Oscar Bonilla

87

Universidad Galileo

Tipos de recuperacin de errores de sintxis


Panic mode recovery Parse level recovery Producciones de error Correccin global

Oscar Bonilla

88

Universidad Galileo

Panic mode recovery


Al descubrir un error
pop cero o ms estados/smbolos del stack descartar cero o ms smbolos de entrada hasta que lleguemos a un punto donde podemos continuar parseando

Usamos no-terminales definidos para el panic


Ejemplo: cerrar llave, punto y coma

Oscar Bonilla

89

Universidad Galileo

Panic mode recovery


En error
pop del stack hasta que lleguemos a un estado X de donde se pueda hacer un goto para alguno de los no-terminales de pnico
Se termina el parseo si no se encuentra ninguno

Descartamos tokens del buffer de entrada hasta que encontremos un token sincronizador
Un token que pertenece a follow(A) del no-terminal de pnico A que encontramos en el paso anterior

Push de A y del estado goto(S,A) en los stacks y seguimos parseando


Oscar Bonilla

90

Universidad Galileo

Ejemplo de panic mode error recovery


Gramtica:
<S> <E> $ <E> <X> ; <E> | <X> <X> id | <X> = <X>

s0

Oscar Bonilla

91

Universidad Galileo

Ejemplo de panic mode error recovery


Gramtica :
<S> <E> $ <E> <X> ; <E> | <X> <X> id | <X> = <X>

s0

id
Oscar Bonilla

;
92

id

id

id

id

id

Universidad Galileo

Ejemplo de panic mode error recovery


Gramtica :
<S> <E> $ <E> <X> ; <E> | <X> <X> id | <X> = <X>

s3 s0

id $

id
Oscar Bonilla

;
93

id

id

id

id

id

Universidad Galileo

Ejemplo de panic mode error recovery


Gramtica :
<S> <E> $ <E> <X> ; <E> | <X> <X> id | <X> = <X>

s6 s0

<X> $

id
Oscar Bonilla

;
94

id

id

id

id

id

Universidad Galileo

Ejemplo de panic mode error recovery


Gramtica :
<S> <E> $ <E> <X> ; <E> | <X> <X> id | <X> = <X>

s4 s6 s0

; <X> $

id
Oscar Bonilla

;
95

id

id

id

id

id

Universidad Galileo

Ejemplo de panic mode error recovery


Gramtica :
<S> <E> $ <E> <X> ; <E> | <X> <X> id | <X> = <X>

s2 s0

<Y> $

id
Oscar Bonilla

;
96

id

id

id

id

id

Universidad Galileo

Ejemplo de panic mode error recovery


Gramtica :
<S> <E> $ <E> <X> ; <E> | <X> <X> id | <X> = <X>

s3 s2 s0

id <E> $

id
Oscar Bonilla

;
97

id

id

id

id

id

Universidad Galileo

Ejemplo de panic mode error recovery


Gramtica :
<S> <E> $ <E> <X> ; <E> | <X> <X> id | <X> = <X>

s6 s2 s0

<X> <E> $

id
Oscar Bonilla

;
98

id

id

id

id

id

Universidad Galileo

Ejemplo de panic mode error recovery


Gramtica :
<S> <E> $ <E> <X> ; <E> | <X> <X> id | <X> = <X>

s3 s6 s2 s0

id <X> <E> $

id
Oscar Bonilla

;
99

id

id

id

id

id

Universidad Galileo

Ejemplo de panic mode error recovery


Gramtica :
<S> <E> $ <E> <X> ; <E> | <X> <X> id | <X> = <X>

s6 s6 s2 s0

<X> <X> <E> $

id
Oscar Bonilla

id
100

id

id

id

id

Universidad Galileo

Ejemplo de panic mode error recovery


Gramtica :
<S> <E> $ <E> <X> ; <E> | <X> <X> id | <X> = <X>

PANIC
s6 s6 s2 s0 <X> <X> <E> $

id
Oscar Bonilla

id
101

id

id

id

id

Universidad Galileo

Ejemplo de panic mode error recovery


Gramtica :
<S> <E> $ <E> <X> ; <E> | <X> <X> id | <X> = <X>

PANIC
s6 s6 s2 s0 <X> <X> <E> $

no-terminales de pnico = { <E> ... } follow(<E>) = { ; }

id
Oscar Bonilla

id
102

id

id

id

id

Universidad Galileo

Ejemplo de panic mode error recovery


Gramtica :
<S> <E> $ <E> <X> ; <E> | <X> <X> id | <X> = <X>

s6 s6 s2 s0

<X> <X> <E> $

PANIC

no-terminales de pnico = { <E> ... } follow(<E>) = { ; }

id
Oscar Bonilla

id
103

id

id

id

id

Universidad Galileo

Ejemplo de panic mode error recovery


Gramtica :
<S> <E> $ <E> <X> ; <E> | <X> <X> id | <X> = <X>

PANIC
s2 s0 <E> $

no-terminales de pnico = { <E> ... } follow(<E>) = { ; }

id
Oscar Bonilla

id
104

id

id

id

id

Universidad Galileo

Ejemplo de panic mode error recovery


Gramtica :
<S> <E> $ <E> <X> ; <E> | <X> <X> id | <X> = <X>

PANIC
s2 s0 <E> $

no-terminales de pnico = { <E> ... } follow(<E>) = { ; }

id
Oscar Bonilla

id
105

id

id

id

id

Universidad Galileo

Ejemplo de panic mode error recovery


Gramtica :
<S> <E> $ <E> <X> ; <E> | <X> <X> id | <X> = <X>

PANIC
s2 s0 <E> $

no-terminales de pnico = { <E> ... } follow(<E>) = { ; }

id
Oscar Bonilla

id
106

id

id

id

id

Universidad Galileo

Ejemplo de panic mode error recovery


Gramtica :
<S> <E> $ <E> <X> ; <E> | <X> <X> id | <X> = <X>

s2 s0

<E> $

id
Oscar Bonilla

id
107

id

id

id

id

Universidad Galileo

Ejemplo de panic mode error recovery


Gramtica :
<S> <E> $ <E> <X> ; <E> | <X> <X> id | <X> = <X>

s3 s2 s0

id <E> $

id
Oscar Bonilla

id
108

id

id

id

id

Universidad Galileo

Parse Level Error Recovery


En error
invocamos una rutina especial para cambiar el prefijo de los tokens de entrada que quedan y continuamos el parseo

Ejemplo
Reemplazar una coma por un punto y coma

Oscar Bonilla

109

Universidad Galileo

Ejemplo de parser level error recovery


Action Table
State s0 s1 s2 s3 s4 s5 ( shift to s2 error shift to s2 error reduce (2) reduce (3) ACTION ) error error shift to s5 shift to s4 reduce (2) reduce (3) Goto $ error accept error error reduce (2) reduce (3) X goto s1 goto s3

s0

(
Oscar Bonilla

)
110

$
Universidad Galileo

Ejemplo de parser level error recovery


Action Table
State s0 s1 s2 s3 s4 s5 ( shift to s2 error shift to s2 error reduce (2) reduce (3) ACTION ) error error shift to s5 shift to s4 reduce (2) reduce (3) Goto $ error accept error error reduce (2) reduce (3) X goto s1 goto s3

s3 s2 s0

X ( $

(
Oscar Bonilla

)
111

$
Universidad Galileo

Ejemplo de parser level error recovery


Action Table
State s0 s1 s2 s3 s4 s5 ( shift to s2 error shift to s2 error reduce (2) reduce (3) ACTION ) error error shift to s5 shift to s4 reduce (2) reduce (3) Goto $ error accept error error reduce (2) reduce (3) X goto s1 goto s3

s3 s2 s0

X ( $

(
Oscar Bonilla

)
112

$
Universidad Galileo

Ejemplo de parser level error recovery


Action Table
State s0 s1 s2 s3 s4 s5 ( shift to s2 error shift to s2 error reduce (2) reduce (3) ACTION ) error error shift to s5 shift to s4 reduce (2) reduce (3) Goto $ error accept error error reduce (2) reduce (3) X goto s1 goto s3

s3 s2 s0

X ( $

Invocamos rutina de recuperacin de error

(
Oscar Bonilla

)
113

$
Universidad Galileo

Ejemplo de parser level error recovery


Action Table
State s0 s1 s2 s3 s4 s5 ( shift to s2 error shift to s2 error reduce (2) reduce (3) ACTION ) error error shift to s5 shift to s4 reduce (2) reduce (3) Goto $ error accept error error reduce (2) reduce (3) X goto s1 goto s3

s3 s2 s0

X ( $

Invocamos rutina de recuperacin de error

(
Oscar Bonilla

)
114

$
Universidad Galileo

Ejemplo de parser level error recovery


Action Table
State s0 s1 s2 s3 s4 s5 ( shift to s2 error shift to s2 error reduce (2) reduce (3) ACTION ) error error shift to s5 shift to s4 reduce (2) reduce (3) Goto $ error accept error error reduce (2) reduce (3) X goto s1 goto s3

s3 s2 s0

X ( $

(
Oscar Bonilla

)
115

$
Universidad Galileo

Ejemplo de parser level error recovery


Action Table
State s0 s1 s2 s3 s4 s5 ( shift to s2 error shift to s2 error reduce (2) reduce (3) ACTION ) error error shift to s5 shift to s4 reduce (2) reduce (3) Goto $ error accept error error reduce (2) reduce (3) X goto s1 goto s3

s4 s3 s2 s0

) X ( $

(
Oscar Bonilla

)
116

$
Universidad Galileo

Producciones de Error
Agregamos producciones especiales de la forma A error para manejar errores.
error se trata como un smbolo terminal especial

En error
Insertamos el terminal error como el primer token de entrada Pop del stack hasta que lleguemos a un estado E en el que se pueda hacer un goto para el terminal error El parser hace shift del terminal error, el estado actual es es F = goto(E, error) Descartamos los tokens del buffer de entrada hasta que encontremos un token para el que se pueda ejecutar una accin de parseo legal a partir del estado F
117 Universidad Galileo

Oscar Bonilla

Ejemplo de Producciones de Error


Gramtica
<S> <E> $ <E> <X> ; <E> | <X> <X> id | <X> = <X>

Oscar Bonilla

118

Universidad Galileo

Ejemplo de Producciones de Error


Gramtica
<S> <E> $ <E> <X> ; <E> | <X> <X> id | <X> = <X> | error

Oscar Bonilla

119

Universidad Galileo

Ejemplo de Producciones de Error


Gramtica
<S> <E> $ <E> <X> ; <E> | <X> <X> id | <X> = <X> | error

s0

Oscar Bonilla

120

Universidad Galileo

Ejemplo de Producciones de Error


Gramtica
<S> <E> $ <E> <X> ; <E> | <X> <X> id | <X> = <X> | error

s0

id
Oscar Bonilla

id
121

id

id

id

id

Universidad Galileo

Ejemplo de Producciones de Error


Gramtica
<S> <E> $ <E> <X> ; <E> | <X> <X> id | <X> = <X> | error

s0

id
Oscar Bonilla

id
122

id

id

id

id

Universidad Galileo

Ejemplo de Producciones de Error


Gramtica
<S> <E> $ <E> <X> ; <E> | <X> <X> id | <X> = <X> | error

s3 s0

id $

id
Oscar Bonilla

id
123

id

id

id

id

Universidad Galileo

Ejemplo de Producciones de Error


Gramtica
<S> <E> $ <E> <X> ; <E> | <X> <X> id | <X> = <X> | error

s6 s0

<X> $

id
Oscar Bonilla

id
124

id

id

id

id

Universidad Galileo

Ejemplo de Producciones de Error


Gramtica
<S> <E> $ <E> <X> ; <E> | <X> <X> id | <X> = <X> | error

s4 s6 s0

; <X> $

id
Oscar Bonilla

id
125

id

id

id

id

Universidad Galileo

Ejemplo de Producciones de Error


Gramtica
<S> <E> $ <E> <X> ; <E> | <X> <X> id | <X> = <X> | error

s2 s0

<Y> $

id
Oscar Bonilla

id
126

id

id

id

id

Universidad Galileo

Ejemplo de Producciones de Error


Gramtica
<S> <E> $ <E> <X> ; <E> | <X> <X> id | <X> = <X> | error

s3 s2 s0

id <E> $

id
Oscar Bonilla

id
127

id

id

id

id

Universidad Galileo

Ejemplo de Producciones de Error


Gramtica
<S> <E> $ <E> <X> ; <E> | <X> <X> id | <X> = <X> | error

s6 s2 s0

<X> <E> $

id
Oscar Bonilla

id
128

id

id

id

id

Universidad Galileo

Ejemplo de Producciones de Error


Gramtica
<S> <E> $ <E> <X> ; <E> | <X> <X> id | <X> = <X> | error

s6 s6 s2 s0

<X> <X> <E> $

id
Oscar Bonilla

id
129

id

id

id

id

Universidad Galileo

Ejemplo de Producciones de Error


Gramtica
<S> <E> $ <E> <X> ; <E> | <X> <X> id | <X> = <X> | error

Error
s6 s6 s2 s0 <X> <X> <E> $

id
Oscar Bonilla

id
130

id

id

id

id

Universidad Galileo

Ejemplo de Producciones de Error


Gramtica
<S> <E> $ <E> <X> ; <E> | <X> <X> id | <X> = <X> | error

Error
s6 s6 s2 s0 <X> <X> <E> $

id
Oscar Bonilla

id

id
131

error

id

id

id

Universidad Galileo

Ejemplo de Producciones de Error


Gramtica
<S> <E> $ <E> <X> ; <E> | <X> <X> id | <X> = <X> | error

s6 s6 s2 s0

<X> <X> <E> $

Error

id
Oscar Bonilla

id

id
132

error

id

id

id

Universidad Galileo

Ejemplo de Producciones de Error


Gramtica
<S> <E> $ <E> <X> ; <E> | <X> <X> id | <X> = <X> | error

Error
s2 s0 <E> $

id
Oscar Bonilla

id

id
133

error

id

id

id

Universidad Galileo

Ejemplo de Producciones de Error


Gramtica
<S> <E> $ <E> <X> ; <E> | <X> <X> id | <X> = <X> | error

Error
s5 s2 s0 error <E> $

id
Oscar Bonilla

id

id
134

error

id

id

id

Universidad Galileo

Ejemplo de Producciones de Error


Gramtica
<S> <E> $ <E> <X> ; <E> | <X> <X> id | <X> = <X> | error

Error
s5 s2 s0 error <E> $

id
Oscar Bonilla

id

id
135

error

id

id

id

Universidad Galileo

Ejemplo de Producciones de Error


Gramtica
<S> <E> $ <E> <X> ; <E> | <X> <X> id | <X> = <X> | error

Error
s5 s2 s0 error <E> $

id
Oscar Bonilla

id

id
136

error

id

id

id

Universidad Galileo

Ejemplo de Producciones de Error


Gramtica
<S> <E> $ <E> <X> ; <E> | <X> <X> id | <X> = <X> | error

s5 s2 s0

error <E> $

id
Oscar Bonilla

id

id
137

error

id

id

id

Universidad Galileo

Ejemplo de Producciones de Error


Gramtica
<S> <E> $ <E> <X> ; <E> | <X> <X> id | <X> = <X> | error

s2 s0

<E> $

id
Oscar Bonilla

id

id
138

error

id

id

id

Universidad Galileo

Ejemplo de Producciones de Error


Gramtica
<S> <E> $ <E> <X> ; <E> | <X> <X> id | <X> = <X> | error

s3 s2 s0

id <E> $

id
Oscar Bonilla

id

id
139

error

id

id

id

Universidad Galileo

Correccin Global
Tratamos de anticipar las acciones del programador Hacemos el programa legal elijiendo la mnima cantidad de cambios Muchos problemas
Costoso Los cambios pueden crear un programa semnticamente correcto, pero no el que el programador quera escribir!!!
Oscar Bonilla

140

Universidad Galileo

Lecturas
El Tigre
Chapter 5

La Ballena
3.1, 3.2, 3.3, 3.4

El Dragn
Chapter 6

Oscar Bonilla

141

Universidad Galileo

También podría gustarte