Clasificaci n de gram ticas y manejo de errores l.jpg
Sponsored Links
This presentation is the property of its rightful owner.
1 / 141

Clasificación de Gramáticas y Manejo de Errores PowerPoint PPT Presentation


  • 190 Views
  • Uploaded on
  • Presentation posted in: General

Clasificación de Gramáticas y Manejo de Errores. Resumen. Repaso de parseo LR y algunas clarificaciones Clasificación de gramáticas Lenguajes LR Eliminando Ambiguedad Manejo de errores y recuperación de errores. LR(0) y LR(1), ¿donde está el look ahead?.

Download Presentation

Clasificación de Gramáticas y Manejo de Errores

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


Clasificación de Gramáticas y Manejo de Errores


Resumen

  • Repaso de parseo LR y algunas clarificaciones

  • Clasificación de gramáticas

  • Lenguajes LR

  • Eliminando Ambiguedad

  • Manejo de errores y recuperación de errores

Oscar Bonilla2Universidad Galileo


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

  • Tanto LR(0) como LR(1) tienen el mismo engine de ejecución, ladiferenciaestá en la construcción de la tabla de parseo

    • Entonces, ¿dónde está el look ahead?

Oscar Bonilla3Universidad Galileo


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

  • Shift sn

    • ve el símbolo de entrada,

    • ya sea lo consume o termina de parsear (accept o error)

    • no es un look ahead

  • Goto sn

    • sólo ve el stack

  • Reduce n

    • LR(0) misma reducción para todos los inputs no look ahead

    • LR(1) necesitamos el símbolo de entrada  un look ahead

Oscar Bonilla4Universidad Galileo


LR(0)

SL (1)

Oscar Bonilla5Universidad Galileo


Algunas Definiciones

  • ¿Qué es una gramática XY(k)?(X, Y  {L, R})

  • Una gramática G es una gramática XY(k) si y sólo si podemos crear una tabla de parseo XY(k) sin ningún conflicto shift/reduce o reduce/reduce

Oscar Bonilla6Universidad Galileo


Construcción de un Parse Engine LR(0)

  • Agregamos la producción 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

Oscar Bonilla7Universidad Galileo


Construcción de un parse engine SLR(1)

  • Agregamos la producción especial S’  S $

  • Calcular el conjunto followpara todos los no-terminales

  • 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 información del conjunto follow

SLR

Parser

Engine

Oscar Bonilla8Universidad Galileo


Construcción de un parse engine LR(1)

  • Agregamos la producción especial S’  S $

  • Encontramos los ítems LR(1) de la CFG

  • Creamos el DFA

    • Comenzamos con el ítem [S’  • S $, ?]

    • Usamos las funcionesclosureygoto

  • Construimos la tabla de parseo

LR(1)

Parser

Engine

Oscar Bonilla9Universidad Galileo


Resumen

  • Repaso de parseo LR y algunas clarificaciones

  • Clasificación de gramáticas

  • Lenguajes LR

  • Eliminando Ambiguedad

  • Manejo de errores y recuperación de errores

Oscar Bonilla10Universidad Galileo


Clasificación de Gramáticas

Context free

Oscar Bonilla11Universidad Galileo


Clasificación de Gramáticas

Context free

G0

regular

Oscar Bonilla12Universidad Galileo


Gramáticas Regulares

  • Una gramática que puede ser expresada usando una expresión regular es una gramática regular

  • Lenguaje Ejemplo:

    • Cero o más paréntesis abiertos seguidos de cero o más paréntesis cerrados

  • G0 = { (a)b | a, b >= 0 }

  • Gramática

    S  X Y $

    X  ( X | 

    Y ) Y | 

Oscar Bonilla13Universidad Galileo


Clasificación de Gramáticas

Context free

LR(0)

G0

G1

regular

Oscar Bonilla14Universidad Galileo


Gramáticas LR(0)

  • Una gramática que puede crear una tabla de parseo LR(0) sin ningún conflicto shift/reduce o reduce/reduce

  • Lenguaje Ejemplo:

    • Uno o más paréntesis abiertos seguidos de un número igual de paréntesis cerrados

  • G1 = { (n)n | n > 0 }

  • La gramática

    <S>  <X> $

    <X>  ( <X> )| ( )

Oscar Bonilla15Universidad Galileo


Clasificación de Gramáticas

Context free

SLR(1)

LR(0)

G0

G1

G2

regular

Oscar Bonilla16Universidad Galileo


Gramáticas SLR(1)

  • Una gramática que puede crear una tabla de parseo SLR(1) sin ningún conflicto shift/reduce o reduce/reduce

  • Lenguaje Ejemplo:

    • Cero o más paréntesis abiertos seguidos de un número igual de paréntesis cerrados

  • G2 = { (n)n | n >= 0 }

  • La gramática

    <S>  <X> $

    <X>  ( <X> )| 

Oscar Bonilla17Universidad Galileo


Clasificación de Gramáticas

Context free

LALR(1)

SLR(1)

LR(0)

G0

G1

G2

G3

regular

Oscar Bonilla18Universidad Galileo


Gramáticas LALR(1)

  • Una gramática que puede crear una tabla de parseo LALR(1) sin ningún conflicto shift/reduce o reduce/reduce

  • Lenguaje Ejemplo:

    • ???

  • G3 = { ??? }

  • La gramática

Oscar Bonilla19Universidad Galileo


Clasificación de Gramáticas

Context free

LR(1)

LALR(1)

SLR(1)

LR(0)

G0

G1

G2

G3

G4

regular

Oscar Bonilla20Universidad Galileo


Gramáticas LR(1)

  • Una gramática que puede crear una tabla de parseo LR(1) sin ningún conflicto shift/reduce o reduce/reduce

  • Lenguaje Ejemplo:

    • Cero o más paréntesis abiertos seguidos de un número igual de paréntesis cerrados o un solo paréntesis abierto

  • G4 = { (n)n | n >= 0 }  { ( }

  • La gramática

    <S>  <X> $

    <X>  ( | <Y>

    <Y>  ( <Y> )| 

Oscar Bonilla21Universidad Galileo


Clasificación de Gramáticas

Context free

LR(k)

LR(1)

LALR(1)

SLR(1)

LR(0)

G0

G1

G2

G3

G4

G5

regular

Oscar Bonilla22Universidad Galileo


Gramáticas LR(k)

  • Una gramática que puede crear una tabla de parseo LR(k) sin ningún conflicto shift/reduce o reduce/reduce

  • Lenguaje Ejemplo:

    • Cero o más paréntesis abiertos seguidos de un número igual de paréntesis cerrados o un número igual de corchetes cerrados

  • G5 = { (n)n | n >= 0 }  { (n]n | n >= 0 }

  • La gramática

    <S>  <X> $

    <X>  <Y> | <Z>

    <Y>  ( <Y> )| 

    <Z>  ( <Z> ]| 

Oscar Bonilla23Universidad Galileo


Clasificación de Gramáticas

Context free

unambiguous

LR(k)

LR(1)

LALR(1)

SLR(1)

LR(0)

G0

G1

G2

G3

G4

G5

G6

regular

Oscar Bonilla24Universidad Galileo


Gramáticas no Ambiguas

  • Una gramática es no ambigua sí y sólo sí tiene una secuencia de derivación derecha (rightmost) única (parse tree)

  • Ejemplo:

  • G6 = { [(n)n | n >= 0 }  { ](n)2n | n >= 0 }

  • La gramática

    <S>  <X> $

    <X>  [ <Y> | ] <Z>

    <Y>  ( <Y> )| 

    <Z>  ( <Z> ))| 

Oscar Bonilla25Universidad Galileo


Clasificación de Gramáticas

Context free

unambiguous

LR(k)

LR(1)

LALR(1)

SLR(1)

LR(0)

G0

G1

G2

G3

G4

G5

G6

G7

regular

Oscar Bonilla26Universidad Galileo


Gramáticas Ambiguas

  • Una gramática es ambigua sí y sólo sí tiene más de una secuencia de derivación por la derecha

  • Ejemplo:

  • G7 = { (i)j(k | i = j or j = k }

  • La gramática

    <S>  <X> $

    <X>  <P> <Q> | <R> <S>

    <P>  ( <P> )| 

    <Q>  ( <Q> | 

    <R>  ( <R> | 

    <S>  ) <S> (| 

Oscar Bonilla27Universidad Galileo


Clasificación de Gramáticas

Context free

unambiguous

LR(k)

LR(1)

LALR(1)

SLR(1)

LR(0)

G0

G1

G2

G3

G4

G5

G6

G7

regular

Oscar Bonilla28Universidad Galileo


Clasificación de Gramáticas

Context free

unambiguous

LR(k)

LR(1)

LALR(1)

SLR(1)

LR(0)

G0

G1

G2

G3

G4

G5

G6

G7

regular

LL(0)

Oscar Bonilla29Universidad Galileo


Clasificación de Gramáticas

Context free

unambiguous

LR(k)

LR(1)

LALR(1)

SLR(1)

LR(0)

G0

G1

G2

G3

G4

G5

G6

G7

regular

LL(0)

LL(1)

Oscar Bonilla30Universidad Galileo


Pregunta

  • ¿Qué hay acerca del lenguaje?

  • G8 = { (i)j(k | i = j = k }

Oscar Bonilla31Universidad Galileo


Resumen

  • Repaso de parseo LR y algunas clarificaciones

  • Clasificación de gramáticas

  • Lenguajes LR

  • Eliminando Ambiguedad

  • Manejo de errores y recuperación de errores

Oscar Bonilla32Universidad Galileo


Lenguajes LR

  • Un lenguaje libre de contexto es un lenguaje LR sí y sólo sí puede ser generado por una gramática LR(k) para algún k

Oscar Bonilla33Universidad Galileo


Lenguajes LR

  • El conjunto de lenguajes LR es independiente de la distancia de lookahead k

  • Dada cualquier gramática LR(k) Gk, existe unagramática LR(0) G0tal que L(Gk) = L(G0)

  • Para todos los lenguajes que vimos con gramáticas SLR(1), LALR(1) y LR(1), ¡¡¡podríamos haber encontrado una gramática LR(0)!!!

Oscar Bonilla34Universidad Galileo


Ejemplo

  • Lenguaje

    • Cero o más paréntesis abiertos seguidos de un número igual de paréntesis cerrados

    • o un solo paréntesis abierto

  • Gramática LR(1)

    • <S>  <X> $

    • <X>  <Y>

    • <X>  (

    • <Y>  ( <Y> )

    • <Y>  

  • ¿Hay alguna gramática LR(0) para este lenguaje?

Oscar Bonilla35Universidad Galileo


(

s0

s1

s2

<S>  • <X> $

<X>  • Y

<X>  • (

<Y>  • ( <Y> )

<Y>  •

<X>  ( •

<Y>  ( • <Y> )

<Y>  • ( <Y> )

<Y>  •

<Y>  ( • <Y> )

<Y>  • ( <Y> )

<Y>  •

s3

s4

s6

s5

<Y>  ( <Y> • )

<Y>  ( <Y> ) •

<S>  <X> • $

<X>  <Y> •

26

Ejemplo Expandido DFA

<S>  <X> $

<X>  <Y>

<X>  (

<Y>  ( <Y> )

<Y>  

(

(

Y

Y

Y

X

)

Oscar Bonilla36Universidad Galileo


(

s0

s1

s2

<S>  • <X> $

<X>  • Y

<X>  • (

<Y>  • ( <Y> )

<Y>  •

<X>  ( •

<Y>  ( • <Y> )

<Y>  • ( <Y> )

<Y>  •

<Y>  ( • <Y> )

<Y>  • ( <Y> )

<Y>  •

s3

s4

s6

s5

<Y>  ( <Y> • )

<Y>  ( <Y> ) •

<S>  <X> • $

<X>  <Y> •

26

Ejemplo Expandido DFA

<S>  <X> $

<X>  <Y>

<X>  (

<Y>  ( <Y> )

<Y>  

(

(

Y

Y

Y

X

)

Oscar Bonilla37Universidad Galileo


Ejemplo

  • Lenguaje

    • Cero o más paréntesis abiertos seguidos de un número igual de paréntesis cerrados

    • o un solo paréntesis abierto

  • Gramática LR(1)

    • <S>  <X> $

    • <X>  <Y>

    • <X>  (

    • <Y>  ( <Y> )

    • <Y>  

  • Gramática LR(0)

    • <S>  <X> $

    • <X>  <Y>

    • <X>  ( <Z>

    • <X>  <Z>

    • <Y>  ( <Y> )

    • <Y>  <Z>

    • <Z>  

Oscar Bonilla38Universidad Galileo


(

s0

s1

s2

<S>  • <X> $

<X>  • <Y>

<X>  • ( <Z>

<X>  •<Z>

<Y>  • ( <Y> )

<Y>  • <Z>

<Y>  ( • <Y> )

<X>  ( • <Z>

<Y>  • ( <Y> )

<Y>  • <Z>

<Y>  ( • <Y> )

<Y>  • ( <Y> )

<Y>  • <Z>

s3

s4

s6

s7

s5

<Y>  ( <Y> • )

<Y>  ( <Y> ) •

<S>  <X> • $

<Z>  •

<X>  <Y> •

DFA del Ejemplo

<S>  <X> $

<X>  <Y>

<X>  ( <Z>

<X>  <Z>

<Y>  ( <Y> )

<Y>  <Z>

<Z>  

Z

(

Z

Z

(

Y

Y

Y

X

)

Oscar Bonilla39Universidad Galileo


(

s0

s1

s2

<S>  • <X> $

<X>  • <Y>

<X>  • ( <Z>

<X>  •<Z>

<Y>  • ( <Y> )

<Y>  • <Z>

<Y>  ( • <Y> )

<X>  ( • <Z>

<Y>  • ( <Y> )

<Y>  • <Z>

<Y>  ( • <Y> )

<Y>  • ( <Y> )

<Y>  • <Z>

s3

s4

s6

s7

s5

<Y>  ( <Y> • )

<Y>  ( <Y> ) •

<S>  <X> • $

<Z>  •

<X>  <Y> •

DFA del Ejemplo

<S>  <X> $

<X>  <Y>

<X>  ( <Z>

<X>  <Z>

<Y>  ( <Y> )

<Y>  <Z>

<Z>  

Z

(

Z

Z

(

Y

Y

Y

X

)

Oscar Bonilla40Universidad Galileo


Lenguajes LR

  • El conjunto de lenguajes LR es independiente de la distancia de lookahead k

  • Dada cualquier gramática LR(k) Gk, existe unagramática LR(0) G0tal que L(Gk) = L(G0)

  • Para todos los lenguajes que vimos con gramáticas SLR(1), LALR(1) y LR(1), ¡¡¡podríamos haber encontrado una gramática LR(0)!!!

  • ¡¡¡Pero esto puede ser muy difícil!!!

Oscar Bonilla41Universidad Galileo


Resumen

  • Repaso de parseo LR y algunas clarificaciones

  • Clasificación de gramáticas

  • Lenguajes LR

  • Eliminando Ambiguedad

  • Manejo de errores y recuperación de errores

Oscar Bonilla42Universidad Galileo


Lenguajes Ambiguos

  • Un lenguaje libre de contexto es inherentemente ambiguo si toda gramática que genera el lenguaje es ambigua

  • Sin embargo, la mayoría de gramáticas ambiguas encontradas en la práctica son para lenguajes no ambiguos

    • Queremos hacerlas no ambiguas

Oscar Bonilla43Universidad Galileo


Gramáticas Ambiguas

  • Si tenemos una gramática ambigua para un lenguaje no ambiguo, podemos:

    • Escribir una gramática no ambigua

    • Usar precedencia y asociatividad para resolver los conflictos en las acciones del parser

Oscar Bonilla44Universidad Galileo


Ejemplo

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

Oscar Bonilla45Universidad Galileo


Ejemplo

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

  • Escribiendo una gramática no ambigua

Oscar Bonilla46Universidad Galileo


Ejemplo

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

  • Escribiendo una gramática no ambigua

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

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

    <F>  ( <E> ) | id

Oscar Bonilla47Universidad Galileo


<S>  <E> $

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

Oscar Bonilla48Universidad Galileo


s2

s0

s6

<S>  ( • <E> )

<E>  • <E> + <E>

<E>  • <E> * <E>

<E>  • ( <E> )

<E>  • id

<S>  • <E>

<E>  • <E> + <E>

<E>  • <E> * <E>

<E>  • ( <E> )

<E>  • id

<E>  <E> • + <E>

<E>  <E> • * <E>

<E>  ( <E> •)

s9

s3

s7

s1

<E>  ( <E> ) •

<E>  id •

<E>  <E> + <E> •

<E>  <E> • + <E>

<E>  <E> • * <E>

<S>  <E> •

<E>  <E> • + <E>

<E>  <E> • * <E>

s5

s8

s4

<S>  <E> * • <E>

<E>  • <E> + <E>

<E>  • <E> * <E>

<E>  • ( <E> )

<E>  • id

<S>  <E> * <E>•

<E>  <E> • + <E>

<E>  <E> • * <E>

<S>  <E> + • <E>

<E>  • <E> + <E>

<E>  • <E> * <E>

<E>  • ( <E> )

<E>  • id

<S>  <E> $

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

Oscar Bonilla49Universidad Galileo


s0

$

id

+

id

*

id

Oscar Bonilla50Universidad Galileo


s7

<E>

s4

+

s1

<E>

s0

$

id

+

id

*

id

Oscar Bonilla51Universidad Galileo


s7

<E>  <E> + <E> •

<E>  <E> • + <E>

<E>  <E> • * <E>

Shift or reduce

s7

<E>

s4

+

s1

<E>

s0

$

id

+

id

*

id

Oscar Bonilla52Universidad Galileo


Usando Precedencia y Asociatividad

  • Construimos el DFA y construimos la tabla de parseo

  • Cuando hay un conflicto usamos la información de precedencia y asociatividad

Oscar Bonilla53Universidad Galileo


Otro Ejemplo

<stmt>  if <expr> then <stmt> else <stmt>

<stmt>  if <expr> then <stmt>

<stmt>  other

Oscar Bonilla54Universidad 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 Bonilla55Universidad 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 Bonilla56Universidad 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 Bonilla57Universidad 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 Bonilla58Universidad 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 Bonilla59Universidad 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 Bonilla60Universidad Galileo


s2

s0

s6

<S>  <E> •

<S>  • <E>

<E>  • i <E> o <E>

<E>  • <I> <E>

<E>  •<A>

<E>  i <E> o <E> •

s3

s1

<S>  <A> •

<E>  i • <E> o <E>

<E>  i • <E>

<E>  • i <E> o <E>

<E>  • i <E>

<E>  •<A>

s5

s4

<E>  i <E> o • <E>

<E>  • i <E> o <E>

<E>  • i <E>

<E>  •<A>

<E>  i <E> • o <E>

<E>  i <E> •

E

<S>  <E> $

<E>  i <E> o <E> | i <E> | <A>

A

i

i

A

A

E

i

E

o

Oscar Bonilla61Universidad Galileo


s2

s0

s6

<S>  <E> •

<S>  • <E>

<E>  • i <E> o <E>

<E>  • <I> <E>

<E>  •<A>

<E>  i <E> o <E> •

s3

s1

<S>  <A> •

<E>  i • <E> o <E>

<E>  i • <E>

<E>  • i <E> o <E>

<E>  • i <E>

<E>  •<A>

s5

s4

<E>  i <E> o • <E>

<E>  • i <E> o <E>

<E>  • i <E>

<E>  •<A>

<E>  i <E> • o <E>

<E>  i <E> •

E

<S>  <E> $

<E>  i <E> o <E> | i <E> | <A>

A

i

i

A

A

E

i

E

o

Oscar Bonilla62Universidad Galileo


<S>  <E> $

<E>  i <E> o <E> | i <E> | <A>

Oscar Bonilla63Universidad Galileo


<S>  <E> $

<E>  i <E> o <E> | i <E> | <A>

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

Oscar Bonilla64Universidad Galileo


s0

$

i

i

a

o

a

Oscar Bonilla65Universidad Galileo


s1

i

s0

$

i

i

a

o

a

Oscar Bonilla66Universidad Galileo


s1

i

s1

i

s0

$

i

i

a

o

a

Oscar Bonilla67Universidad Galileo


s3

A

s1

i

s1

i

s0

$

i

i

a

o

a

Oscar Bonilla68Universidad Galileo


E

s1

i

s1

i

s0

$

i

i

a

o

a

Oscar Bonilla69Universidad Galileo


s4

E

s1

i

s1

i

s0

$

i

i

a

o

a

Oscar Bonilla70Universidad Galileo


s4

E

s1

i

s1

i

s0

$

i

i

a

o

a

Oscar Bonilla71Universidad Galileo


Como asocia por la izquierda,

hacemos el shift

s4

E

s1

i

s1

i

s0

$

i

i

a

o

a

Oscar Bonilla72Universidad Galileo


s5

o

s4

E

s1

i

s1

i

s0

$

i

i

a

o

a

Oscar Bonilla73Universidad Galileo


s3

A

s5

o

s4

E

s1

i

s1

i

s0

$

i

i

a

o

a

Oscar Bonilla74Universidad Galileo


E

s5

o

s4

E

s1

i

s1

i

s0

$

i

i

a

o

a

Oscar Bonilla75Universidad Galileo


s6

E

s5

o

s4

E

s1

i

s1

i

s0

$

i

i

a

o

a

Oscar Bonilla76Universidad Galileo


E

s1

i

s0

$

i

i

a

o

a

Oscar Bonilla77Universidad Galileo


s4

E

s1

i

s0

$

i

i

a

o

a

Oscar Bonilla78Universidad Galileo


E

s0

$

i

i

a

o

a

Oscar Bonilla79Universidad Galileo


s3

E

s0

$

i

i

a

o

a

Oscar Bonilla80Universidad Galileo


Resumen

  • Repaso de parseo LR y algunas clarificaciones

  • Clasificación de gramáticas

  • Lenguajes LR

  • Eliminando Ambiguedad

  • Manejo de errores y recuperación de errores

Oscar Bonilla81Universidad 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 rápido para poder detectar errores subsiguientes

    • Tratar de evitar mensajes falsos de error

Oscar Bonilla82Universidad Galileo


Tipos de Errores

  • Léxicos

  • Sintácticos

  • Semánticos

  • Lógicos

Oscar Bonilla83Universidad Galileo


Errores Léxicos

  • Un error que produce un token erroneo

  • Errores léxicos posibles

    • Un identificador, palabra reservada u operador mal escrito (typo)

Oscar Bonilla84Universidad Galileo


Errores Sintácticos

  • Un programa que no satisface la CFG del lenguaje

  • Ejemplos

    • Expresión aritmética con paréntesis no balanceados

    • Un punto y coma faltante

Oscar Bonilla85Universidad Galileo


Errores Semánticos

  • Un error que necesita información sensitiva al contexto para ser identificado

  • Ejemplos

    • Un operador aplicado a un tipo incompatible de operando

    • Accesar una variable no declarada

Oscar Bonilla86Universidad Galileo


Errores Lógicos

  • Errores en el modelo de ejecución

  • Ejemplos

    • Recursión infinita

    • Accesar un arreglo fuera de los límites

    • Dereferenciar un null pointer

Oscar Bonilla87Universidad Galileo


Tipos de recuperación de errores de sintáxis

  • Panic mode recovery

  • Parse level recovery

  • Producciones de error

  • Corrección global

Oscar Bonilla88Universidad Galileo


Panic mode recovery

  • Al descubrir un error

    • pop ceroomásestados/símbolosdel stack

    • descartarcero o mássímbolos 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 Bonilla89Universidad Galileo


Panic mode recovery

  • En error

    • pop del stack hasta que lleguemos a un estado X de donde se pueda hacer ungotopara alguno de los no-terminales de pánico

      • 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 pánico A que encontramos en el paso anterior

    • Push de A y del estadogoto(S,A)en los stacksy seguimos parseando

Oscar Bonilla90Universidad Galileo


Ejemplo de panic mode error recovery

Gramática:

<S>  <E> $

<E>  <X> ; <E> | <X>

<X>  id | <X> = <X>

s0

$

Oscar Bonilla91Universidad Galileo


Ejemplo de panic mode error recovery

Gramática :

<S>  <E> $

<E>  <X> ; <E> | <X>

<X>  id | <X> = <X>

s0

$

id

;

id

id

id

;

id

=

id

Oscar Bonilla92Universidad Galileo


Ejemplo de panic mode error recovery

Gramática :

<S>  <E> $

<E>  <X> ; <E> | <X>

<X>  id | <X> = <X>

s3

id

s0

$

id

;

id

id

id

;

id

=

id

Oscar Bonilla93Universidad Galileo


Ejemplo de panic mode error recovery

Gramática :

<S>  <E> $

<E>  <X> ; <E> | <X>

<X>  id | <X> = <X>

s6

<X>

s0

$

id

;

id

id

id

;

id

=

id

Oscar Bonilla94Universidad Galileo


Ejemplo de panic mode error recovery

Gramática :

<S>  <E> $

<E>  <X> ; <E> | <X>

<X>  id | <X> = <X>

s4

;

s6

<X>

s0

$

id

;

id

id

id

;

id

=

id

Oscar Bonilla95Universidad Galileo


Ejemplo de panic mode error recovery

Gramática :

<S>  <E> $

<E>  <X> ; <E> | <X>

<X>  id | <X> = <X>

s2

<Y>

s0

$

id

;

id

id

id

;

id

=

id

Oscar Bonilla96Universidad Galileo


Ejemplo de panic mode error recovery

Gramática :

<S>  <E> $

<E>  <X> ; <E> | <X>

<X>  id | <X> = <X>

s3

id

s2

<E>

s0

$

id

;

id

id

id

;

id

=

id

Oscar Bonilla97Universidad Galileo


Ejemplo de panic mode error recovery

Gramática :

<S>  <E> $

<E>  <X> ; <E> | <X>

<X>  id | <X> = <X>

s6

<X>

s2

<E>

s0

$

id

;

id

id

id

;

id

=

id

Oscar Bonilla98Universidad Galileo


Ejemplo de panic mode error recovery

Gramática :

<S>  <E> $

<E>  <X> ; <E> | <X>

<X>  id | <X> = <X>

s3

id

s6

<X>

s2

<E>

s0

$

id

;

id

id

id

;

id

=

id

Oscar Bonilla99Universidad Galileo


Ejemplo de panic mode error recovery

Gramática :

<S>  <E> $

<E>  <X> ; <E> | <X>

<X>  id | <X> = <X>

s6

<X>

s6

<X>

s2

<E>

s0

$

id

;

id

id

id

;

id

=

id

Oscar Bonilla100Universidad Galileo


Ejemplo de panic mode error recovery

Gramática :

<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 Bonilla101Universidad Galileo


Ejemplo de panic mode error recovery

Gramática :

<S>  <E> $

<E>  <X> ; <E> | <X>

<X>  id | <X> = <X>

no-terminales de pánico = { <E> ... }

follow(<E>) = { ; }

PANIC

s6

<X>

s6

<X>

s2

<E>

s0

$

id

;

id

id

id

;

id

=

id

Oscar Bonilla102Universidad Galileo


Ejemplo de panic mode error recovery

Gramática :

<S>  <E> $

<E>  <X> ; <E> | <X>

<X>  id | <X> = <X>

no-terminales de pánico = { <E> ... }

follow(<E>) = { ; }

PANIC

s6

<X>

s6

<X>

s2

<E>

s0

$

id

;

id

id

id

;

id

=

id

Oscar Bonilla103Universidad Galileo


Ejemplo de panic mode error recovery

Gramática :

<S>  <E> $

<E>  <X> ; <E> | <X>

<X>  id | <X> = <X>

no-terminales de pánico = { <E> ... }

follow(<E>) = { ; }

PANIC

s2

<E>

s0

$

id

;

id

id

id

;

id

=

id

Oscar Bonilla104Universidad Galileo


Ejemplo de panic mode error recovery

Gramática :

<S>  <E> $

<E>  <X> ; <E> | <X>

<X>  id | <X> = <X>

no-terminales de pánico = { <E> ... }

follow(<E>) = { ; }

PANIC

s2

<E>

s0

$

id

;

id

id

id

;

id

=

id

Oscar Bonilla105Universidad Galileo


Ejemplo de panic mode error recovery

Gramática :

<S>  <E> $

<E>  <X> ; <E> | <X>

<X>  id | <X> = <X>

no-terminales de pánico = { <E> ... }

follow(<E>) = { ; }

PANIC

s2

<E>

s0

$

id

;

id

id

id

;

id

=

id

Oscar Bonilla106Universidad Galileo


Ejemplo de panic mode error recovery

Gramática :

<S>  <E> $

<E>  <X> ; <E> | <X>

<X>  id | <X> = <X>

s2

<E>

s0

$

id

;

id

id

id

;

id

=

id

Oscar Bonilla107Universidad Galileo


Ejemplo de panic mode error recovery

Gramática :

<S>  <E> $

<E>  <X> ; <E> | <X>

<X>  id | <X> = <X>

s3

id

s2

<E>

s0

$

id

;

id

id

id

;

id

=

id

Oscar Bonilla108Universidad 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 Bonilla109Universidad Galileo


Ejemplo de parser level error recovery

  • Action Table

s0

$

(

(

)

(

$

Oscar Bonilla110Universidad Galileo


Ejemplo de parser level error recovery

  • Action Table

s3

X

s2

(

s0

$

(

(

)

(

$

Oscar Bonilla111Universidad Galileo


Ejemplo de parser level error recovery

  • Action Table

s3

X

s2

(

s0

$

(

(

)

(

$

Oscar Bonilla112Universidad Galileo


Ejemplo de parser level error recovery

  • Action Table

s3

X

Invocamos rutina de recuperación de error

s2

(

s0

$

(

(

)

(

$

Oscar Bonilla113Universidad Galileo


Ejemplo de parser level error recovery

  • Action Table

s3

X

Invocamos rutina de recuperación de error

s2

(

s0

$

(

(

)

)

$

Oscar Bonilla114Universidad Galileo


Ejemplo de parser level error recovery

  • Action Table

s3

X

s2

(

s0

$

(

(

)

)

$

Oscar Bonilla115Universidad Galileo


Ejemplo de parser level error recovery

  • Action Table

s4

)

s3

X

s2

(

s0

$

(

(

)

)

$

Oscar Bonilla116Universidad Galileo


Producciones de Error

  • Agregamos producciones especiales de la forma A   error para manejar errores.

    • errorse trata como un símbolo 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 acción de parseo legal a partir del estado F

Oscar Bonilla117Universidad Galileo


Ejemplo de Producciones de Error

  • Gramática

    <S>  <E> $

    <E>  <X> ; <E> | <X>

    <X>  id | <X> = <X>

Oscar Bonilla118Universidad Galileo


Ejemplo de Producciones de Error

  • Gramática

    <S>  <E> $

    <E>  <X> ; <E> | <X>

    <X>  id | <X> = <X> | error

Oscar Bonilla119Universidad Galileo


Ejemplo de Producciones de Error

  • Gramática

    <S>  <E> $

    <E>  <X> ; <E> | <X>

    <X>  id | <X> = <X> | error

s0

$

Oscar Bonilla120Universidad Galileo


Ejemplo de Producciones de Error

  • Gramática

    <S>  <E> $

    <E>  <X> ; <E> | <X>

    <X>  id | <X> = <X> | error

s0

$

id

;

id

id

id

;

id

=

id

Oscar Bonilla121Universidad Galileo


Ejemplo de Producciones de Error

  • Gramática

    <S>  <E> $

    <E>  <X> ; <E> | <X>

    <X>  id | <X> = <X> | error

s0

$

id

;

id

id

id

;

id

=

id

Oscar Bonilla122Universidad Galileo


Ejemplo de Producciones de Error

  • Gramática

    <S>  <E> $

    <E>  <X> ; <E> | <X>

    <X>  id | <X> = <X> | error

s3

id

s0

$

id

;

id

id

id

;

id

=

id

Oscar Bonilla123Universidad Galileo


Ejemplo de Producciones de Error

  • Gramática

    <S>  <E> $

    <E>  <X> ; <E> | <X>

    <X>  id | <X> = <X> | error

s6

<X>

s0

$

id

;

id

id

id

;

id

=

id

Oscar Bonilla124Universidad Galileo


Ejemplo de Producciones de Error

  • Gramática

    <S>  <E> $

    <E>  <X> ; <E> | <X>

    <X>  id | <X> = <X> | error

s4

;

s6

<X>

s0

$

id

;

id

id

id

;

id

=

id

Oscar Bonilla125Universidad Galileo


Ejemplo de Producciones de Error

  • Gramática

    <S>  <E> $

    <E>  <X> ; <E> | <X>

    <X>  id | <X> = <X> | error

s2

<Y>

s0

$

id

;

id

id

id

;

id

=

id

Oscar Bonilla126Universidad Galileo


Ejemplo de Producciones de Error

  • Gramática

    <S>  <E> $

    <E>  <X> ; <E> | <X>

    <X>  id | <X> = <X> | error

s3

id

s2

<E>

s0

$

id

;

id

id

id

;

id

=

id

Oscar Bonilla127Universidad Galileo


Ejemplo de Producciones de Error

  • Gramática

    <S>  <E> $

    <E>  <X> ; <E> | <X>

    <X>  id | <X> = <X> | error

s6

<X>

s2

<E>

s0

$

id

;

id

id

id

;

id

=

id

Oscar Bonilla128Universidad Galileo


Ejemplo de Producciones de Error

  • Gramática

    <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 Bonilla129Universidad Galileo


Ejemplo de Producciones de Error

  • Gramática

    <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 Bonilla130Universidad Galileo


Ejemplo de Producciones de Error

  • Gramática

    <S>  <E> $

    <E>  <X> ; <E> | <X>

    <X>  id | <X> = <X> | error

Error

s6

<X>

s6

<X>

s2

<E>

s0

$

id

;

id

id

error

id

;

id

=

id

Oscar Bonilla131Universidad Galileo


Ejemplo de Producciones de Error

  • Gramática

    <S>  <E> $

    <E>  <X> ; <E> | <X>

    <X>  id | <X> = <X> | error

Error

s6

<X>

s6

<X>

s2

<E>

s0

$

id

;

id

id

error

id

;

id

=

id

Oscar Bonilla132Universidad Galileo


Ejemplo de Producciones de Error

  • Gramática

    <S>  <E> $

    <E>  <X> ; <E> | <X>

    <X>  id | <X> = <X> | error

Error

s2

<E>

s0

$

id

;

id

id

error

id

;

id

=

id

Oscar Bonilla133Universidad Galileo


Ejemplo de Producciones de Error

  • Gramática

    <S>  <E> $

    <E>  <X> ; <E> | <X>

    <X>  id | <X> = <X> | error

Error

s5

error

s2

<E>

s0

$

id

;

id

id

error

id

;

id

=

id

Oscar Bonilla134Universidad Galileo


Ejemplo de Producciones de Error

  • Gramática

    <S>  <E> $

    <E>  <X> ; <E> | <X>

    <X>  id | <X> = <X> | error

Error

s5

error

s2

<E>

s0

$

id

;

id

id

error

id

;

id

=

id

Oscar Bonilla135Universidad Galileo


Ejemplo de Producciones de Error

  • Gramática

    <S>  <E> $

    <E>  <X> ; <E> | <X>

    <X>  id | <X> = <X> | error

Error

s5

error

s2

<E>

s0

$

id

;

id

id

error

id

;

id

=

id

Oscar Bonilla136Universidad Galileo


Ejemplo de Producciones de Error

  • Gramática

    <S>  <E> $

    <E>  <X> ; <E> | <X>

    <X>  id | <X> = <X> | error

s5

error

s2

<E>

s0

$

id

;

id

id

error

id

;

id

=

id

Oscar Bonilla137Universidad Galileo


Ejemplo de Producciones de Error

  • Gramática

    <S>  <E> $

    <E>  <X> ; <E> | <X>

    <X>  id | <X> = <X> | error

s2

<E>

s0

$

id

;

id

id

error

id

;

id

=

id

Oscar Bonilla138Universidad Galileo


Ejemplo de Producciones de Error

  • Gramática

    <S>  <E> $

    <E>  <X> ; <E> | <X>

    <X>  id | <X> = <X> | error

s3

id

s2

<E>

s0

$

id

;

id

id

error

id

;

id

=

id

Oscar Bonilla139Universidad Galileo


Corrección Global

  • Tratamos de anticipar las acciones del programador

  • Hacemos el programa legal elijiendo la mínima cantidad de cambios

  • Muchos problemas

    • Costoso

    • Los cambios pueden crear un programa semánticamente correcto, ¡¡¡pero no el que el programador quería escribir!!!

Oscar Bonilla140Universidad Galileo


Lecturas

  • El Tigre

    • Chapter 5

  • La Ballena

    • 3.1, 3.2, 3.3, 3.4

  • El Dragón

    • Chapter 6

Oscar Bonilla141Universidad Galileo


  • Login