Clasificación de Gramáticas y Manejo de Errores

Slides:



Advertisements
Presentaciones similares
ANALIZADOR SEMANTICO DIANA CAROLINA CASTAÑO YANCI VIVIANA CASTRO PEDRO LUIS FLÓREZ SANTIAGO GUTIÉRREZ A.
Advertisements

ANALIZADOR SINTACTICO
Análisis Sintáctico Capítulo 4.
Análisis Sintáctico Descendente
Compiladores e intérpretes Análisis Sintáctico II
Compiladores e intérpretes Generación de código intermedio II
Compiladores e intérpretes
Compiladores e intérpretes Análisis Sintáctico III
Compiladores e intérpretes Análisis Sintáctico VI
Analizador Sintáctico
Gramáticas Libres de Contexto
Análisis Lexicográfico
Organización de Lenguajes y Compiladores 1
ANALIZADOR SINTACTICO
Analizadores Sintácticos Descendentes Predictivos
Unidad 3. Análisis Sintáctico
1 Parsing Un parser podría ser definido como un programa que analiza una porción de texto para determinar su estructura lógica: la fase de parsing en un.
Teoría de Autómatas y Lenguajes Formales Alma María Pisabarro, 2007
Traducción dirigida por la Sintaxis
ANALISIS SINTACTICO DESCENDENTE
Tema 4. Gramáticas y Análisis Sintáctico PARSER
FUNCIONES Y PROCEDIMIENTOS
ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como.
Teoría de lenguajes y compiladores
APLICACIONES DE PILAS Estructuras de Datos.
Analizador Sintáctico Descendente
Álgebra elemental.
Tema 2 Lenguajes Formales.
Programación de sistemas
Semana 5 Subprogramas..
M.C. Meliza Contreras González
Análisis sintáctico LR: SLR (LR simple)
Instituto Tecnologico de Durango Programacion de Sistemas II
Procesadores del Lenguaje
Lenguajes Libres de Contexto
Teoría de lenguajes y compiladores
M.C. Juan Carlos Olivares Rojas
ANALISIS SINTACTICO Parte I
Material de apoyo Unidad 4 Estructura de datos
Teoría de lenguajes y compiladores
Procesadores de Lenguajes
Introducción al Análisis Sintáctico
Compiladores e intérpretes Análisis Sintáctico III
Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)
Programación de Sistemas
Compiladores e intérpretes
Tema 1. Introducción y Conceptos Básicos
Análisis Léxico Área Software de Base.
Compiladores Análisis Léxico Oscar Bonilla Universidad Galileo.
Analizadores LR(1) y LALR()
Programación de Sistemas FEI – 2008
Unidad 1. Introducción a los Compiladores.
Términos algoritmo diseñar algoritmo implementar algoritmo
UNIVERSIDAD LATINA (UNILA)
LE, EI, Profesor Ramón Castro Liceaga UNIVERSIDAD LATINA (UNILA) TRADUCTORES Y ANALIZADOR LEXICOGRÁFICO.
1 Sebastián Argüello A60490 semana 3 Autómatas y compiladores CI-1322.
Teoría de lenguajes y compiladores
Autómatas y Compiladores Novena Semana. Ricardo Vargas Del Valle A35469.
Compiladores Análisis Léxico Oscar Bonilla Universidad Galileo.
Teoría de lenguajes y compiladores
El proceso de compilación
IV. GRAMÁTICAS DISTRIBUIDAS Y TABLAS DE SÍMBOLOS
Semana #8 Kathryn Jones Pérez A Analizadores sintácticos LR Existen tres técnicas para construir tablas de análisis sintáctico LR para una gramática.
Programación de Sistemas
Conceptos y Lenguaje Imperativo
REPÚBLICA BOLIVARIANA DE VENEZUELA MINISTERIO DEL PODER POPULAR PARA LA EDUCACION SUPERIOR UNIVERSIDAD VALLE DEL MOMBOY CARVAJAL EDO. TRUJILLO ENERO 2014.
REGLAS PARA ELABORAR SEUDOCODIGOS Y DIAGRAMA DE FLUJO
Sintaxis y Semántica. S.Takahashi Fases en el proceso de análisis de lenguajes Lexer Parser caracteres tokensrespuesta.
Compiladores Introducción al Análisis Sintáctico Gramáticas de Contexto Libre, Arboles de Parseo y Derivaciones.
Compiladores Introducción al Análisis Sintáctico Gramáticas de Contexto Libre, Arboles de Parseo y Derivaciones.
Transcripción de la presentación:

Clasificación de Gramáticas y Manejo de Errores

Oscar Bonilla 2 Universidad 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 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 ejecución, la diferencia está en la construcción de la tabla de parseo Entonces, ¿dónde está el look ahead? Oscar Bonilla 3 Universidad 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 Bonilla 4 Universidad Galileo

Oscar Bonilla 5 Universidad Galileo LR(0) SL (1) Oscar Bonilla 5 Universidad Galileo

Oscar Bonilla 6 Universidad 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 Bonilla 6 Universidad 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 Bonilla 7 Universidad Galileo

Construcción de un parse engine SLR(1) Agregamos la producción 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 $ 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 Bonilla 8 Universidad 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 funciones closure y goto Construimos la tabla de parseo LR(1) Parser Engine Oscar Bonilla 9 Universidad Galileo

Oscar Bonilla 10 Universidad 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 Bonilla 10 Universidad Galileo

Clasificación de Gramáticas Context free Oscar Bonilla 11 Universidad Galileo

Clasificación de Gramáticas Context free G0 regular Oscar Bonilla 12 Universidad Galileo

Oscar Bonilla 13 Universidad 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 Bonilla 13 Universidad Galileo

Clasificación de Gramáticas Context free LR(0) G0 G1 regular Oscar Bonilla 14 Universidad Galileo

Oscar Bonilla 15 Universidad 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 Bonilla 15 Universidad Galileo

Clasificación de Gramáticas Context free SLR(1) LR(0) G0 G1 G2 regular Oscar Bonilla 16 Universidad Galileo

Oscar Bonilla 17 Universidad 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 Bonilla 17 Universidad Galileo

Clasificación de Gramáticas Context free LALR(1) SLR(1) LR(0) G0 G1 G2 G3 regular Oscar Bonilla 18 Universidad Galileo

Oscar Bonilla 19 Universidad 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 Bonilla 19 Universidad Galileo

Clasificación de Gramáticas Context free LR(1) LALR(1) SLR(1) LR(0) G0 G1 G2 G3 G4 regular Oscar Bonilla 20 Universidad Galileo

Oscar Bonilla 21 Universidad 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 Bonilla 21 Universidad 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 Bonilla 22 Universidad Galileo

Oscar Bonilla 23 Universidad 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 Bonilla 23 Universidad 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 Bonilla 24 Universidad 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 Bonilla 25 Universidad 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 Bonilla 26 Universidad Galileo

Oscar Bonilla 27 Universidad 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 Bonilla 27 Universidad 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 Bonilla 28 Universidad 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 Bonilla 29 Universidad 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 Bonilla 30 Universidad Galileo

Oscar Bonilla 31 Universidad Galileo Pregunta ¿Qué hay acerca del lenguaje? G8 = { (i )j (k | i = j = k } Oscar Bonilla 31 Universidad Galileo

Oscar Bonilla 32 Universidad 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 Bonilla 32 Universidad Galileo

Oscar Bonilla 33 Universidad 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 Bonilla 33 Universidad Galileo

Oscar Bonilla 34 Universidad Galileo Lenguajes LR El conjunto de lenguajes LR es independiente de la distancia de lookahead k Dada cualquier gramática LR(k) Gk, existe una gramática LR(0) G0 tal 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 Bonilla 34 Universidad Galileo

Oscar Bonilla 35 Universidad 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 Bonilla 35 Universidad Galileo

Oscar Bonilla 36 Universidad Galileo 26 Ejemplo Expandido DFA <S>  <X> $ <X>  <Y> <X>  ( <Y>  ( <Y> ) <Y>   ( <Y>  ( • <Y> ) <Y>  • ( <Y> ) <Y>  • s2 <S>  • <X> $ <X>  • Y <X>  • ( <Y>  • ( <Y> ) <Y>  • s0 ( <X>  ( • <Y>  ( • <Y> ) <Y>  • ( <Y> ) <Y>  • s1 ( Y Y <Y>  ( <Y> • ) s3 Y X ) <X>  <Y> • s6 <S>  <X> • $ s5 s4 <Y>  ( <Y> ) • Oscar Bonilla 36 Universidad Galileo

Oscar Bonilla 37 Universidad Galileo 26 Ejemplo Expandido DFA <S>  <X> $ <X>  <Y> <X>  ( <Y>  ( <Y> ) <Y>   ( <Y>  ( • <Y> ) <Y>  • ( <Y> ) <Y>  • s2 <S>  • <X> $ <X>  • Y <X>  • ( <Y>  • ( <Y> ) <Y>  • s0 ( <X>  ( • <Y>  ( • <Y> ) <Y>  • ( <Y> ) <Y>  • s1 ( Y Y <Y>  ( <Y> • ) s3 Y X ) <X>  <Y> • s6 <S>  <X> • $ s5 s4 <Y>  ( <Y> ) • Oscar Bonilla 37 Universidad Galileo

Oscar Bonilla 38 Universidad 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 Bonilla 38 Universidad Galileo

Oscar Bonilla 39 Universidad Galileo DFA del Ejemplo <S>  <X> $ <X>  <Y> <X>  ( <Z> <X>  <Z> <Y>  ( <Y> ) <Y>  <Z> <Z>   <Z>  • s7 ( <Y>  ( • <Y> ) <Y>  • ( <Y> ) <Y>  • <Z> s2 Z <S>  • <X> $ <X>  • <Y> <X>  • ( <Z> <X>  • <Z> <Y>  • ( <Y> ) <Y>  • <Z> s0 ( Z Z <Y>  ( • <Y> ) <X>  ( • <Z> <Y>  • ( <Y> ) <Y>  • <Z> s1 ( Y Y <Y>  ( <Y> • ) s3 Y X ) <X>  <Y> • s6 <S>  <X> • $ s5 s4 <Y>  ( <Y> ) • Oscar Bonilla 39 Universidad Galileo

Oscar Bonilla 40 Universidad Galileo DFA del Ejemplo <S>  <X> $ <X>  <Y> <X>  ( <Z> <X>  <Z> <Y>  ( <Y> ) <Y>  <Z> <Z>   <Z>  • s7 ( <Y>  ( • <Y> ) <Y>  • ( <Y> ) <Y>  • <Z> s2 Z <S>  • <X> $ <X>  • <Y> <X>  • ( <Z> <X>  • <Z> <Y>  • ( <Y> ) <Y>  • <Z> s0 ( Z Z <Y>  ( • <Y> ) <X>  ( • <Z> <Y>  • ( <Y> ) <Y>  • <Z> s1 ( Y Y <Y>  ( <Y> • ) s3 Y X ) <X>  <Y> • s6 <S>  <X> • $ s5 s4 <Y>  ( <Y> ) • Oscar Bonilla 40 Universidad Galileo

Oscar Bonilla 41 Universidad Galileo Lenguajes LR El conjunto de lenguajes LR es independiente de la distancia de lookahead k Dada cualquier gramática LR(k) Gk, existe una gramática LR(0) G0 tal 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 Bonilla 41 Universidad Galileo

Oscar Bonilla 42 Universidad 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 Bonilla 42 Universidad Galileo

Oscar Bonilla 43 Universidad 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 Bonilla 43 Universidad Galileo

Oscar Bonilla 44 Universidad 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 Bonilla 44 Universidad Galileo

Oscar Bonilla 45 Universidad Galileo Ejemplo <E>  <E> + <E> | <E> * <E> | ( <E> ) | id Oscar Bonilla 45 Universidad Galileo

Oscar Bonilla 46 Universidad Galileo Ejemplo <E>  <E> + <E> | <E> * <E> | ( <E> ) | id Escribiendo una gramática no ambigua Oscar Bonilla 46 Universidad Galileo

Oscar Bonilla 47 Universidad 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 Bonilla 47 Universidad Galileo

Oscar Bonilla 48 Universidad Galileo <S>  <E> $ <E>  <E> + <E> | <E> * <E> | ( <E> ) | id Oscar Bonilla 48 Universidad Galileo

Oscar Bonilla 49 Universidad Galileo <S>  <E> $ <E>  <E> + <E> | <E> * <E> | ( <E> ) | id <S>  ( • <E> ) <E>  • <E> + <E> <E>  • <E> * <E> <E>  • ( <E> ) <E>  • id s2 <S>  • <E> <E>  • <E> + <E> <E>  • <E> * <E> <E>  • ( <E> ) <E>  • id s0 <E>  <E> • + <E> <E>  <E> • * <E> <E>  ( <E> •) s6 <E>  id • s3 <E>  <E> + <E> • <E>  <E> • + <E> <E>  <E> • * <E> s7 <S>  <E> • <E>  <E> • + <E> <E>  <E> • * <E> s1 <S>  <E> * <E> • <E>  <E> • + <E> <E>  <E> • * <E> s8 <S>  <E> * • <E> <E>  • <E> + <E> <E>  • <E> * <E> <E>  • ( <E> ) <E>  • id s5 <S>  <E> + • <E> <E>  • <E> + <E> <E>  • <E> * <E> <E>  • ( <E> ) <E>  • id s4 <E>  ( <E> ) • s9 Oscar Bonilla 49 Universidad Galileo

Oscar Bonilla 50 Universidad Galileo $ id + id * id Oscar Bonilla 50 Universidad Galileo

Oscar Bonilla 51 Universidad Galileo + s1 <E> s0 $ id + id * id Oscar Bonilla 51 Universidad Galileo

Oscar Bonilla 52 Universidad Galileo <E>  <E> + <E> • <E>  <E> • + <E> <E>  <E> • * <E> s7 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 información de precedencia y asociatividad Oscar Bonilla 53 Universidad Galileo

Oscar Bonilla 54 Universidad Galileo Otro Ejemplo <stmt>  if <expr> then <stmt> else <stmt> <stmt>  if <expr> then <stmt> <stmt>  other Oscar Bonilla 54 Universidad Galileo

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 55 Universidad Galileo

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 56 Universidad Galileo

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 57 Universidad Galileo

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 … Oscar Bonilla 58 Universidad Galileo

Oscar Bonilla 59 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

Oscar Bonilla 60 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

Oscar Bonilla 61 Universidad Galileo <S>  <E> $ <E>  i <E> o <E> | i <E> | <A> <S>  <E> • s2 <S>  • <E> <E>  • i <E> o <E> <E>  • <I> <E> <E>  • <A> s0 E A <S>  <A> • s3 i i <E>  i • <E> o <E> <E>  i • <E> <E>  • i <E> o <E> <E>  • i <E> <E>  • <A> s1 <E>  i <E> o <E> • s6 A A E i <E>  i <E> o • <E> <E>  • i <E> o <E> <E>  • i <E> <E>  • <A> s5 E <E>  i <E> • o <E> <E>  i <E> • s4 o Oscar Bonilla 61 Universidad Galileo

Oscar Bonilla 62 Universidad Galileo <S>  <E> $ <E>  i <E> o <E> | i <E> | <A> <S>  <E> • s2 <S>  • <E> <E>  • i <E> o <E> <E>  • <I> <E> <E>  • <A> s0 E A <S>  <A> • s3 i i <E>  i • <E> o <E> <E>  i • <E> <E>  • i <E> o <E> <E>  • i <E> <E>  • <A> s1 <E>  i <E> o <E> • s6 A A E i <E>  i <E> o • <E> <E>  • i <E> o <E> <E>  • i <E> <E>  • <A> s5 E <E>  i <E> • o <E> <E>  i <E> • s4 o Oscar Bonilla 62 Universidad Galileo

Oscar Bonilla 63 Universidad Galileo <S>  <E> $ <E>  i <E> o <E> | i <E> | <A> Oscar Bonilla 63 Universidad Galileo

Oscar Bonilla 64 Universidad Galileo <S>  <E> $ <E>  i <E> o <E> | i <E> | <A> Follow(<E>) = { i, o, $ } Oscar Bonilla 64 Universidad Galileo

Oscar Bonilla 65 Universidad Galileo $ i i a o a Oscar Bonilla 65 Universidad Galileo

Oscar Bonilla 66 Universidad Galileo $ i i a o a Oscar Bonilla 66 Universidad Galileo

Oscar Bonilla 67 Universidad Galileo $ i i a o a Oscar Bonilla 67 Universidad Galileo

Oscar Bonilla 68 Universidad Galileo $ i i a o a Oscar Bonilla 68 Universidad Galileo

Oscar Bonilla 69 Universidad Galileo $ i i a o a Oscar Bonilla 69 Universidad Galileo

Oscar Bonilla 70 Universidad Galileo $ i i a o a Oscar Bonilla 70 Universidad Galileo

Oscar Bonilla 71 Universidad Galileo $ i i a o a Oscar Bonilla 71 Universidad Galileo

Oscar Bonilla 72 Universidad Galileo Como asocia por la izquierda, hacemos el shift s4 E s1 i s1 i s0 $ i i a o a Oscar Bonilla 72 Universidad Galileo

Oscar Bonilla 73 Universidad Galileo $ i i a o a Oscar Bonilla 73 Universidad Galileo

Oscar Bonilla 74 Universidad Galileo $ i i a o a Oscar Bonilla 74 Universidad Galileo

Oscar Bonilla 75 Universidad Galileo $ i i a o a Oscar Bonilla 75 Universidad Galileo

Oscar Bonilla 76 Universidad Galileo $ i i a o a Oscar Bonilla 76 Universidad Galileo

Oscar Bonilla 77 Universidad Galileo $ i i a o a Oscar Bonilla 77 Universidad Galileo

Oscar Bonilla 78 Universidad Galileo $ i i a o a Oscar Bonilla 78 Universidad Galileo

Oscar Bonilla 79 Universidad Galileo $ i i a o a Oscar Bonilla 79 Universidad Galileo

Oscar Bonilla 80 Universidad Galileo $ i i a o a Oscar Bonilla 80 Universidad Galileo

Oscar Bonilla 81 Universidad 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 Bonilla 81 Universidad Galileo

Oscar Bonilla 82 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 rápido para poder detectar errores subsiguientes Tratar de evitar mensajes falsos de error Oscar Bonilla 82 Universidad Galileo

Oscar Bonilla 83 Universidad Galileo Tipos de Errores Léxicos Sintácticos Semánticos Lógicos Oscar Bonilla 83 Universidad Galileo

Oscar Bonilla 84 Universidad 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 Bonilla 84 Universidad Galileo

Oscar Bonilla 85 Universidad 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 Bonilla 85 Universidad Galileo

Oscar Bonilla 86 Universidad 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 Bonilla 86 Universidad Galileo

Oscar Bonilla 87 Universidad 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 Bonilla 87 Universidad Galileo

Tipos de recuperación de errores de sintáxis Panic mode recovery Parse level recovery Producciones de error Corrección global Oscar Bonilla 88 Universidad Galileo

Oscar Bonilla 89 Universidad Galileo Panic mode recovery Al descubrir un error pop cero o más estados/símbolos del stack descartar cero o más sí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 Bonilla 89 Universidad Galileo

Oscar Bonilla 90 Universidad Galileo Panic mode recovery En error pop del stack hasta que lleguemos a un estado X de donde se pueda hacer un goto para alguno de los no-terminales de 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 estado goto(S,A) en los stacks y seguimos parseando Oscar Bonilla 90 Universidad Galileo

Ejemplo de panic mode error recovery Gramática: <S>  <E> $ <E>  <X> ; <E> | <X> <X>  id | <X> = <X> s0 $ Oscar Bonilla 91 Universidad 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 Bonilla 92 Universidad 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 Bonilla 93 Universidad 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 Bonilla 94 Universidad 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 Bonilla 95 Universidad 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 Bonilla 96 Universidad 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 Bonilla 97 Universidad 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 Bonilla 98 Universidad 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 Bonilla 99 Universidad 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 Bonilla 100 Universidad 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 Bonilla 101 Universidad 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 Bonilla 102 Universidad 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 Bonilla 103 Universidad 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 Bonilla 104 Universidad 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 Bonilla 105 Universidad 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 Bonilla 106 Universidad 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 Bonilla 107 Universidad 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 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 Oscar Bonilla 109 Universidad Galileo

Ejemplo de parser level error recovery Action Table s0 $ ( ( ) ( $ Oscar Bonilla 110 Universidad Galileo

Ejemplo de parser level error recovery Action Table s3 X s2 ( s0 $ ( ( ) ( $ Oscar Bonilla 111 Universidad Galileo

Ejemplo de parser level error recovery Action Table s3 X s2 ( s0 $ ( ( ) ( $ Oscar Bonilla 112 Universidad Galileo

Ejemplo de parser level error recovery Action Table s3 X Invocamos rutina de recuperación de error s2 ( s0 $ ( ( ) ( $ Oscar Bonilla 113 Universidad Galileo

Ejemplo de parser level error recovery Action Table s3 X Invocamos rutina de recuperación de error s2 ( s0 $ ( ( ) ) $ Oscar Bonilla 114 Universidad Galileo

Ejemplo de parser level error recovery Action Table s3 X s2 ( s0 $ ( ( ) ) $ Oscar Bonilla 115 Universidad Galileo

Ejemplo de parser level error recovery Action Table s4 ) s3 X s2 ( s0 $ ( ( ) ) $ Oscar Bonilla 116 Universidad Galileo

Oscar Bonilla 117 Universidad Galileo Producciones de Error Agregamos producciones especiales de la forma A   error  para manejar errores. error se 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 Bonilla 117 Universidad Galileo

Ejemplo de Producciones de Error Gramática <S>  <E> $ <E>  <X> ; <E> | <X> <X>  id | <X> = <X> Oscar Bonilla 118 Universidad Galileo

Ejemplo de Producciones de Error Gramática <S>  <E> $ <E>  <X> ; <E> | <X> <X>  id | <X> = <X> | error Oscar Bonilla 119 Universidad Galileo

Ejemplo de Producciones de Error Gramática <S>  <E> $ <E>  <X> ; <E> | <X> <X>  id | <X> = <X> | error s0 $ Oscar Bonilla 120 Universidad 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 Bonilla 121 Universidad 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 Bonilla 122 Universidad 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 Bonilla 123 Universidad 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 Bonilla 124 Universidad 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 Bonilla 125 Universidad 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 Bonilla 126 Universidad 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 Bonilla 127 Universidad 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 Bonilla 128 Universidad 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 Bonilla 129 Universidad 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 Bonilla 130 Universidad 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 Bonilla 131 Universidad 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 Bonilla 132 Universidad 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 Bonilla 133 Universidad 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 Bonilla 134 Universidad 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 Bonilla 135 Universidad 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 Bonilla 136 Universidad 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 Bonilla 137 Universidad 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 Bonilla 138 Universidad 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 Bonilla 139 Universidad Galileo

Oscar Bonilla 140 Universidad 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 Bonilla 140 Universidad Galileo

Oscar Bonilla 141 Universidad Galileo Lecturas El Tigre Chapter 5 La Ballena 3.1, 3.2, 3.3, 3.4 El Dragón Chapter 6 Oscar Bonilla 141 Universidad Galileo