1.41k likes | 1.87k Views
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?.
E N D
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