Vous êtes sur la page 1sur 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?

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

SL (1)

LR(0)

State
s0
s1
s2
s3
s4
s5

State
s0
s1
s2
s3
s4
s5
s6

Oscar Bonilla

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

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

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

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

Goto
$
error
accept
error
error
reduce (2)
reduce (3)

X
goto s1
goto s3

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

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

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

Construimos la tabla de parseo

LR(0)
Parser
Engine

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

Construir la tabla de parseo


Usando el DFA y la informacin del conjunto
follow

SLR
Parser
Engine

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

Construimos la tabla de parseo

LR(1)
Parser
Engine

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

Clasificacin de Gramticas
Context free

regular
G0

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 | a, b >= 0 }
Gramtica
S XY$
X (X |
Y )Y |

Clasificacin de Gramticas
Context free

LR(0)
regular
G0

G1

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 )n | n > 0 }
La gramtica
<S> <X> $
<X> ( <X> ) | ( )

Clasificacin de Gramticas
Context free

SLR(1)
LR(0)
regular
G0

G1 G2

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 )n | n >= 0 }
La gramtica
<S> <X> $
<X> ( <X> ) |

Clasificacin de Gramticas
Context free

LALR(1)
SLR(1)
LR(0)
regular
G0

G1 G2 G3

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

Clasificacin de Gramticas
Context free

LR(1)
LALR(1)
SLR(1)
LR(0)
regular
G0

G1 G2 G3 G4

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 )n | n >= 0 } { ( }
La gramtica
<S> <X> $
<X> ( | <Y>
<Y> ( <Y> )

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

G1 G2 G3 G4 G5

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 )n | n >= 0 } { (n ]n | n >= 0 }
La gramtica
<S>
<X>
<Y>
<Z>

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

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

G1 G2 G3 G4 G5 G6

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 )n | n >= 0 } { ](n )2n | n >= 0 }
La gramtica
<S>
<X>
<Y>
<Z>

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

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

G1 G2 G3 G4 G5 G6 G7

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

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

G1 G2 G3 G4 G5 G6 G7

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

LL(0)

G1 G2 G3 G4 G5 G6 G7

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

LL(0)
LL(1)

G1 G2 G3 G4 G5 G6 G7

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

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

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
<S>
<X>
<X>
<Y>
<Y>

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

<X> $
Y
(
( <Y> )

s5

<S> <X> $
Oscar Bonilla

(
Y

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

(
( <Y> )
( <Y> )

s2

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

Y
s3

<Y> ( <Y> )

s6

<X> <Y>
36

s4

<Y> ( <Y> )
Universidad Galileo

26

Ejemplo Expandido DFA


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

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

<X> $
Y
(
( <Y> )

s5

<S> <X> $
Oscar Bonilla

(
Y

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

(
( <Y> )
( <Y> )

s2

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

Y
s3

<Y> ( <Y> )

s6

<X> <Y>
37

s4

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

Oscar Bonilla

Gramtica LR(0)

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

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

38

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

Universidad Galileo

DFA del Ejemplo


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

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

s7

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

<Z>

s5

<S> <X> $
Oscar Bonilla

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

s1

(
Y

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

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

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

(
Y
s3

<Y> ( <Y> )

s6

<X> <Y>
39

s4

<Y> ( <Y> )
Universidad Galileo

DFA del Ejemplo


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

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

s7

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

<Z>

s5

<S> <X> $
Oscar Bonilla

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

s1

(
Y

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

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

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

(
Y
s3

<Y> ( <Y> )

s6

<X> <Y>
40

s4

<Y> ( <Y> )
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)!!!
Pero esto puede ser muy difcil!!!

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

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

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
s2

s0
<S>
<E>
<E>
<E>
<E>

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

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

<S>
<E>
<E>
<E>
<E>

s6

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

<E> <E> + <E>


<E> <E> * <E>
<E> ( <E> )

s3

s7

<E> id

<E> <E> + <E>


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

s8
s5

s4
<S>
<E>
<E>
<E>
<E>

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

Oscar Bonilla

<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

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

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>

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

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

Oscar Bonilla

s3
<S> <A>

s6

<E> i <E> o <E>

A
i

<E> i <E> o <E>


<E> i <E>

<S> <E>

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

s4

s2

s5
<E>
<E>
<E>
<E>

61

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

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

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

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

Oscar Bonilla

s3
<S> <A>

s6

<E> i <E> o <E>

A
i

<E> i <E> o <E>


<E> i <E>

<S> <E>

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

s4

s2

s5
<E>
<E>
<E>
<E>

62

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

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

State
s0
s1
s2
s3
s4
s5
s6

Oscar Bonilla

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

ACTION
o
error
error
error
reduce

Goto
$

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

63

E
goto s2
goto s4

A
goto s3
goto s3

goto s3

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

ACTION
o
error
error
error
reduce

Goto
$

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

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

s0

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

Goto
$

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

E
goto s2
goto s4

A
goto s3
goto s3

goto s6

goto s3

i
Oscar Bonilla

ACTION
o
error
error
error
reduce

a
65

a
Universidad Galileo

State
s0
s1
s2
s3
s4
s5
s6

s1
s0

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

Goto
$

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

E
goto s2
goto s4

A
goto s3
goto s3

goto s6

goto s3

i
$

i
Oscar Bonilla

ACTION
o
error
error
error
reduce

a
66

a
Universidad Galileo

State
s0
s1
s2
s3
s4
s5
s6

s1
s1
s0

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

Goto
$

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

E
goto s2
goto s4

A
goto s3
goto s3

goto s6

goto s3

i
i
$

i
Oscar Bonilla

ACTION
o
error
error
error
reduce

a
67

a
Universidad Galileo

State
s0
s1
s2
s3
s4
s5
s6

s3
s1
s1
s0

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

Goto
$

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

E
goto s2
goto s4

A
goto s3
goto s3

goto s6

goto s3

A
i
i
$

i
Oscar Bonilla

ACTION
o
error
error
error
reduce

a
68

a
Universidad Galileo

State
s0
s1
s2
s3
s4
s5
s6

s1
s1
s0

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

Goto
$

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

E
goto s2
goto s4

A
goto s3
goto s3

goto s6

goto s3

E
i
i
$

i
Oscar Bonilla

ACTION
o
error
error
error
reduce

a
69

a
Universidad Galileo

State
s0
s1
s2
s3
s4
s5
s6

s4
s1
s1
s0

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

Goto
$

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

E
goto s2
goto s4

A
goto s3
goto s3

goto s6

goto s3

E
i
i
$

i
Oscar Bonilla

ACTION
o
error
error
error
reduce

a
70

a
Universidad Galileo

State
s0
s1
s2
s3
s4
s5
s6

s4
s1
s1
s0

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

Goto
$

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

E
goto s2
goto s4

A
goto s3
goto s3

goto s6

goto s3

E
i
i
$

i
Oscar Bonilla

ACTION
o
error
error
error
reduce

a
71

a
Universidad Galileo

State
s0
s1
s2
s3
s4
s5
s6

s4
s1
s1
s0

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

Goto
$

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

E
goto s2
goto s4

A
goto s3
goto s3

goto s6

goto s3

Como asocia por la izquierda,


hacemos el shift

E
i
i
$

i
Oscar Bonilla

ACTION
o
error
error
error
reduce

a
72

a
Universidad Galileo

State
s0
s1
s2
s3
s4
s5
s6

s5
s4
s1
s1
s0

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

Goto
$

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

E
goto s2
goto s4

A
goto s3
goto s3

goto s6

goto s3

o
E
i
i
$

i
Oscar Bonilla

ACTION
o
error
error
error
reduce

a
73

a
Universidad Galileo

State
s0
s1
s2
s3
s4
s5
s6

s3
s5
s4
s1
s1
s0

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

Goto
$

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

E
goto s2
goto s4

A
goto s3
goto s3

goto s6

goto s3

A
o
E
i
i
$

i
Oscar Bonilla

ACTION
o
error
error
error
reduce

a
74

a
Universidad Galileo

State
s0
s1
s2
s3
s4
s5
s6

s5
s4
s1
s1
s0

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

Goto
$

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

E
goto s2
goto s4

A
goto s3
goto s3

goto s6

goto s3

E
o
E
i
i
$

i
Oscar Bonilla

ACTION
o
error
error
error
reduce

a
75

a
Universidad Galileo

State
s0
s1
s2
s3
s4
s5
s6

s6
s5
s4
s1
s1
s0

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

Goto
$

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

E
goto s2
goto s4

A
goto s3
goto s3

goto s6

goto s3

E
o
E
i
i
$

i
Oscar Bonilla

ACTION
o
error
error
error
reduce

a
76

a
Universidad Galileo

State
s0
s1
s2
s3
s4
s5
s6

s1
s0

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

Goto
$

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

E
goto s2
goto s4

A
goto s3
goto s3

goto s6

goto s3

E
i
$

i
Oscar Bonilla

ACTION
o
error
error
error
reduce

a
77

a
Universidad Galileo

State
s0
s1
s2
s3
s4
s5
s6

s4
s1
s0

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

Goto
$

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

E
goto s2
goto s4

A
goto s3
goto s3

goto s6

goto s3

E
i
$

i
Oscar Bonilla

ACTION
o
error
error
error
reduce

a
78

a
Universidad Galileo

State
s0
s1
s2
s3
s4
s5
s6

s0

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

Goto
$

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

E
goto s2
goto s4

A
goto s3
goto s3

goto s6

goto s3

E
$

i
Oscar Bonilla

ACTION
o
error
error
error
reduce

a
79

a
Universidad Galileo

State
s0
s1
s2
s3
s4
s5
s6

s3
s0

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

Goto
$

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

E
goto s2
goto s4

A
goto s3
goto s3

goto s6

goto s3

E
$

i
Oscar Bonilla

ACTION
o
error
error
error
reduce

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

Tipos de Errores

Lxicos
Sintcticos
Semnticos
Lgicos

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

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

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

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

Tipos de recuperacin de errores de sintxis

Panic mode recovery


Parse level recovery
Producciones de error
Correccin global

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

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

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

id
92

id

id

id

Universidad Galileo

id

Ejemplo de panic mode error recovery


Gramtica :

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

s3
s0

id
$

id
Oscar Bonilla

id
93

id

id

id

Universidad Galileo

id

Ejemplo de panic mode error recovery


Gramtica :

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

s6
s0

<X>
$

id
Oscar Bonilla

id
94

id

id

id

Universidad Galileo

id

Ejemplo de panic mode error recovery


Gramtica :

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

s4
s6
s0

;
<X>
$

id
Oscar Bonilla

id
95

id

id

id

Universidad Galileo

id

Ejemplo de panic mode error recovery


Gramtica :

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

s2
s0

<Y>
$

id
Oscar Bonilla

id
96

id

id

id

Universidad Galileo

id

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
97

id

id

id

Universidad Galileo

id

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

id
98

id

id

id

Universidad Galileo

id

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

id
99

id

id

id

Universidad Galileo

id

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

Universidad Galileo

id

Ejemplo de panic mode error recovery


Gramtica :

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

s6
s6
s2
s0

PANIC
<X>
<X>
<E>
$

id
Oscar Bonilla

id
101

id

id

id

Universidad Galileo

id

Ejemplo de panic mode error recovery


Gramtica :

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

s6
s6
s2
s0

PANIC
<X>
<X>
<E>
$

id
Oscar Bonilla

no-terminales de pnico = { <E> ... }


follow(<E>) = { ; }

id
102

id

id

id

Universidad Galileo

id

Ejemplo de panic mode error recovery


Gramtica :

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

s6
s6
s2
s0

<X>
<X>

PANIC

<E>
$

id
Oscar Bonilla

no-terminales de pnico = { <E> ... }


follow(<E>) = { ; }

id
103

id

id

id

Universidad Galileo

id

Ejemplo de panic mode error recovery


Gramtica :

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

PANIC
s2
s0

<E>
$

id
Oscar Bonilla

no-terminales de pnico = { <E> ... }


follow(<E>) = { ; }

id
104

id

id

id

Universidad Galileo

id

Ejemplo de panic mode error recovery


Gramtica :

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

PANIC
s2
s0

<E>
$

id
Oscar Bonilla

no-terminales de pnico = { <E> ... }


follow(<E>) = { ; }

id
105

id

id

id

Universidad Galileo

id

Ejemplo de panic mode error recovery


Gramtica :

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

PANIC
s2
s0

<E>
$

id
Oscar Bonilla

no-terminales de pnico = { <E> ... }


follow(<E>) = { ; }

id
106

id

id

id

Universidad Galileo

id

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

Universidad Galileo

id

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

Universidad Galileo

id

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

Ejemplo de parser level error recovery


Action Table
State
s0
s1
s2
s3
s4
s5

s0

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

Goto
$
error
accept
error
error
reduce (2)
reduce (3)

X
goto s1
goto s3

(
Oscar Bonilla

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

)
110

$
Universidad Galileo

Ejemplo de parser level error recovery


Action Table
State
s0
s1
s2
s3
s4
s5

s3
s2
s0

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

Goto
$
error
accept
error
error
reduce (2)
reduce (3)

X
goto s1
goto s3

X
(
$

(
Oscar Bonilla

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

)
111

$
Universidad Galileo

Ejemplo de parser level error recovery


Action Table
State
s0
s1
s2
s3
s4
s5

s3
s2
s0

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

Goto
$
error
accept
error
error
reduce (2)
reduce (3)

X
goto s1
goto s3

X
(
$

(
Oscar Bonilla

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

)
112

$
Universidad Galileo

Ejemplo de parser level error recovery


Action Table
State
s0
s1
s2
s3
s4
s5

s3
s2
s0

X
(
$

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

Goto
$
error
accept
error
error
reduce (2)
reduce (3)

X
goto s1
goto s3

Invocamos rutina de recuperacin de error

(
Oscar Bonilla

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

)
113

$
Universidad Galileo

Ejemplo de parser level error recovery


Action Table
State
s0
s1
s2
s3
s4
s5

s3
s2
s0

X
(
$

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

Goto
$
error
accept
error
error
reduce (2)
reduce (3)

X
goto s1
goto s3

Invocamos rutina de recuperacin de error

(
Oscar Bonilla

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

)
114

$
Universidad Galileo

Ejemplo de parser level error recovery


Action Table
State
s0
s1
s2
s3
s4
s5

s3
s2
s0

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

Goto
$
error
accept
error
error
reduce (2)
reduce (3)

X
goto s1
goto s3

X
(
$

(
Oscar Bonilla

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

)
115

$
Universidad Galileo

Ejemplo de parser level error recovery


Action Table
State
s0
s1
s2
s3
s4
s5

s4
s3
s2
s0

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

Goto
$
error
accept
error
error
reduce (2)
reduce (3)

X
goto s1
goto s3

)
X
(
$

(
Oscar Bonilla

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

)
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

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

Universidad Galileo

id

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

Universidad Galileo

id

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

Universidad Galileo

id

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

Universidad Galileo

id

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

Universidad Galileo

id

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

Universidad Galileo

id

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

Universidad Galileo

id

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

Universidad Galileo

id

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

Universidad Galileo

id

Ejemplo de Producciones de Error


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

s6
s6
s2
s0

Error
<X>
<X>
<E>
$

id
Oscar Bonilla

id
130

id

id

id

Universidad Galileo

id

Ejemplo de Producciones de Error


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

s6
s6
s2
s0

Error
<X>
<X>
<E>
$

id
Oscar Bonilla

id

id
131

error

id

id

Universidad Galileo

id

Ejemplo de Producciones de Error


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

s6
s6
s2
s0

Error

<X>
<X>
<E>
$

id
Oscar Bonilla

id

id
132

error

id

id

Universidad Galileo

id

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

Universidad Galileo

id

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

Universidad Galileo

id

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

Universidad Galileo

id

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

Universidad Galileo

id

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

Universidad Galileo

id

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

Universidad Galileo

id

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

Universidad Galileo

id

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!!!

Lecturas
El Tigre
Chapter 5

La Ballena
3.1, 3.2, 3.3, 3.4

El Dragn
Chapter 6

Oscar Bonilla

141

Universidad Galileo

Vous aimerez peut-être aussi