Вы находитесь на странице: 1из 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 2 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
ACTION Goto
State ( ) $ X
s0 shift to s2 error error goto s1
LR(0)

s1 error error accept


s2 shift to s2 shift to s5 error goto s3
s3 error shift to s4 error
s4 reduce (2) reduce (2) reduce (2)
s5 reduce (3) reduce (3) reduce (3)

ACTION Goto
State ( ) $ X Y
s0 shift to s1 reduce (5) reduce (5) goto s5 goto s6
SL (1)

s1 shift to s2 reduce (5) reduce (5) goto s3


s2 shift to s2 reduce (5) reduce (5) goto s3
s3 error shift to s4 error
s4 error reduce (4) reduce (4)
s5 error error accept
s6 error error reduce (2)

Oscar Bonilla 5 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 $ LR(0)
Usando las funciones closure y goto Parser
Engine
Construimos la tabla de parseo
Construccin de un parse engine SLR(1)

Agregamos la produccin especial S S $


Calcular el conjunto follow para todos los no-
terminales
Encontrar los tems LR(0) de la CFG
Crear el DFA
Comenzamos con el tem S S $ SLR
Parser
Usando las funciones closure y goto
Engine
Construir la tabla de parseo
Usando el DFA y la informacin del conjunto
follow
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
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

G0
regular
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)
G0
regular 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)
G0
regular 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)
G0
regular 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)
G0
regular 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)
G0
regular 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> $
<X> <Y> | <Z>
<Y> ( <Y> ) |
<Z> ( <Z> ] |
Clasificacin de Gramticas
Context free
unambiguous
LR(k)
LR(1)
LALR(1)
SLR(1)
LR(0)
G0
regular 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> $
<X> [ <Y> | ] <Z>
<Y> ( <Y> ) |
<Z> ( <Z> )) |
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
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)
G0
regular G1 G2 G3 G4 G5 G6 G7
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)
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)
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>
<X> (
<Y> ( <Y> )
<Y>
Hay alguna gramtica LR(0) para este lenguaje?

Oscar Bonilla 35 Universidad Galileo


26

Ejemplo Expandido DFA


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

s0 s2 (
<S> <X> $
(
s1 <Y> ( <Y> )
<X> Y <Y> ( <Y> )
<X> ( ( <X> ( <Y>
<Y> ( <Y> ) <Y> ( <Y> ) Y
<Y> <Y> ( <Y> )
<Y> s3 Y
X Y <Y> ( <Y> ) )
s5 s6
s4
<S> <X> $ <X> <Y>
<Y> ( <Y> )
Oscar Bonilla 36 Universidad Galileo
26

Ejemplo Expandido DFA


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

s0 s2 (
<S> <X> $
(
s1 <Y> ( <Y> )
<X> Y <Y> ( <Y> )
<X> ( ( <X> ( <Y>
<Y> ( <Y> ) <Y> ( <Y> ) Y
<Y> <Y> ( <Y> )
<Y> s3 Y
X Y <Y> ( <Y> ) )
s5 s6
s4
<S> <X> $ <X> <Y>
<Y> ( <Y> )
Oscar Bonilla 37 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> $ Gramtica LR(0)
<X> <Y> <S> <X> $
<X> <Y>
<X> (
<X> ( <Z>
<Y> ( <Y> ) <X> <Z>
<Y> <Y> ( <Y> )
<Y> <Z>
<Z>

Oscar Bonilla 38 Universidad Galileo


DFA del Ejemplo
<S> <X> $
<X> <Y>
<X> ( <Z>
<X> <Z>
<Y> ( <Y> )
<Y> <Z>
<Z> s7
<Z> Z s2 (
s0 <Y> ( <Y> )
Z ( <Y> ( <Y> )
<S> <X> $ Z <Y> <Z>
<X> <Y>
<X> ( <Z> s1
<X> <Z>
<Y> ( <Y> ) ( <Y> ( <Y> )
<Y> <Z> <X> ( <Z> Y
<Y> ( <Y> )
<Y> <Z> s3 Y
Y <Y> ( <Y> )
X )
s5 s6
s4
<S> <X> $ <X> <Y>
<Y> ( <Y> )
Oscar Bonilla 39 Universidad Galileo
DFA del Ejemplo
<S> <X> $
<X> <Y>
<X> ( <Z>
<X> <Z>
<Y> ( <Y> )
<Y> <Z>
<Z> s7
<Z> Z s2 (
s0 <Y> ( <Y> )
Z ( <Y> ( <Y> )
<S> <X> $ Z <Y> <Z>
<X> <Y>
<X> ( <Z> s1
<X> <Z>
<Y> ( <Y> ) ( <Y> ( <Y> )
<Y> <Z> <X> ( <Z> Y
<Y> ( <Y> )
<Y> <Z> s3 Y
Y <Y> ( <Y> )
X )
s5 s6
s4
<S> <X> $ <X> <Y>
<Y> ( <Y> )
Oscar Bonilla 40 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
s0 s2
<S> <E> <S> ( <E> ) s6
<E> <E> + <E> <E> <E> + <E> <E> <E> + <E>
<E> <E> * <E> <E> <E> * <E> <E> <E> * <E>
<E> ( <E> ) <E> ( <E> ) <E> ( <E> )
<E> id <E> id

s1 s3 s7
<S> <E> <E> id <E> <E> + <E>
<E> <E> + <E> <E> <E> + <E>
<E> <E> * <E> <E> <E> * <E>

s8
s4 s5 <S> <E> * <E>
<E> <E> + <E>
<S> <E> + <E> <S> <E> * <E> <E> <E> * <E>
<E> <E> + <E> <E> <E> + <E>
<E> <E> * <E> <E> <E> * <E>
<E> ( <E> ) <E> ( <E> ) s9
<E> id <E> id <E> ( <E> )
Oscar Bonilla 49 Universidad Galileo
s0 $
id + id * id

Oscar Bonilla 50 Universidad Galileo


s7 <E>
s4 +
s1 <E>
s0 $
id + id * id

Oscar Bonilla 51 Universidad Galileo


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

Shift or reduce

s7 <E>
s4 +
s1 <E>
s0 $
id + id * id

Oscar Bonilla 52 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 s2
<S> <E> E <S> <E>
<E> i <E> o <E>
<E> <I> <E>
<E> <A> A
s3
i <S> <A>
i
s1
<E> i <E> o <E> s6
<E> i <E> A <E> i <E> o <E>
<E> i <E> o <E>
<E> i <E> A
<E> <A>
i E
s5
E
s4 <E> i <E> o <E>
o <E> i <E> o <E>
<E> i <E> o <E> <E> i <E>
<E> i <E> <E> <A>

Oscar Bonilla 61 Universidad Galileo


<S> <E> $
<E> i <E> o <E> | i <E> | <A>
s0 s2
<S> <E> E <S> <E>
<E> i <E> o <E>
<E> <I> <E>
<E> <A> A
s3
i <S> <A>
i
s1
<E> i <E> o <E> s6
<E> i <E> A <E> i <E> o <E>
<E> i <E> o <E>
<E> i <E> A
<E> <A>
i E
s5
E
s4 <E> i <E> o <E>
o <E> i <E> o <E>
<E> i <E> o <E> <E> i <E>
<E> i <E> <E> <A>

Oscar Bonilla 62 Universidad Galileo


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

ACTION Goto
State i o $ E A
s0 shift to s1 error error goto s2 goto s3
s1 shift to s2 error error goto s4 goto s3
s2 error error accept
s3 reduce reduce reduce
s4 reduce shift to s5/reducereduce
s5 error shift to s6 error goto s3
s6 reduce reduce reduce

Oscar Bonilla 63 Universidad Galileo


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

ACTION Goto
State i o $ E A
s0 shift to s1 error error goto s2 goto s3
s1 shift to s2 error error goto s4 goto s3
s2 error error accept
s3 reduce reduce reduce
s4 reduce shift to s5/reducereduce
s5 error shift to s6 error goto s6 goto s3
s6 reduce reduce reduce

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

Oscar Bonilla 64 Universidad Galileo


ACTION Goto
State i o $ E A
s0 shift to s1 error error goto s2 goto s3
s1 shift to s2 error error goto s4 goto s3
s2 error error accept
s3 reduce reduce reduce
s4 reduce shift to s5/reducereduce
s5 error shift to s6 error goto s6 goto s3
s6 reduce reduce reduce

s0 $
i i a o a

Oscar Bonilla 65 Universidad Galileo


ACTION Goto
State i o $ E A
s0 shift to s1 error error goto s2 goto s3
s1 shift to s2 error error goto s4 goto s3
s2 error error accept
s3 reduce reduce reduce
s4 reduce shift to s5/reducereduce
s5 error shift to s6 error goto s6 goto s3
s6 reduce reduce reduce

s1 i
s0 $
i i a o a

Oscar Bonilla 66 Universidad Galileo


ACTION Goto
State i o $ E A
s0 shift to s1 error error goto s2 goto s3
s1 shift to s2 error error goto s4 goto s3
s2 error error accept
s3 reduce reduce reduce
s4 reduce shift to s5/reducereduce
s5 error shift to s6 error goto s6 goto s3
s6 reduce reduce reduce

s1 i
s1 i
s0 $
i i a o a

Oscar Bonilla 67 Universidad Galileo


ACTION Goto
State i o $ E A
s0 shift to s1 error error goto s2 goto s3
s1 shift to s2 error error goto s4 goto s3
s2 error error accept
s3 reduce reduce reduce
s4 reduce shift to s5/reducereduce
s5 error shift to s6 error goto s6 goto s3
s6 reduce reduce reduce

s3 A
s1 i
s1 i
s0 $
i i a o a

Oscar Bonilla 68 Universidad Galileo


ACTION Goto
State i o $ E A
s0 shift to s1 error error goto s2 goto s3
s1 shift to s2 error error goto s4 goto s3
s2 error error accept
s3 reduce reduce reduce
s4 reduce shift to s5/reducereduce
s5 error shift to s6 error goto s6 goto s3
s6 reduce reduce reduce

E
s1 i
s1 i
s0 $
i i a o a

Oscar Bonilla 69 Universidad Galileo


ACTION Goto
State i o $ E A
s0 shift to s1 error error goto s2 goto s3
s1 shift to s2 error error goto s4 goto s3
s2 error error accept
s3 reduce reduce reduce
s4 reduce shift to s5/reducereduce
s5 error shift to s6 error goto s6 goto s3
s6 reduce reduce reduce

s4 E
s1 i
s1 i
s0 $
i i a o a

Oscar Bonilla 70 Universidad Galileo


ACTION Goto
State i o $ E A
s0 shift to s1 error error goto s2 goto s3
s1 shift to s2 error error goto s4 goto s3
s2 error error accept
s3 reduce reduce reduce
s4 reduce shift to s5/reducereduce
s5 error shift to s6 error goto s6 goto s3
s6 reduce reduce reduce

s4 E
s1 i
s1 i
s0 $
i i a o a

Oscar Bonilla 71 Universidad Galileo


ACTION Goto
State i o $ E A
s0 shift to s1 error error goto s2 goto s3
s1 shift to s2 error error goto s4 goto s3
s2 error error accept
s3 reduce reduce reduce
s4 reduce shift to s5/reducereduce
s5 error shift to s6 error goto s6 goto s3
s6 reduce reduce reduce

Como asocia por la izquierda,


s4 E
s1 i hacemos el shift
s1 i
s0 $
i i a o a

Oscar Bonilla 72 Universidad Galileo


ACTION Goto
State i o $ E A
s0 shift to s1 error error goto s2 goto s3
s1 shift to s2 error error goto s4 goto s3
s2 error error accept
s3 reduce reduce reduce
s4 reduce shift to s5/reducereduce
s5 error shift to s6 error goto s6 goto s3
s6 reduce reduce reduce

s5 o
s4 E
s1 i
s1 i
s0 $
i i a o a

Oscar Bonilla 73 Universidad Galileo


ACTION Goto
State i o $ E A
s0 shift to s1 error error goto s2 goto s3
s1 shift to s2 error error goto s4 goto s3
s2 error error accept
s3 reduce reduce reduce
s4 reduce shift to s5/reducereduce
s5 error shift to s6 error goto s6 goto s3
s6 reduce reduce reduce
s3 A
s5 o
s4 E
s1 i
s1 i
s0 $
i i a o a

Oscar Bonilla 74 Universidad Galileo


ACTION Goto
State i o $ E A
s0 shift to s1 error error goto s2 goto s3
s1 shift to s2 error error goto s4 goto s3
s2 error error accept
s3 reduce reduce reduce
s4 reduce shift to s5/reducereduce
s5 error shift to s6 error goto s6 goto s3
s6 reduce reduce reduce
E
s5 o
s4 E
s1 i
s1 i
s0 $
i i a o a

Oscar Bonilla 75 Universidad Galileo


ACTION Goto
State i o $ E A
s0 shift to s1 error error goto s2 goto s3
s1 shift to s2 error error goto s4 goto s3
s2 error error accept
s3 reduce reduce reduce
s4 reduce shift to s5/reducereduce
s5 error shift to s6 error goto s6 goto s3
s6 reduce reduce reduce
s6 E
s5 o
s4 E
s1 i
s1 i
s0 $
i i a o a

Oscar Bonilla 76 Universidad Galileo


ACTION Goto
State i o $ E A
s0 shift to s1 error error goto s2 goto s3
s1 shift to s2 error error goto s4 goto s3
s2 error error accept
s3 reduce reduce reduce
s4 reduce shift to s5/reducereduce
s5 error shift to s6 error goto s6 goto s3
s6 reduce reduce reduce

E
s1 i
s0 $
i i a o a

Oscar Bonilla 77 Universidad Galileo


ACTION Goto
State i o $ E A
s0 shift to s1 error error goto s2 goto s3
s1 shift to s2 error error goto s4 goto s3
s2 error error accept
s3 reduce reduce reduce
s4 reduce shift to s5/reducereduce
s5 error shift to s6 error goto s6 goto s3
s6 reduce reduce reduce

s4 E
s1 i
s0 $
i i a o a

Oscar Bonilla 78 Universidad Galileo


ACTION Goto
State i o $ E A
s0 shift to s1 error error goto s2 goto s3
s1 shift to s2 error error goto s4 goto s3
s2 error error accept
s3 reduce reduce reduce
s4 reduce shift to s5/reducereduce
s5 error shift to s6 error goto s6 goto s3
s6 reduce reduce reduce

E
s0 $
i i a o a

Oscar Bonilla 79 Universidad Galileo


ACTION Goto
State i o $ E A
s0 shift to s1 error error goto s2 goto s3
s1 shift to s2 error error goto s4 goto s3
s2 error error accept
s3 reduce reduce reduce
s4 reduce shift to s5/reducereduce
s5 error shift to s6 error goto s6 goto s3
s6 reduce reduce reduce

s3 E
s0 $
i i a o a

Oscar Bonilla 80 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 ; id id id ; id = id

Oscar Bonilla 92 Universidad Galileo


Ejemplo de panic mode error recovery
Gramtica :
<S> <E> $
<E> <X> ; <E> | <X>
<X> id | <X> = <X>

s3 id
s0 $
id ; id id id ; id = id

Oscar Bonilla 93 Universidad Galileo


Ejemplo de panic mode error recovery
Gramtica :
<S> <E> $
<E> <X> ; <E> | <X>
<X> id | <X> = <X>

s6 <X>
s0 $
id ; id id id ; id = id

Oscar Bonilla 94 Universidad Galileo


Ejemplo de panic mode error recovery
Gramtica :
<S> <E> $
<E> <X> ; <E> | <X>
<X> id | <X> = <X>

s4 ;
s6 <X>
s0 $
id ; id id id ; id = id

Oscar Bonilla 95 Universidad Galileo


Ejemplo de panic mode error recovery
Gramtica :
<S> <E> $
<E> <X> ; <E> | <X>
<X> id | <X> = <X>

s2 <Y>
s0 $
id ; id id id ; id = id

Oscar Bonilla 96 Universidad Galileo


Ejemplo de panic mode error recovery
Gramtica :
<S> <E> $
<E> <X> ; <E> | <X>
<X> id | <X> = <X>

s3 id
s2 <E>
s0 $
id ; id id id ; id = id

Oscar Bonilla 97 Universidad Galileo


Ejemplo de panic mode error recovery
Gramtica :
<S> <E> $
<E> <X> ; <E> | <X>
<X> id | <X> = <X>

s6 <X>
s2 <E>
s0 $
id ; id id id ; id = id

Oscar Bonilla 98 Universidad Galileo


Ejemplo de panic mode error recovery
Gramtica :
<S> <E> $
<E> <X> ; <E> | <X>
<X> id | <X> = <X>

s3 id
s6 <X>
s2 <E>
s0 $
id ; id id id ; id = id

Oscar Bonilla 99 Universidad Galileo


Ejemplo de panic mode error recovery
Gramtica :
<S> <E> $
<E> <X> ; <E> | <X>
<X> id | <X> = <X>

s6 <X>
s6 <X>
s2 <E>
s0 $
id ; id id id ; id = id

Oscar Bonilla 100 Universidad Galileo


Ejemplo de panic mode error recovery
Gramtica :
<S> <E> $
<E> <X> ; <E> | <X>
<X> id | <X> = <X>

PANIC
s6 <X>
s6 <X>
s2 <E>
s0 $
id ; id id id ; id = id

Oscar Bonilla 101 Universidad Galileo


Ejemplo de panic mode error recovery
Gramtica :
<S> <E> $
<E> <X> ; <E> | <X>
<X> id | <X> = <X>

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


PANIC follow(<E>) = { ; }
s6 <X>
s6 <X>
s2 <E>
s0 $
id ; id id id ; id = id

Oscar Bonilla 102 Universidad Galileo


Ejemplo de panic mode error recovery
Gramtica :
<S> <E> $
<E> <X> ; <E> | <X>
<X> id | <X> = <X>

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


PANIC follow(<E>) = { ; }
s6 <X>
s6 <X>
s2 <E>
s0 $
id ; id id id ; id = id

Oscar Bonilla 103 Universidad Galileo


Ejemplo de panic mode error recovery
Gramtica :
<S> <E> $
<E> <X> ; <E> | <X>
<X> id | <X> = <X>

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


PANIC follow(<E>) = { ; }

s2 <E>
s0 $
id ; id id id ; id = id

Oscar Bonilla 104 Universidad Galileo


Ejemplo de panic mode error recovery
Gramtica :
<S> <E> $
<E> <X> ; <E> | <X>
<X> id | <X> = <X>

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


PANIC follow(<E>) = { ; }

s2 <E>
s0 $
id ; id id id ; id = id

Oscar Bonilla 105 Universidad Galileo


Ejemplo de panic mode error recovery
Gramtica :
<S> <E> $
<E> <X> ; <E> | <X>
<X> id | <X> = <X>

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


PANIC follow(<E>) = { ; }

s2 <E>
s0 $
id ; id id id ; id = id

Oscar Bonilla 106 Universidad Galileo


Ejemplo de panic mode error recovery
Gramtica :
<S> <E> $
<E> <X> ; <E> | <X>
<X> id | <X> = <X>

s2 <E>
s0 $
id ; id id id ; id = id

Oscar Bonilla 107 Universidad Galileo


Ejemplo de panic mode error recovery
Gramtica :
<S> <E> $
<E> <X> ; <E> | <X>
<X> id | <X> = <X>

s3 id
s2 <E>
s0 $
id ; id id id ; id = id

Oscar Bonilla 108 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
Ejemplo de parser level error recovery
Action Table
ACTION Goto
State ( ) $ X
s0 shift to s2 error error goto s1
s1 error error accept
s2 shift to s2 shift to s5 error goto s3
s3 error shift to s4 error
s4 reduce (2) reduce (2) reduce (2)
s5 reduce (3) reduce (3) reduce (3)

s0 $
( ( ) ( $

Oscar Bonilla 110 Universidad Galileo


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

s3 X
s2 (
s0 $
( ( ) ( $

Oscar Bonilla 111 Universidad Galileo


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

s3 X
s2 (
s0 $
( ( ) ( $

Oscar Bonilla 112 Universidad Galileo


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

s3 X Invocamos rutina de recuperacin de error


s2 (
s0 $
( ( ) ( $

Oscar Bonilla 113 Universidad Galileo


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

s3 X Invocamos rutina de recuperacin de error


s2 (
s0 $
( ( ) ) $

Oscar Bonilla 114 Universidad Galileo


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

s3 X
s2 (
s0 $
( ( ) ) $

Oscar Bonilla 115 Universidad Galileo


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

s4 )
s3 X
s2 (
s0 $
( ( ) ) $

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
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 ; id id id ; id = id

Oscar Bonilla 121 Universidad Galileo


Ejemplo de Producciones de Error
Gramtica
<S> <E> $
<E> <X> ; <E> | <X>
<X> id | <X> = <X> | error

s0 $
id ; id id id ; id = id

Oscar Bonilla 122 Universidad Galileo


Ejemplo de Producciones de Error
Gramtica
<S> <E> $
<E> <X> ; <E> | <X>
<X> id | <X> = <X> | error

s3 id
s0 $
id ; id id id ; id = id

Oscar Bonilla 123 Universidad Galileo


Ejemplo de Producciones de Error
Gramtica
<S> <E> $
<E> <X> ; <E> | <X>
<X> id | <X> = <X> | error

s6 <X>
s0 $
id ; id id id ; id = id

Oscar Bonilla 124 Universidad Galileo


Ejemplo de Producciones de Error
Gramtica
<S> <E> $
<E> <X> ; <E> | <X>
<X> id | <X> = <X> | error

s4 ;
s6 <X>
s0 $
id ; id id id ; id = id

Oscar Bonilla 125 Universidad Galileo


Ejemplo de Producciones de Error
Gramtica
<S> <E> $
<E> <X> ; <E> | <X>
<X> id | <X> = <X> | error

s2 <Y>
s0 $
id ; id id id ; id = id

Oscar Bonilla 126 Universidad Galileo


Ejemplo de Producciones de Error
Gramtica
<S> <E> $
<E> <X> ; <E> | <X>
<X> id | <X> = <X> | error

s3 id
s2 <E>
s0 $
id ; id id id ; id = id

Oscar Bonilla 127 Universidad Galileo


Ejemplo de Producciones de Error
Gramtica
<S> <E> $
<E> <X> ; <E> | <X>
<X> id | <X> = <X> | error

s6 <X>
s2 <E>
s0 $
id ; id id id ; id = id

Oscar Bonilla 128 Universidad Galileo


Ejemplo de Producciones de Error
Gramtica
<S> <E> $
<E> <X> ; <E> | <X>
<X> id | <X> = <X> | error

s6 <X>
s6 <X>
s2 <E>
s0 $
id ; id id id ; id = id

Oscar Bonilla 129 Universidad Galileo


Ejemplo de Producciones de Error
Gramtica
<S> <E> $
<E> <X> ; <E> | <X>
<X> id | <X> = <X> | error

Error
s6 <X>
s6 <X>
s2 <E>
s0 $
id ; id id id ; id = id

Oscar Bonilla 130 Universidad Galileo


Ejemplo de Producciones de Error
Gramtica
<S> <E> $
<E> <X> ; <E> | <X>
<X> id | <X> = <X> | error

Error
s6 <X>
s6 <X>
s2 <E>
s0 $
error
id ; id id id ; id = id

Oscar Bonilla 131 Universidad Galileo


Ejemplo de Producciones de Error
Gramtica
<S> <E> $
<E> <X> ; <E> | <X>
<X> id | <X> = <X> | error

Error
s6 <X>
s6 <X>
s2 <E>
s0 $
error
id ; id id id ; id = id

Oscar Bonilla 132 Universidad Galileo


Ejemplo de Producciones de Error
Gramtica
<S> <E> $
<E> <X> ; <E> | <X>
<X> id | <X> = <X> | error

Error

s2 <E>
s0 $
error
id ; id id id ; id = id

Oscar Bonilla 133 Universidad Galileo


Ejemplo de Producciones de Error
Gramtica
<S> <E> $
<E> <X> ; <E> | <X>
<X> id | <X> = <X> | error

Error
s5 error
s2 <E>
s0 $
error
id ; id id id ; id = id

Oscar Bonilla 134 Universidad Galileo


Ejemplo de Producciones de Error
Gramtica
<S> <E> $
<E> <X> ; <E> | <X>
<X> id | <X> = <X> | error

Error
s5 error
s2 <E>
s0 $
error
id ; id id id ; id = id

Oscar Bonilla 135 Universidad Galileo


Ejemplo de Producciones de Error
Gramtica
<S> <E> $
<E> <X> ; <E> | <X>
<X> id | <X> = <X> | error

Error
s5 error
s2 <E>
s0 $
error
id ; id id id ; id = id

Oscar Bonilla 136 Universidad Galileo


Ejemplo de Producciones de Error
Gramtica
<S> <E> $
<E> <X> ; <E> | <X>
<X> id | <X> = <X> | error

s5 error
s2 <E>
s0 $
error
id ; id id id ; id = id

Oscar Bonilla 137 Universidad Galileo


Ejemplo de Producciones de Error
Gramtica
<S> <E> $
<E> <X> ; <E> | <X>
<X> id | <X> = <X> | error

s2 <E>
s0 $
error
id ; id id id ; id = id

Oscar Bonilla 138 Universidad Galileo


Ejemplo de Producciones de Error
Gramtica
<S> <E> $
<E> <X> ; <E> | <X>
<X> id | <X> = <X> | error

s3 id
s2 <E>
s0 $
error
id ; id id id ; id = id

Oscar Bonilla 139 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!!!
Lecturas
El Tigre
Chapter 5
La Ballena
3.1, 3.2, 3.3, 3.4
El Dragn
Chapter 6

Oscar Bonilla 141 Universidad Galileo