Compiladores
Implementando un Parser LR
Contrucción de parser engines SLR(1), LR(1) y LALR(1)
Oscar Bonilla 2 Universidad Galileo
Resumen
• Resumen de la construcción de un parser LR(0)
• Limitaciones de los lenguajes LR(0)
• Construcción de un parser engine SLR(1)
• Limitaciones de los lenguajes SLR(1)
• Construcción de un parser engine LR(1)
• Construcción de un parser engine LALR(1)
Oscar Bonilla 3 Universidad Galileo
Items LR(0)
• Tenemos que capturar cuánto de una producción hemos escaneado hasta ahora
• Representado por 4 ítems– <X> • ( <X> )
– <X> ( • <X> )
– <X> ( <X> • )
– <X> ( <X> ) •
<X> ( <X> )
Oscar Bonilla 4 Universidad Galileo
Ejemplo de ítems
• La gramática<S> <X> $
<X> ( <X> )
<X> ( )
• Items<S> • <X> $
<S> <X> • $
<X> • ( <X> )
<X> ( • <X> )
<X> ( <X> • )
<X> ( <X> ) •
<X> • ( )
<X> ( • )
<X> ( ) •
Oscar Bonilla 5 Universidad Galileo
Idea clave de los Items
• Si el “estado actual” contiene el ítemA • c y el símbolo actual en el buffer de entrada es c – El estado le dice al parser que ejecute un shift– El siguiente estado va a contener A c •
• Si el “estado” contiene el ítem A •– El estado le dice al parser que ejecute un reduce
• Si el “estado” contiene el ítem S • $ y el buffer de entrada está vacío– El estado le dice al parser que ejecute un accept
Oscar Bonilla 6 Universidad Galileo
Closure() de un conjunto de ítems
• Closure encuentra todos los ítems en el mismo “estado”
• Algoritmo para closure(I)– Todo ítem en I es también un ítem en closure(I)– Si A • B está en closure(I) y B • es un
ítem, entonces agregamos B • a closure(I)– Repetir hasta que no se puedan agregar más ítems a
closure(I)
Oscar Bonilla 7 Universidad Galileo
Ejemplo de Closure
• Encontrar closure(<X> ( • <X> ) ) • Items<S> • <X> $<S> <X> • $<X> • ( <X> ) <X> ( • <X> )<X> ( <X> • )<X> ( <X> ) •<X> • ( )<X> ( • )<X> ( ) •
<X> ( • <X> ) <X> • ( <X> )<X> • ( )
Oscar Bonilla 8 Universidad Galileo
Goto() de un conjunto de ítems
• Goto encuentra el nuevo estado después de consumir un símbolo de la gramática mientras estamos en el estado actual
• Algoritmo para goto(I, X)donde I es un conjunto de ítems y X es un símbolo de la gramática
goto(I, X) = closure( { A X • | A • X en I })
• Goto es el nuevo conjunto obtenido al “mover el punto” sobre X
Oscar Bonilla 9 Universidad Galileo
Ejemplo de Goto
• Encontrar goto(<X> ( • <X> ), <X> ) Items<S> • <X> $<S> <X> • $<X> • ( <X> ) <X> ( • <X> )<X> ( <X> • )<X> ( <X> ) •<X> • ( )<X> ( • )<X> ( ) •
<X> ( <X> • )
Oscar Bonilla 10 Universidad Galileo
• Comenzamos con la producción <S’> • <S> $• El primer estado es closure(<S’> • <S> $)• Elegimos un estado I
– Para cada A • X en I
• encontrar goto(I, X)
• si goto(I, X) no es ya un estado, creamos uno
• Agregamos una arista X del estado I al estado goto(I, X)
• Repetimos hasta que no sea posible agregar nada más
Construyendo los estados del DFA
Oscar Bonilla 11 Universidad Galileo
Ejemplo de construcción de los estados del DFA
<S> • <X> $<X> • ( <X> )<X> • ( )
s0<S> <X> • $
s1X
<X> ( • <X> )<X> ( • )<X> • ( <X> )<X> • ( )
s2
(<X> ( <X> • )
X
s3
(
<X> ( ) •
)s5
<X> ( <X> ) •
)s4
Oscar Bonilla 12 Universidad Galileo
Creando las tablas de parseo
• Para cada estado• Transición a otro estado usando un símbolo
terminal es un shift a ese estado (shift to sn)• Transición a otro estado usando un no-terminal es
un goto a ese estado (goto sn)• Si hay un ítem A • en el estado hacemos una
reducción con esa producción para todos los terminales (reduce k)
Oscar Bonilla 13 Universidad Galileo
Ejemplo de Construcción de Parse Table
<S> • <X> $<X> • ( <X> )<X> • ( )
s0<S> <X> • $
s1X
<X> ( • <X> )<X> ( • )<X> • ( <X> )<X> • ( )
s2
(<X> ( <X> • )
X
s3
(
<X> ( ) •
)s5
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 shift to s2 error error goto s1s1 error error accept s2 shift to s2 shift to s5 error goto s3s3 error shift to s4 error s4 reduce (2) reduce (2) reduce (2) s5 reduce (3) reduce (3) reduce (3)
Oscar Bonilla 14 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– Usando las funciones closure y goto
• Construimos la tabla de parseo
LR(0)ParserEngine
Oscar Bonilla 15 Universidad Galileo
Resumen
• Resumen de la construcción de un parser LR(0)
• Limitaciones de los lenguajes LR(0)
• Construcción de un parser engine SLR(1)
• Limitaciones de los lenguajes SLR(1)
• Construcción de un parser engine LR(1)
• Construcción de un parser engine LALR(1)
Oscar Bonilla 16 Universidad Galileo
Ejemplo
• Strings de uno o más paréntesis izquierdos seguidos del mismo número de paréntesis derechos<S> <X> $<X> ( <X> )<X> ( )
• Strings de cero o más paréntesis izquierdos seguidos del mismo número de paréntesis derechos
Oscar Bonilla 17 Universidad Galileo
Ejemplo
• Strings de uno o más paréntesis izquierdos seguidos del mismo número de paréntesis derechos<S> <X> $<X> ( <X> )<X> ( )
• Strings de cero o más paréntesis izquierdos seguidos del mismo número de paréntesis derechos<S> <X> $<X> ( <X> )<X>
Oscar Bonilla 18 Universidad Galileo
Ejemplo
• La gramática<S> <X> $<X> ( <X> )<X>
• Items<S> • <X> $
<S> <X> • $
<X> • ( <X> )
<X> ( • <X> )
<X> ( <X> • )
<X> ( <X> ) •
<X> ????
Oscar Bonilla 19 Universidad Galileo
Ejemplo
• La gramática<S> <X> $<X> ( <X> )<X>
• Items<S> • <X> $
<S> <X> • $
<X> • ( <X> )
<X> ( • <X> )
<X> ( <X> • )
<X> ( <X> ) •
<X> •
Oscar Bonilla 20 Universidad Galileo
Construcción del DFA para el Ejemplo
<S> • <X> $<X> • ( <X> )<X> •
s0
Oscar Bonilla 21 Universidad Galileo
Construcción del DFA para el Ejemplo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
Oscar Bonilla 22 Universidad Galileo
Construcción del DFA para el Ejemplo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(
Oscar Bonilla 23 Universidad Galileo
Construcción del DFA para el Ejemplo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(
Oscar Bonilla 24 Universidad Galileo
Construcción del DFA para el Ejemplo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(
Oscar Bonilla 25 Universidad Galileo
Construcción del DFA para el Ejemplo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
((
Oscar Bonilla 26 Universidad Galileo
Construcción del DFA para el Ejemplo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
Oscar Bonilla 27 Universidad Galileo
Construcción del DFA para el Ejemplo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
Oscar Bonilla 28 Universidad Galileo
Construcción del DFA para el Ejemplo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
Oscar Bonilla 29 Universidad Galileo
Construcción del DFA para el Ejemplo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
Oscar Bonilla 30 Universidad Galileo
Construcción del DFA para el Ejemplo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
Oscar Bonilla 31 Universidad Galileo
Construcción de la tabla de parseo para el Ejemplo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
Oscar Bonilla 32 Universidad Galileo
Construcción de la tabla de parseo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 s1 s2 s3 s4
Oscar Bonilla 33 Universidad Galileo
Construcción de la tabla de parseo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 s1 s2 s3 s4
Oscar Bonilla 34 Universidad Galileo
Construcción de la tabla de parseo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 shift to s2 s1 s2 s3 s4
Oscar Bonilla 35 Universidad Galileo
Construcción de la tabla de parseo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 shift to s2 goto s1s1 s2 s3 s4
Oscar Bonilla 36 Universidad Galileo
Construcción de la tabla de parseo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 shift to s2 goto s1s1 s2 s3 s4
Oscar Bonilla 37 Universidad Galileo
Construcción de la tabla de parseo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 shift to s2/reduce (3) reduce (3) reduce(3) goto s1s1 s2 s3 s4
Oscar Bonilla 38 Universidad Galileo
Construcción de la tabla de parseo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 shift to s2/reduce (3) reduce (3) reduce(3) goto s1s1 s2 s3 s4
Conflictoshift/reduce
Oscar Bonilla 39 Universidad Galileo
Construcción de la tabla de parseo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 shift to s2/reduce (3) reduce (3) reduce(3) goto s1s1 s2 s3 s4
Conflictoshift/reduce
Oscar Bonilla 40 Universidad Galileo
Construcción de la tabla de parseo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 shift to s2/reduce (3) reduce (3) reduce(3) goto s1s1 accept s2 s3 s4
Conflictoshift/reduce
Oscar Bonilla 41 Universidad Galileo
Construcción de la tabla de parseo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 shift to s2/reduce (3) reduce (3) reduce(3) goto s1s1 error error accept s2 s3 s4
Conflictoshift/reduce
Oscar Bonilla 42 Universidad Galileo
Construcción de la tabla de parseo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 shift to s2/reduce (3) reduce (3) reduce(3) goto s1s1 error error accept s2 s3 s4
Conflictoshift/reduce
Oscar Bonilla 43 Universidad Galileo
Construcción de la tabla de parseo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 shift to s2/reduce (3) reduce (3) reduce(3) goto s1s1 error error accept s2 shift to s2 s3 s4
Conflictoshift/reduce
Oscar Bonilla 44 Universidad Galileo
Construcción de la tabla de parseo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 shift to s2/reduce (3) reduce (3) reduce(3) goto s1s1 error error accept s2 shift to s2 goto s3s3 s4
Conflictoshift/reduce
Oscar Bonilla 45 Universidad Galileo
Construcción de la tabla de parseo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 shift to s2/reduce (3) reduce (3) reduce(3) goto s1s1 error error accept s2 shift to s2 goto s3s3 s4
Conflictoshift/reduce
Oscar Bonilla 46 Universidad Galileo
Construcción de la tabla de parseo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 shift to s2/reduce (3) reduce (3) reduce(3) goto s1s1 error error accept s2 shift to s2/reduce (3) reduce (3) reduce(3) goto s3s3 s4
Conflictoshift/reduce Conflicto
shift/reduce
Oscar Bonilla 47 Universidad Galileo
Construcción de la tabla de parseo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 shift to s2/reduce (3) reduce (3) reduce(3) goto s1s1 error error accept s2 shift to s2/reduce (3) reduce (3) reduce(3) goto s3s3 s4
Conflictoshift/reduce Conflicto
shift/reduce
Oscar Bonilla 48 Universidad Galileo
Construcción de la tabla de parseo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 shift to s2/reduce (3) reduce (3) reduce(3) goto s1s1 error error accept s2 shift to s2/reduce (3) reduce (3) reduce(3) goto s3s3 shift to s4 s4
Conflictoshift/reduce Conflicto
shift/reduce
Oscar Bonilla 49 Universidad Galileo
Construcción de la tabla de parseo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 shift to s2/reduce (3) reduce (3) reduce(3) goto s1s1 error error accept s2 shift to s2/reduce (3) reduce (3) reduce(3) goto s3s3 error shift to s4 error s4
Conflictoshift/reduce Conflicto
shift/reduce
Oscar Bonilla 50 Universidad Galileo
Construcción de la tabla de parseo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 shift to s2/reduce (3) reduce (3) reduce(3) goto s1s1 error error accept s2 shift to s2/reduce (3) reduce (3) reduce(3) goto s3s3 error shift to s4 error s4
Conflictoshift/reduce Conflicto
shift/reduce
Oscar Bonilla 51 Universidad Galileo
Construcción de la tabla de parseo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 shift to s2/reduce (3) reduce (3) reduce(3) goto s1s1 error error accept s2 shift to s2/reduce (3) reduce (3) reduce(3) goto s3s3 error shift to s4 error s4 reduce(2) reduce(2) reduce(2)
Conflictoshift/reduce Conflicto
shift/reduce
Oscar Bonilla 52 Universidad Galileo
Construcción de la tabla de parseo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 shift to s2/reduce (3) reduce (3) reduce(3) goto s1s1 error error accept s2 shift to s2/reduce (3) reduce (3) reduce(3) goto s3s3 error shift to s4 error s4 reduce(2) reduce(2) reduce(2)
Conflictoshift/reduce Conflicto
shift/reduce
Oscar Bonilla 53 Universidad Galileo
Construcción de la tabla de parseoACTION Goto
State ( ) $ Xs0 shift to s2/reduce (3) reduce (3) reduce(3) goto s1s1 error error accept s2 shift to s2/reduce (3) reduce (3) reduce(3) goto s3s3 error shift to s4 error s4 reduce(2) reduce(2) reduce(2)
¿Cómo nos libramos de estos conflictos shift/reduce?
Oscar Bonilla 54 Universidad Galileo
Limitaciones de las gramáticas LR(0)
• Muchos conflictos shift/reduce
• Razón– Un ítem X • en el estado actual identifica
una reducción – Pero no selecciona cuándo reducir– Por lo tanto, tenemos que efectuar la reducción
en todos los símbolos de entrada
Oscar Bonilla 55 Universidad Galileo
Resumen
• Resumen de la construcción de un parser LR(0)
• Limitaciones de los lenguajes LR(0)
• Construcción de un parser engine SLR(1)
• Limitaciones de los lenguajes SLR(1)
• Construcción de un parser engine LR(1)
• Construcción de un parser engine LALR(1)
Oscar Bonilla 56 Universidad Galileo
Idea detrás de las gramáticas SLR(1)
• Muchos conflictos shift/reduce en LR(0)– un item X • en el estado actual identifica una
reducción
– Pero no selecciona cuándo reducir
– Por lo tanto, tenemos que efectuar la reducción en todos los símbolos de entrada
• Hacemos la reducción sólo cuando el símbolo de entrada en efecto sigue a la reducción– Tenemos que calcular los terminales que pueden seguir
un símbolo no-terminal
Oscar Bonilla 57 Universidad Galileo
follow()
• Para cada no-terminal A, follow(A) es el conjunto de terminales que pueden venir después de A
follow( ) derivacionA b S Ab • Si hay una secuencia de derivaciones de la forma S
A $ entonces follow(A) va a incluir $
Oscar Bonilla 58 Universidad Galileo
Ejemplo de follow()
• Encontrar follow(<X>) • gramática<S> <X> $<X> ( <X> )<X>
???
Oscar Bonilla 59 Universidad Galileo
Ejemplo de follow()
• Encontrar follow(<X>) • gramática<S> <X> $<X> ( <X> )<X>
)
Oscar Bonilla 60 Universidad Galileo
Ejemplo de follow()
• Encontrar follow(<X>) • gramática<S> <X> $<X> ( <X> )<X>
)
Oscar Bonilla 61 Universidad Galileo
Ejemplo de follow()
• Encontrar follow(<X>) • gramática<S> <X> $<X> ( <X> )<X>
), $
Oscar Bonilla 62 Universidad Galileo
Ejemplo de follow()
• Encontrar follow(<X>) • gramática<S> <X> $<X> ( <X> )<X>
), $
Oscar Bonilla 63 Universidad Galileo
Pregunta: Encuentren follow()
• Qué es follow(<S>) • gramática<S> <X> $<X> ( <X> )<X>
???
Oscar Bonilla 64 Universidad Galileo
Pregunta: Encuentren follow()
• Qué es follow(<S>) • gramática<S> <X> $<X> ( <X> )<X>
$
Oscar Bonilla 65 Universidad Galileo
Construyendo un parser engine SLR(1)
• Agregamos la producción especial S’ S $• Calcular el conjunto follow para todos los no-
terminales• Encontrar los ítems de la CFG• Crear el DFA
– Usando las funciones closure y goto
• Construir la tabla de parseo– Usando el DFA y la información del conjunto
follow
SLRParserEngine
Oscar Bonilla 66 Universidad Galileo
Creando las tablas de parseo
• Para cada estado• La transición a otro estado usando un símbolo
terminal es un shift a ese estado (shift to sn)• La transición a otro estado usando un símbolo no-
terminal es un goto a ese estado (goto sn)• Si hay un ítem A • en el estado,
para todos los terminales c follow(A) hacer una reducción con la producción (reduce k)
Oscar Bonilla 67 Universidad Galileo
Construyendo la tabla de parseo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 s1 s2 s3 s4
follow(<X>) = { ), $ }follow(<S>) = { $ }
Oscar Bonilla 68 Universidad Galileo
Construyendo la tabla de parseo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 s1 s2 s3 s4
follow(<X>) = { ), $ }follow(<S>) = { $ }
Oscar Bonilla 69 Universidad Galileo
Construyendo la tabla de parseo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 shift to s2 s1 s2 s3 s4
follow(<X>) = { ), $ }follow(<S>) = { $ }
Oscar Bonilla 70 Universidad Galileo
Construyendo la tabla de parseo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 shift to s2 goto s1s1 s2 s3 s4
follow(<X>) = { ), $ }follow(<S>) = { $ }
Oscar Bonilla 71 Universidad Galileo
Construyendo la tabla de parseo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 shift to s2 goto s1s1 s2 s3 s4
follow(<X>) = { ), $ }follow(<S>) = { $ }
Oscar Bonilla 72 Universidad Galileo
Construyendo la tabla de parseo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 shift to s2/reduce (3) reduce (3) reduce(3) goto s1s1 s2 s3 s4
follow(<X>) = { ), $ }follow(<S>) = { $ }
Oscar Bonilla 73 Universidad Galileo
Construyendo la tabla de parseo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 shift to s2 reduce (3) goto s1s1 s2 s3 s4
follow(<X>) = { ), $ }follow(<S>) = { $ }
Oscar Bonilla 74 Universidad Galileo
Construyendo la tabla de parseo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 shift to s2 reduce (3) reduce (3) goto s1s1 s2 s3 s4
follow(<X>) = { ), $ }follow(<S>) = { $ }
Oscar Bonilla 75 Universidad Galileo
Construyendo la tabla de parseo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 shift to s2 reduce (3) reduce (3) goto s1s1 s2 s3 s4
follow(<X>) = { ), $ }follow(<S>) = { $ }
Oscar Bonilla 76 Universidad Galileo
Construyendo la tabla de parseo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 shift to s2 reduce (3) reduce (3) goto s1s1 s2 s3 s4
follow(<X>) = { ), $ }follow(<S>) = { $ }
Oscar Bonilla 77 Universidad Galileo
Construyendo la tabla de parseo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 shift to s2 reduce (3) reduce (3) goto s1s1 accept s2 s3 s4
follow(<X>) = { ), $ }follow(<S>) = { $ }
Oscar Bonilla 78 Universidad Galileo
Construyendo la tabla de parseo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 shift to s2 reduce (3) reduce (3) goto s1s1 error error accept s2 s3 s4
follow(<X>) = { ), $ }follow(<S>) = { $ }
Oscar Bonilla 79 Universidad Galileo
Construyendo la tabla de parseo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 shift to s2 reduce (3) reduce (3) goto s1s1 error error accept s2 s3 s4
follow(<X>) = { ), $ }follow(<S>) = { $ }
Oscar Bonilla 80 Universidad Galileo
Construyendo la tabla de parseo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 shift to s2 reduce (3) reduce (3) goto s1s1 error error accept s2 shift to s2 s3 s4
follow(<X>) = { ), $ }follow(<S>) = { $ }
Oscar Bonilla 81 Universidad Galileo
Construyendo la tabla de parseo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 shift to s2 reduce (3) reduce (3) goto s1s1 error error accept s2 shift to s2 goto s3s3 s4
follow(<X>) = { ), $ }follow(<S>) = { $ }
Oscar Bonilla 82 Universidad Galileo
Construyendo la tabla de parseo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 shift to s2 reduce (3) reduce (3) goto s1s1 error error accept s2 shift to s2 goto s3s3 s4
follow(<X>) = { ), $ }follow(<S>) = { $ }
Oscar Bonilla 83 Universidad Galileo
Construyendo la tabla de parseo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 shift to s2 reduce (3) reduce (3) goto s1s1 error error accept s2 shift to s2 goto s3s3 s4
follow(<X>) = { ), $ }follow(<S>) = { $ }
Oscar Bonilla 84 Universidad Galileo
Construyendo la tabla de parseo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 shift to s2 reduce (3) reduce (3) goto s1s1 error error accept s2 shift to s2 reduce (3) goto s3s3 s4
follow(<X>) = { ), $ }follow(<S>) = { $ }
Oscar Bonilla 85 Universidad Galileo
Construyendo la tabla de parseo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 shift to s2 reduce (3) reduce (3) goto s1s1 error error accept s2 shift to s2 reduce (3) reduce(3) goto s3s3 s4
follow(<X>) = { ), $ }follow(<S>) = { $ }
Oscar Bonilla 86 Universidad Galileo
Construyendo la tabla de parseo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 shift to s2 reduce (3) reduce (3) goto s1s1 error error accept s2 shift to s2 reduce (3) reduce(3) goto s3s3 s4
follow(<X>) = { ), $ }follow(<S>) = { $ }
Oscar Bonilla 87 Universidad Galileo
Construyendo la tabla de parseo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 shift to s2 reduce (3) reduce (3) goto s1s1 error error accept s2 shift to s2 reduce (3) reduce(3) goto s3s3 s4
follow(<X>) = { ), $ }follow(<S>) = { $ }
Oscar Bonilla 88 Universidad Galileo
Construyendo la tabla de parseo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 shift to s2 reduce (3) reduce (3) goto s1s1 error error accept s2 shift to s2 reduce (3) reduce(3) goto s3s3 shift to s4 s4
follow(<X>) = { ), $ }follow(<S>) = { $ }
Oscar Bonilla 89 Universidad Galileo
Construyendo la tabla de parseo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 shift to s2 reduce (3) reduce (3) goto s1s1 error error accept s2 shift to s2 reduce (3) reduce(3) goto s3s3 error shift to s4 error s4
follow(<X>) = { ), $ }follow(<S>) = { $ }
Oscar Bonilla 90 Universidad Galileo
Construyendo la tabla de parseo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 shift to s2 reduce (3) reduce (3) goto s1s1 error error accept s2 shift to s2 reduce (3) reduce(3) goto s3s3 error shift to s4 error s4
follow(<X>) = { ), $ }follow(<S>) = { $ }
Oscar Bonilla 91 Universidad Galileo
Construyendo la tabla de parseo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 shift to s2 reduce (3) reduce (3) goto s1s1 error error accept s2 shift to s2 reduce (3) reduce(3) goto s3s3 error shift to s4 error s4
follow(<X>) = { ), $ }follow(<S>) = { $ }
Oscar Bonilla 92 Universidad Galileo
Construyendo la tabla de parseo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 shift to s2 reduce (3) reduce (3) goto s1s1 error error accept s2 shift to s2 reduce (3) reduce(3) goto s3s3 error shift to s4 error s4
follow(<X>) = { ), $ }follow(<S>) = { $ }
Oscar Bonilla 93 Universidad Galileo
Construyendo la tabla de parseo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 shift to s2 reduce (3) reduce (3) goto s1s1 error error accept s2 shift to s2 reduce (3) reduce(3) goto s3s3 error shift to s4 error s4 reduce (2)
follow(<X>) = { ), $ }follow(<S>) = { $ }
Oscar Bonilla 94 Universidad Galileo
Construyendo la tabla de parseo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 shift to s2 reduce (3) reduce (3) goto s1s1 error error accept s2 shift to s2 reduce (3) reduce(3) goto s3s3 error shift to s4 error s4 reduce (2) reduce (2)
follow(<X>) = { ), $ }follow(<S>) = { $ }
Oscar Bonilla 95 Universidad Galileo
Construyendo la tabla de parseo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 shift to s2 reduce (3) reduce (3) goto s1s1 error error accept s2 shift to s2 reduce (3) reduce(3) goto s3s3 error shift to s4 error s4 reduce (2) reduce (2)
follow(<X>) = { ), $ }follow(<S>) = { $ }
Oscar Bonilla 96 Universidad Galileo
Construyendo la tabla de parseo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 shift to s2 reduce (3) reduce (3) goto s1s1 error error accept s2 shift to s2 reduce (3) reduce(3) goto s3s3 error shift to s4 error s4 error reduce (2) reduce (2)
follow(<X>) = { ), $ }follow(<S>) = { $ }
Oscar Bonilla 97 Universidad Galileo
Construyendo la tabla de parseo
<S> • <X> $<X> • ( <X> )<X> •
s0<S> <X> • $
s1X
<X> ( • <X> )<X> • ( <X> )<X> •
s2
(<X> ( <X> • )
X
s3(
<X> ( <X> ) •
)s4
ACTION GotoState ( ) $ Xs0 shift to s2 reduce (3) reduce (3) goto s1s1 error error accept s2 shift to s2 reduce (3) reduce(3) goto s3s3 error shift to s4 error s4 error reduce (2) reduce (2)
follow(<X>) = { ), $ }follow(<S>) = { $ }
Oscar Bonilla 98 Universidad Galileo
Tablas de parseo LR(0) y SLR(1)ACTION Goto
State ( ) $ Xs0 shift to s2 reduce (3) reduce(3) goto s1s1 error error accept s2 shift to s2 reduce (3) reduce(3) goto s3s3 error shift to s4 error s4 error reduce (2) reduce (2)
ACTION GotoState ( ) $ Xs0 shift to s2/reduce (3) reduce (3) reduce(3) goto s1s1 error error accept s2 shift to s2/reduce (3) reduce (3) reduce(3) goto s3s3 error shift to s4 error s4 reduce(2) reduce(2) reduce(2)
SL
R(1
)L
R(0
)
Oscar Bonilla 99 Universidad Galileo
Parser Engine SLR(1)
• Usamos los ítems– Sólo vemos la posición actual– Sin conocimiento del input futuro– SLR(0) ???
• En la reducción– Vemos el siguiente input (usando el conjunto
follow) – Por lo tanto SLR(1)
Oscar Bonilla 100 Universidad Galileo
Resumen
• Resumen de la construcción de un parser LR(0)
• Limitaciones de los lenguajes LR(0)
• Construcción de un parser engine SLR(1)
• Limitaciones de los lenguajes SLR(1)
• Construcción de un parser engine LR(1)
• Construcción de un parser engine LALR(1)
Oscar Bonilla 101 Universidad Galileo
Gramáticas SLR(1) vs LR(1)
• SLR(1) mantiene la posición actual además de alguna información acerca del siguiente caracter de entrada
• LR(1) mantiene información completa acerca del siguiente caracter de entrada
• Examinemos una gramática que es LR(1) pero no SLR(1)
Oscar Bonilla 102 Universidad Galileo
Ejemplo Expandido
• La gramática<S> <X> $
<X> ( <X> )
<X> ( )
• El lenguaje:– Cero o más paréntesis abiertos seguidos de un # igual de
paréntesis cerrados
• Cambiemos el lenguaje a:– Cero o más paréntesis abiertos seguidos de un # igual de
paréntesis cerrados
– o un solo paréntesis abierto
Oscar Bonilla 103 Universidad Galileo
Ejemplo Expandido
Ejemplos:
“((((()))))” “()” “(“ “”
• Cambiemos el lenguaje a:– Cero o más paréntesis abiertos seguidos de un # igual de
paréntesis cerrados– o un solo paréntesis abierto
Oscar Bonilla 104 Universidad Galileo
Gramática del Ejemplo Expandido
<S> <X> $ (1)
<X> <Y> (2)
<X> ( (3)
<Y> ( <Y> ) (4)
<Y> (5)
• Cambiemos el lenguaje a:– Cero o más paréntesis abiertos seguidos de un # igual de
paréntesis cerrados– o un solo paréntesis abierto
Oscar Bonilla 105 Universidad Galileo
Items del Ejemplo Expandido
• Items<S> • <X> $<S> <X> • $<X> • <Y> <X> <Y> •<X> • ( <X> ( •<Y> • ( <Y> ) <Y> ( • <Y> )<Y> ( <Y> • )<Y> ( <Y> ) •<Y> •
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y>
Oscar Bonilla 106 Universidad Galileo
DFA del Ejemplo Expandido
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y>
Oscar Bonilla 107 Universidad Galileo
<S> • <X> $<X> • <Y><X> • ( <Y> • ( <Y> )<Y> •
s0
DFA del Ejemplo Expandido
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y>
Oscar Bonilla 108 Universidad Galileo
<S> • <X> $<X> • <Y><X> • ( <Y> • ( <Y> )<Y> •
s0
(
DFA del Ejemplo Expandido
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y>
Oscar Bonilla 109 Universidad Galileo
<S> • <X> $<X> • <Y><X> • ( <Y> • ( <Y> )<Y> •
s0
( <X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
DFA del Ejemplo Expandido
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y>
Oscar Bonilla 110 Universidad Galileo
<S> • <X> $<X> • <Y><X> • ( <Y> • ( <Y> )<Y> •
s0
( <X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1(
DFA del Ejemplo Expandido
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y>
Oscar Bonilla 111 Universidad Galileo
<S> • <X> $<X> • <Y><X> • ( <Y> • ( <Y> )<Y> •
s0
( <X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
DFA del Ejemplo Expandido
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y>
Oscar Bonilla 112 Universidad Galileo
<S> • <X> $<X> • <Y><X> • ( <Y> • ( <Y> )<Y> •
s0
(Y
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
DFA del Ejemplo Expandido
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y>
Oscar Bonilla 113 Universidad Galileo
<S> • <X> $<X> • <Y><X> • ( <Y> • ( <Y> )<Y> •
s0
(Y
<Y> ( <Y> • )s3
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
DFA del Ejemplo Expandido
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y>
Oscar Bonilla 114 Universidad Galileo
<S> • <X> $<X> • <Y><X> • ( <Y> • ( <Y> )<Y> •
s0
(Y
<Y> ( <Y> • )s3
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
DFA del Ejemplo Expandido
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y>
Oscar Bonilla 115 Universidad Galileo
<S> • <X> $<X> • <Y><X> • ( <Y> • ( <Y> )<Y> •
s0
(Y
<Y> ( <Y> • )s3
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
DFA del Ejemplo Expandido
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y>
Oscar Bonilla 116 Universidad Galileo
<S> • <X> $<X> • <Y><X> • ( <Y> • ( <Y> )<Y> •
s0
(Y
<Y> ( <Y> • )s3
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(Y
DFA del Ejemplo Expandido
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y>
s2
Oscar Bonilla 117 Universidad Galileo
<S> • <X> $<X> • <Y><X> • ( <Y> • ( <Y> )<Y> •
s0
(Y
<Y> ( <Y> • )s3
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
Y
DFA del Ejemplo Expandido
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y>
Oscar Bonilla 118 Universidad Galileo
<S> • <X> $<X> • <Y><X> • ( <Y> • ( <Y> )<Y> •
s0
(Y
)<Y> ( <Y> • )s3
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
Y
DFA del Ejemplo Expandido
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y>
Oscar Bonilla 119 Universidad Galileo
<S> • <X> $<X> • <Y><X> • ( <Y> • ( <Y> )<Y> •
s0
(Y
s4<Y> ( <Y> ) •
)<Y> ( <Y> • )s3
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
Y
DFA del Ejemplo Expandido
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y>
Oscar Bonilla 120 Universidad Galileo
<S> • <X> $<X> • <Y><X> • ( <Y> • ( <Y> )<Y> •
s0
(Y
s4<Y> ( <Y> ) •
)<Y> ( <Y> • )s3
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
X
Y
DFA del Ejemplo Expandido
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y>
Oscar Bonilla 121 Universidad Galileo
<S> • <X> $<X> • <Y><X> • ( <Y> • ( <Y> )<Y> •
s0
<S> <X> • $s5
(Y
s4<Y> ( <Y> ) •
)<Y> ( <Y> • )s3
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
X
Y
DFA del Ejemplo Expandido
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y>
Oscar Bonilla 122 Universidad Galileo
<S> • <X> $<X> • <Y><X> • ( <Y> • ( <Y> )<Y> •
s0
Y
<S> <X> • $s5
(Y
s4<Y> ( <Y> ) •
)<Y> ( <Y> • )s3
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
X
Y
DFA del Ejemplo Expandido
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y>
Oscar Bonilla 123 Universidad Galileo
<S> • <X> $<X> • <Y><X> • ( <Y> • ( <Y> )<Y> •
s0
Y
<S> <X> • $s5
(Y
s4<Y> ( <Y> ) •
)<Y> ( <Y> • )s3
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
<X> <Y> •s6
X
Y
DFA del Ejemplo Expandido
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y>
Oscar Bonilla 124 Universidad Galileo
Conjuntos follow del Ejemplo Expandido
• gramática<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y>
• follow(<S>) = ???
• follow(<X>) = ???
• follow(<Y>) = ???
Oscar Bonilla 125 Universidad Galileo
Conjuntos follow del Ejemplo Expandido
• gramática<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y>
$• follow(<S>) =
• follow(<X>) = ???
• follow(<Y>) = ???
Oscar Bonilla 126 Universidad Galileo
Conjuntos follow del Ejemplo Expandido
• follow(<S>) =
• follow(<X>) =
• follow(<Y>) = ???
• gramática<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y>
$
$
Oscar Bonilla 127 Universidad Galileo
Conjuntos follow del Ejemplo Expandido
• follow(<S>) =
• follow(<X>) =
• follow(<Y>) =
• gramática<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y>
$
), $
$
Oscar Bonilla 128 Universidad Galileo
<S> • <X> $<X> • Y<X> • ( <Y> • ( <Y> )<Y> •
s0
Y
<S> <X> • $s5
(Y
s4<Y> ( <Y> ) •
)<Y> ( <Y> • )s3
ACTION GotoState ( ) $ X Ys0 s1 s2 s3 s4 s5 s6
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
<X> <Y> •s6
X
Y
Oscar Bonilla 129 Universidad Galileo
<S> • <X> $<X> • Y<X> • ( <Y> • ( <Y> )<Y> •
s0
Y
<S> <X> • $s5
(Y
s4<Y> ( <Y> ) •
)<Y> ( <Y> • )s3
ACTION GotoState ( ) $ X Ys0 s1 s2 s3 s4 s5 s6
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
<X> <Y> •s6
X
Y
Oscar Bonilla 130 Universidad Galileo
<S> • <X> $<X> • Y<X> • ( <Y> • ( <Y> )<Y> •
s0
Y
<S> <X> • $s5
(Y
s4<Y> ( <Y> ) •
)<Y> ( <Y> • )s3
ACTION GotoState ( ) $ X Ys0 shift to s1 s1 s2 s3 s4 s5 s6
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
<X> <Y> •s6
X
Y
Oscar Bonilla 131 Universidad Galileo
<S> • <X> $<X> • Y<X> • ( <Y> • ( <Y> )<Y> •
s0
Y
<S> <X> • $s5
(Y
s4<Y> ( <Y> ) •
)<Y> ( <Y> • )s3
ACTION GotoState ( ) $ X Ys0 shift to s1 goto s5 s1 s2 s3 s4 s5 s6
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
<X> <Y> •s6
X
Y
Oscar Bonilla 132 Universidad Galileo
<S> • <X> $<X> • Y<X> • ( <Y> • ( <Y> )<Y> •
s0
Y
<S> <X> • $s5
(Y
s4<Y> ( <Y> ) •
)<Y> ( <Y> • )s3
ACTION GotoState ( ) $ X Ys0 shift to s1 goto s5 goto s6s1 s2 s3 s4 s5 s6
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
<X> <Y> •s6
X
Y
Oscar Bonilla 133 Universidad Galileo
<S> • <X> $<X> • Y<X> • ( <Y> • ( <Y> )<Y> •
s0
Y
<S> <X> • $s5
(Y
s4<Y> ( <Y> ) •
)<Y> ( <Y> • )s3
ACTION GotoState ( ) $ X Ys0 shift to s1 goto s5 goto s6s1 s2 s3 s4 s5 s6
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
<X> <Y> •s6
X
Y
Oscar Bonilla 134 Universidad Galileo
<S> • <X> $<X> • Y<X> • ( <Y> • ( <Y> )<Y> •
s0
Y
<S> <X> • $s5
(Y
s4<Y> ( <Y> ) •
)<Y> ( <Y> • )s3
ACTION GotoState ( ) $ X Ys0 shift to s1 goto s5 goto s6s1 s2 s3 s4 s5 s6
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
<X> <Y> •s6
X
Y
Follow(<Y>) = { ), $ }
Oscar Bonilla 135 Universidad Galileo
<S> • <X> $<X> • Y<X> • ( <Y> • ( <Y> )<Y> •
s0
Y
<S> <X> • $s5
(Y
s4<Y> ( <Y> ) •
)<Y> ( <Y> • )s3
ACTION GotoState ( ) $ X Ys0 shift to s1 reduce (5) goto s5 goto s6s1 s2 s3 s4 s5 s6
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
<X> <Y> •s6
X
Y
Follow(<Y>) = { ), $ }
Oscar Bonilla 136 Universidad Galileo
<S> • <X> $<X> • Y<X> • ( <Y> • ( <Y> )<Y> •
s0
Y
<S> <X> • $s5
(Y
s4<Y> ( <Y> ) •
)<Y> ( <Y> • )s3
ACTION GotoState ( ) $ X Ys0 shift to s1 reduce (5) reduce (5) goto s5 goto s6s1 s2 s3 s4 s5 s6
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
<X> <Y> •s6
X
Y
Follow(<Y>) = { ), $ }
Oscar Bonilla 137 Universidad Galileo
<S> • <X> $<X> • Y<X> • ( <Y> • ( <Y> )<Y> •
s0
Y
<S> <X> • $s5
(Y
s4<Y> ( <Y> ) •
)<Y> ( <Y> • )s3
ACTION GotoState ( ) $ X Ys0 shift to s1 reduce (5) reduce (5) goto s5 goto s6s1 s2 s3 s4 s5 s6
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
<X> <Y> •s6
X
Y
Oscar Bonilla 138 Universidad Galileo
<S> • <X> $<X> • Y<X> • ( <Y> • ( <Y> )<Y> •
s0
Y
<S> <X> • $s5
(Y
s4<Y> ( <Y> ) •
)<Y> ( <Y> • )s3
ACTION GotoState ( ) $ X Ys0 shift to s1 reduce (5) reduce (5) goto s5 goto s6s1 s2 s3 s4 s5 s6
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
<X> <Y> •s6
X
Y
Oscar Bonilla 139 Universidad Galileo
<S> • <X> $<X> • Y<X> • ( <Y> • ( <Y> )<Y> •
s0
Y
<S> <X> • $s5
(Y
s4<Y> ( <Y> ) •
)<Y> ( <Y> • )s3
ACTION GotoState ( ) $ X Ys0 shift to s1 reduce (5) reduce (5) goto s5 goto s6s1 shift to s2 s2 s3 s4 s5 s6
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
<X> <Y> •s6
X
Y
Oscar Bonilla 140 Universidad Galileo
<S> • <X> $<X> • Y<X> • ( <Y> • ( <Y> )<Y> •
s0
Y
<S> <X> • $s5
(Y
s4<Y> ( <Y> ) •
)<Y> ( <Y> • )s3
ACTION GotoState ( ) $ X Ys0 shift to s1 reduce (5) reduce (5) goto s5 goto s6s1 shift to s2 goto s3s2 s3 s4 s5 s6
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
<X> <Y> •s6
X
Y
Oscar Bonilla 141 Universidad Galileo
<S> • <X> $<X> • Y<X> • ( <Y> • ( <Y> )<Y> •
s0
Y
<S> <X> • $s5
(Y
s4<Y> ( <Y> ) •
)<Y> ( <Y> • )s3
ACTION GotoState ( ) $ X Ys0 shift to s1 reduce (5) reduce (5) goto s5 goto s6s1 shift to s2 goto s3s2 s3 s4 s5 s6
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
<X> <Y> •s6
X
Y
Oscar Bonilla 142 Universidad Galileo
<S> • <X> $<X> • Y<X> • ( <Y> • ( <Y> )<Y> •
s0
Y
<S> <X> • $s5
(Y
s4<Y> ( <Y> ) •
)<Y> ( <Y> • )s3
ACTION GotoState ( ) $ X Ys0 shift to s1 reduce (5) reduce (5) goto s5 goto s6s1 shift to s2 goto s3s2 s3 s4 s5 s6
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
<X> <Y> •s6
X
Y
Follow(<X>) = { $ }
Oscar Bonilla 143 Universidad Galileo
<S> • <X> $<X> • Y<X> • ( <Y> • ( <Y> )<Y> •
s0
Y
<S> <X> • $s5
(Y
s4<Y> ( <Y> ) •
)<Y> ( <Y> • )s3
ACTION GotoState ( ) $ X Ys0 shift to s1 reduce (5) reduce (5) goto s5 goto s6s1 shift to s2 reduce (3) goto s3s2 s3 s4 s5 s6
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
<X> <Y> •s6
X
Y
Follow(<X>) = { $ }
Oscar Bonilla 144 Universidad Galileo
<S> • <X> $<X> • Y<X> • ( <Y> • ( <Y> )<Y> •
s0
Y
<S> <X> • $s5
(Y
s4<Y> ( <Y> ) •
)<Y> ( <Y> • )s3
ACTION GotoState ( ) $ X Ys0 shift to s1 reduce (5) reduce (5) goto s5 goto s6s1 shift to s2 reduce (3) goto s3s2 s3 s4 s5 s6
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
<X> <Y> •s6
X
Y
Oscar Bonilla 145 Universidad Galileo
<S> • <X> $<X> • Y<X> • ( <Y> • ( <Y> )<Y> •
s0
Y
<S> <X> • $s5
(Y
s4<Y> ( <Y> ) •
)<Y> ( <Y> • )s3
ACTION GotoState ( ) $ X Ys0 shift to s1 reduce (5) reduce (5) goto s5 goto s6s1 shift to s2 reduce (3) goto s3s2 s3 s4 s5 s6
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
<X> <Y> •s6
X
Y
Follow(<Y>) = { ), $ }
Oscar Bonilla 146 Universidad Galileo
<S> • <X> $<X> • Y<X> • ( <Y> • ( <Y> )<Y> •
s0
Y
<S> <X> • $s5
(Y
s4<Y> ( <Y> ) •
)<Y> ( <Y> • )s3
ACTION GotoState ( ) $ X Ys0 shift to s1 reduce (5) reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce (3) goto s3s2 s3 s4 s5 s6
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
<X> <Y> •s6
X
Y
Follow(<Y>) = { ), $ }
Oscar Bonilla 147 Universidad Galileo
<S> • <X> $<X> • Y<X> • ( <Y> • ( <Y> )<Y> •
s0
Y
<S> <X> • $s5
(Y
s4<Y> ( <Y> ) •
)<Y> ( <Y> • )s3
ACTION GotoState ( ) $ X Ys0 shift to s1 reduce (5) reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce(3 or 5) goto s3s2 s3 s4 s5 s6
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
<X> <Y> •s6
X
Y
Follow(<Y>) = { ), $ } ¡Conflicto reduce/reduce!
Oscar Bonilla 148 Universidad Galileo
<S> • <X> $<X> • Y<X> • ( <Y> • ( <Y> )<Y> •
s0
Y
<S> <X> • $s5
(Y
s4<Y> ( <Y> ) •
)<Y> ( <Y> • )s3
ACTION GotoState ( ) $ X Ys0 shift to s1 reduce (5) reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce(3 or 5) goto s3s2 s3 s4 s5 s6
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
<X> <Y> •s6
X
Y
Oscar Bonilla 149 Universidad Galileo
<S> • <X> $<X> • Y<X> • ( <Y> • ( <Y> )<Y> •
s0
Y
<S> <X> • $s5
(Y
s4<Y> ( <Y> ) •
)<Y> ( <Y> • )s3
ACTION GotoState ( ) $ X Ys0 shift to s1 reduce (5) reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce(3 or 5) goto s3s2 s3 s4 s5 s6
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
<X> <Y> •s6
X
Y
Oscar Bonilla 150 Universidad Galileo
<S> • <X> $<X> • Y<X> • ( <Y> • ( <Y> )<Y> •
s0
Y
<S> <X> • $s5
(Y
s4<Y> ( <Y> ) •
)<Y> ( <Y> • )s3
ACTION GotoState ( ) $ X Ys0 shift to s1 reduce (5) reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce(3 or 5) goto s3s2 shift to s2 s3 s4 s5 s6
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
<X> <Y> •s6
X
Y
Oscar Bonilla 151 Universidad Galileo
<S> • <X> $<X> • Y<X> • ( <Y> • ( <Y> )<Y> •
s0
Y
<S> <X> • $s5
(Y
s4<Y> ( <Y> ) •
)<Y> ( <Y> • )s3
ACTION GotoState ( ) $ X Ys0 shift to s1 reduce (5) reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce(3 or 5) goto s3s2 shift to s2 goto s3s3 s4 s5 s6
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
<X> <Y> •s6
X
Y
Oscar Bonilla 152 Universidad Galileo
<S> • <X> $<X> • Y<X> • ( <Y> • ( <Y> )<Y> •
s0
Y
<S> <X> • $s5
(Y
s4<Y> ( <Y> ) •
)<Y> ( <Y> • )s3
ACTION GotoState ( ) $ X Ys0 shift to s1 reduce (5) reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce(3 or 5) goto s3s2 shift to s2 goto s3s3 s4 s5 s6
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
<X> <Y> •s6
X
Y
Oscar Bonilla 153 Universidad Galileo
<S> • <X> $<X> • Y<X> • ( <Y> • ( <Y> )<Y> •
s0
Y
<S> <X> • $s5
(Y
s4<Y> ( <Y> ) •
)<Y> ( <Y> • )s3
ACTION GotoState ( ) $ X Ys0 shift to s1 reduce (5) reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce(3 or 5) goto s3s2 shift to s2 goto s3s3 s4 s5 s6
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
<X> <Y> •s6
X
follow(<Y>) = { ), $ }
Y
Oscar Bonilla 154 Universidad Galileo
<S> • <X> $<X> • Y<X> • ( <Y> • ( <Y> )<Y> •
s0
Y
<S> <X> • $s5
(Y
s4<Y> ( <Y> ) •
)<Y> ( <Y> • )s3
ACTION GotoState ( ) $ X Ys0 shift to s1 reduce (5) reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce(3 or 5) goto s3s2 shift to s2 reduce (5) goto s3s3 s4 s5 s6
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
<X> <Y> •s6
X
follow(<Y>) = { ), $ }
Y
Oscar Bonilla 155 Universidad Galileo
<S> • <X> $<X> • Y<X> • ( <Y> • ( <Y> )<Y> •
s0
Y
<S> <X> • $s5
(Y
s4<Y> ( <Y> ) •
)<Y> ( <Y> • )s3
ACTION GotoState ( ) $ X Ys0 shift to s1 reduce (5) reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce(3 or 5) goto s3s2 shift to s2 reduce (5) reduce (5) goto s3s3 s4 s5 s6
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
<X> <Y> •s6
X
follow(<Y>) = { ), $ }
Y
Oscar Bonilla 156 Universidad Galileo
<S> • <X> $<X> • Y<X> • ( <Y> • ( <Y> )<Y> •
s0
Y
<S> <X> • $s5
(Y
s4<Y> ( <Y> ) •
)<Y> ( <Y> • )s3
ACTION GotoState ( ) $ X Ys0 shift to s1 reduce (5) reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce(3 or 5) goto s3s2 shift to s2 reduce (5) reduce (5) goto s3s3 s4 s5 s6
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
<X> <Y> •s6
X
Y
Oscar Bonilla 157 Universidad Galileo
<S> • <X> $<X> • Y<X> • ( <Y> • ( <Y> )<Y> •
s0
Y
<S> <X> • $s5
(Y
s4<Y> ( <Y> ) •
)<Y> ( <Y> • )s3
ACTION GotoState ( ) $ X Ys0 shift to s1 reduce (5) reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce(3 or 5) goto s3s2 shift to s2 reduce (5) reduce (5) goto s3s3 s4 s5 s6
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
<X> <Y> •s6
X
Y
Oscar Bonilla 158 Universidad Galileo
<S> • <X> $<X> • Y<X> • ( <Y> • ( <Y> )<Y> •
s0
Y
<S> <X> • $s5
(Y
s4<Y> ( <Y> ) •
)<Y> ( <Y> • )s3
ACTION GotoState ( ) $ X Ys0 shift to s1 reduce (5) reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce(3 or 5) goto s3s2 shift to s2 reduce (5) reduce (5) goto s3s3 shift to s4 s4 s5 s6
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
<X> <Y> •s6
X
Y
Oscar Bonilla 159 Universidad Galileo
<S> • <X> $<X> • Y<X> • ( <Y> • ( <Y> )<Y> •
s0
Y
<S> <X> • $s5
(Y
s4<Y> ( <Y> ) •
)<Y> ( <Y> • )s3
ACTION GotoState ( ) $ X Ys0 shift to s1 reduce (5) reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce(3 or 5) goto s3s2 shift to s2 reduce (5) reduce (5) goto s3s3 error shift to s4 error s4 s5 s6
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
<X> <Y> •s6
X
Y
Oscar Bonilla 160 Universidad Galileo
<S> • <X> $<X> • Y<X> • ( <Y> • ( <Y> )<Y> •
s0
Y
<S> <X> • $s5
(Y
s4<Y> ( <Y> ) •
)<Y> ( <Y> • )s3
ACTION GotoState ( ) $ X Ys0 shift to s1 reduce (5) reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce(3 or 5) goto s3s2 shift to s2 reduce (5) reduce (5) goto s3s3 error shift to s4 error s4 s5 s6
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
<X> <Y> •s6
X
Y
Oscar Bonilla 161 Universidad Galileo
<S> • <X> $<X> • Y<X> • ( <Y> • ( <Y> )<Y> •
s0
Y
<S> <X> • $s5
(Y
s4<Y> ( <Y> ) •
)<Y> ( <Y> • )s3
ACTION GotoState ( ) $ X Ys0 shift to s1 reduce (5) reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce(3 or 5) goto s3s2 shift to s2 reduce (5) reduce (5) goto s3s3 error shift to s4 error s4 s5 s6
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
<X> <Y> •s6
X
follow(<Y>) = { ), $ }
Y
Oscar Bonilla 162 Universidad Galileo
<S> • <X> $<X> • Y<X> • ( <Y> • ( <Y> )<Y> •
s0
Y
<S> <X> • $s5
(Y
s4<Y> ( <Y> ) •
)<Y> ( <Y> • )s3
ACTION GotoState ( ) $ X Ys0 shift to s1 reduce (5) reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce(3 or 5) goto s3s2 shift to s2 reduce (5) reduce (5) goto s3s3 error shift to s4 error s4 reduce (4) s5 s6
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
<X> <Y> •s6
X
follow(<Y>) = { ), $ }
Y
Oscar Bonilla 163 Universidad Galileo
<S> • <X> $<X> • Y<X> • ( <Y> • ( <Y> )<Y> •
s0
Y
<S> <X> • $s5
(Y
s4<Y> ( <Y> ) •
)<Y> ( <Y> • )s3
ACTION GotoState ( ) $ X Ys0 shift to s1 reduce (5) reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce(3 or 5) goto s3s2 shift to s2 reduce (5) reduce (5) goto s3s3 error shift to s4 error s4 reduce (4) reduce (4) s5 s6
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
<X> <Y> •s6
X
follow(<Y>) = { ), $ }
Y
Oscar Bonilla 164 Universidad Galileo
<S> • <X> $<X> • Y<X> • ( <Y> • ( <Y> )<Y> •
s0
Y
<S> <X> • $s5
(Y
s4<Y> ( <Y> ) •
)<Y> ( <Y> • )s3
ACTION GotoState ( ) $ X Ys0 shift to s1 reduce (5) reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce(3 or 5) goto s3s2 shift to s2 reduce (5) reduce (5) goto s3s3 error shift to s4 error s4 error reduce (4) reduce (4) s5 s6
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
<X> <Y> •s6
X
Y
Oscar Bonilla 165 Universidad Galileo
<S> • <X> $<X> • Y<X> • ( <Y> • ( <Y> )<Y> •
s0
Y
<S> <X> • $s5
(Y
s4<Y> ( <Y> ) •
)<Y> ( <Y> • )s3
ACTION GotoState ( ) $ X Ys0 shift to s1 reduce (5) reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce(3 or 5) goto s3s2 shift to s2 reduce (5) reduce (5) goto s3s3 error shift to s4 error s4 error reduce (4) reduce (4) s5 s6
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
<X> <Y> •s6
X
Y
Oscar Bonilla 166 Universidad Galileo
<S> • <X> $<X> • Y<X> • ( <Y> • ( <Y> )<Y> •
s0
Y
<S> <X> • $s5
(Y
s4<Y> ( <Y> ) •
)<Y> ( <Y> • )s3
ACTION GotoState ( ) $ X Ys0 shift to s1 reduce (5) reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce(3 or 5) goto s3s2 shift to s2 reduce (5) reduce (5) goto s3s3 error shift to s4 error s4 error reduce (4) reduce (4) s5 accept s6
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
<X> <Y> •s6
X
Y
Oscar Bonilla 167 Universidad Galileo
<S> • <X> $<X> • Y<X> • ( <Y> • ( <Y> )<Y> •
s0
Y
<S> <X> • $s5
(Y
s4<Y> ( <Y> ) •
)<Y> ( <Y> • )s3
ACTION GotoState ( ) $ X Ys0 shift to s1 reduce (5) reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce(3 or 5) goto s3s2 shift to s2 reduce (5) reduce (5) goto s3s3 error shift to s4 error s4 error reduce (4) reduce (4) s5 error error accept s6
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
<X> <Y> •s6
X
Y
Oscar Bonilla 168 Universidad Galileo
<S> • <X> $<X> • Y<X> • ( <Y> • ( <Y> )<Y> •
s0
Y
<S> <X> • $s5
(Y
s4<Y> ( <Y> ) •
)<Y> ( <Y> • )s3
ACTION GotoState ( ) $ X Ys0 shift to s1 reduce (5) reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce(3 or 5) goto s3s2 shift to s2 reduce (5) reduce (5) goto s3s3 error shift to s4 error s4 error reduce (4) reduce (4) s5 error error accept s6
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
<X> <Y> •s6
X
Y
Oscar Bonilla 169 Universidad Galileo
<S> • <X> $<X> • Y<X> • ( <Y> • ( <Y> )<Y> •
s0
Y
<S> <X> • $s5
(Y
s4<Y> ( <Y> ) •
)<Y> ( <Y> • )s3
ACTION GotoState ( ) $ X Ys0 shift to s1 reduce (5) reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce(3 or 5) goto s3s2 shift to s2 reduce (5) reduce (5) goto s3s3 error shift to s4 error s4 error reduce (4) reduce (4) s5 error error accept s6
follow(<X>) = { $ }
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
<X> <Y> •s6
X
Y
Oscar Bonilla 170 Universidad Galileo
<S> • <X> $<X> • Y<X> • ( <Y> • ( <Y> )<Y> •
s0
Y
<S> <X> • $s5
(Y
s4<Y> ( <Y> ) •
)<Y> ( <Y> • )s3
ACTION GotoState ( ) $ X Ys0 shift to s1 reduce (5) reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce(3 or 5) goto s3s2 shift to s2 reduce (5) reduce (5) goto s3s3 error shift to s4 error s4 error reduce (4) reduce (4) s5 error error accept s6 reduce (2)
follow(<X>) = { $ }
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
<X> <Y> •s6
X
Y
Oscar Bonilla 171 Universidad Galileo
<S> • <X> $<X> • Y<X> • ( <Y> • ( <Y> )<Y> •
s0
Y
<S> <X> • $s5
(Y
s4<Y> ( <Y> ) •
)<Y> ( <Y> • )s3
ACTION GotoState ( ) $ X Ys0 shift to s1 reduce (5) reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce(3 or 5) goto s3s2 shift to s2 reduce (5) reduce (5) goto s3s3 error shift to s4 error s4 error reduce (4) reduce (4) s5 error error accept s6 error error reduce (2)
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
<X> <Y> •s6
X
Y
Oscar Bonilla 172 Universidad Galileo
<S> • <X> $<X> • Y<X> • ( <Y> • ( <Y> )<Y> •
s0
Y
<S> <X> • $s5
(Y
s4<Y> ( <Y> ) •
)<Y> ( <Y> • )s3
ACTION GotoState ( ) $ X Ys0 shift to s1 reduce (5) reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce(3 or 5) goto s3s2 shift to s2 reduce (5) reduce (5) goto s3s3 error shift to s4 error s4 error reduce (4) reduce (4) s5 error error accept s6 error error reduce (2)
<X> ( •<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s1
(<Y> ( • <Y> ) <Y> • ( <Y> )<Y> •
s2(
<X> <Y> •s6
X
Y
Oscar Bonilla 173 Universidad Galileo
ACTION GotoState ( ) $ X Ys0 shift to s1 reduce (5) reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce(3 or 5) goto s3s2 shift to s2 reduce (5) reduce (5) goto s3s3 error shift to s4 error s4 error reduce (4) reduce (4) s5 error error accept s6 error error reduce (2)
¿Podemos eliminar los conflictos reduce/reduce?
Oscar Bonilla 174 Universidad Galileo
Resumen
• Resumen de la construcción de un parser LR(0)
• Limitaciones de los lenguajes LR(0)
• Construcción de un parser engine SLR(1)
• Limitaciones de los lenguajes SLR(1)
• Construcción de un parser engine LR(1)
• Construcción de un parser engine LALR(1)
Oscar Bonilla 175 Universidad Galileo
Items LR(1)• Los ítems mantienen información acerca de
– producciones– posición en el lado derecho (el punto)– símbolo de look ahead
• Un ítem LR(1) es de la forma [A • a]– A es una producción– El punto en A • denota la posición– a es un terminal o el símbolo de EOF ($)
• Para el ítem [A • a] – a es el siguiente símbolo después de A en el string,
es decir, existe una derivación S A a
Oscar Bonilla 176 Universidad Galileo
• La gramática<S> <X> $<X> ( <X> )<X>
• Símbolos terminales– ‘(‘ ‘)’
• Fin del input– ‘$’
[ <S> • <X> $ ) ]
[ <S> • <X> $ ( ]
[ <S> • <X> $ $ ]
[ <S> <X> • $ ) ]
[ <S> <X> • $ ( ]
[ <S> <X> • $ $]
[ <X> • ( <X> ) ) ]
[ <X> • ( <X> ) ( ]
[ <X> • ( <X> ) $ ]
[ <X> ( • <X> ) ) ]
[ <X> ( • <X> ) ( ]
[ <X> ( • <X> ) $ ]
[ <X> ( <X> • ) ]
[ <X> ( <X> • ) ( ]
[ <X> ( <X> • ) $ ]
[ <X> ( <X> ) • ) ]
[ <X> ( <X> ) • ( ]
[ <X> ( <X> ) • $ ]
[ <X> • ) ]
[ <X> • ( ]
[ <X> • $ ]
Items LR(1)
Oscar Bonilla 177 Universidad Galileo
Calculando los ítems LR(1) y losconjuntos first() y follow()
• Para cada no-terminal A, follow(A) es el conunto de terminales que pueden ocurrir después de A
follow( ) derivacionA b S Ab
• Para cualquier string , first() es el conjunto de terminales que comienzan un string derivado de
first( ) derivacionc c
Oscar Bonilla 178 Universidad Galileo
Algoritmo para first()• Si a es un terminal
entonces first(a) = { a }• Si A es una producción
o A X1 X2... Xk es una producción y first(X1 ), …, first(Xk) entonces first(A) = first(A) { }
• Si A X1 X2... Xi Xi+1 ... Xk es una produccióny first(X1 ), …, first(Xi)y el terminal a first(Xi+1 ) entonces first(A) = first(A) { a }
Oscar Bonilla 179 Universidad Galileo
Ejemplo de first()• Gramática
<S> <X> $<X> <Y><X> ( <Y> ( <Y> )<Y>
Oscar Bonilla 180 Universidad Galileo
Ejemplo de first()• Gramática
<S> <X> $<X> <Y><X> ( <Y> ( <Y> )<Y>
first( ) ) = { }first( ( ) = { } first(S) = { } first(X) = { } first(Y) = { }
Oscar Bonilla 181 Universidad Galileo
Ejemplo de first()• Gramática
<S> <X> $<X> <Y><X> ( <Y> ( <Y> )<Y>
first( ) ) = { }first( ( ) = { } first(S) = { } first(X) = { } first(Y) = { }
• Si a es un terminalentonces first(a) = { a }
• Si A es una producción o A X1 X2... Xk es una producción y first(X1 ), …, first(Xk) entonces first(A) = first(A) { }
• Si A X1 X2... Xi Xi+1 ... Xk es una produccióny first(X1 ), …, first(Xi)y el terminal a first(Xi+1 ) entonces first(A) = first(A) { a }
Oscar Bonilla 182 Universidad Galileo
Ejemplo de first()• Grammar
<S> <X> $<X> <Y><X> ( <Y> ( <Y> )<Y>
first( ) ) = { ) }first( ( ) = { } first(S) = { } first(X) = { } first(Y) = { }
• Si a es un terminalentonces first(a) = { a }
• Si A es una producción o A X1 X2... Xk es una producción y first(X1 ), …, first(Xk) entonces first(A) = first(A) { }
• Si A X1 X2... Xi Xi+1 ... Xk es una produccióny first(X1 ), …, first(Xi)y el terminal a first(Xi+1 ) entonces first(A) = first(A) { a }
Oscar Bonilla 183 Universidad Galileo
Ejemplo de first()• Grammar
<S> <X> $<X> <Y><X> ( <Y> ( <Y> )<Y>
first( ) ) = { ) }first( ( ) = { } first(S) = { } first(X) = { } first(Y) = { }
• Si a es un terminalentonces first(a) = { a }
• Si A es una producción o A X1 X2... Xk es una producción y first(X1 ), …, first(Xk) entonces first(A) = first(A) { }
• Si A X1 X2... Xi Xi+1 ... Xk es una produccióny first(X1 ), …, first(Xi)y el terminal a first(Xi+1 ) entonces first(A) = first(A) { a }
Oscar Bonilla 184 Universidad Galileo
Ejemplo de first()• Grammar
<S> <X> $<X> <Y><X> ( <Y> ( <Y> )<Y>
first( ) ) = { ) }first( ( ) = { ( }first(S) = { } first(X) = { } first(Y) = { }
• Si a es un terminalentonces first(a) = { a }
• Si A es una producción o A X1 X2... Xk es una producción y first(X1 ), …, first(Xk) entonces first(A) = first(A) { }
• Si A X1 X2... Xi Xi+1 ... Xk es una produccióny first(X1 ), …, first(Xi)y el terminal a first(Xi+1 ) entonces first(A) = first(A) { a }
Oscar Bonilla 185 Universidad Galileo
Ejemplo de first()• Grammar
<S> <X> $<X> <Y><X> ( <Y> ( <Y> )<Y>
first( ) ) = { ) }first( ( ) = { ( }first(S) = { } first(X) = { } first(Y) = { }
• Si a es un terminalentonces first(a) = { a }
• Si A es una producción o A X1 X2... Xk es una producción y first(X1 ), …, first(Xk) entonces first(A) = first(A) { }
• Si A X1 X2... Xi Xi+1 ... Xk es una produccióny first(X1 ), …, first(Xi)y el terminal a first(Xi+1 ) entonces first(A) = first(A) { a }
Oscar Bonilla 186 Universidad Galileo
Ejemplo de first()• Grammar
<S> <X> $<X> <Y><X> ( <Y> ( <Y> )<Y>
first( ) ) = { ) }first( ( ) = { ( }first(S) = { } first(X) = { } first(Y) = { }
• Si a es un terminalentonces first(a) = { a }
• Si A es una producción o A X1 X2... Xk es una producción y first(X1 ), …, first(Xk) entonces first(A) = first(A) { }
• Si A X1 X2... Xi Xi+1 ... Xk es una produccióny first(X1 ), …, first(Xi)y el terminal a first(Xi+1 ) entonces first(A) = first(A) { a }
Oscar Bonilla 187 Universidad Galileo
Ejemplo de first()• Grammar
<S> <X> $<X> <Y><X> ( <Y> ( <Y> )<Y>
first( ) ) = { ) }first( ( ) = { ( }first(S) = { } first(X) = { } first(Y) = { }
• Si a es un terminalentonces first(a) = { a }
• Si A es una producción o A X1 X2... Xk es una producción y first(X1 ), …, first(Xk) entonces first(A) = first(A) { }
• Si A X1 X2... Xi Xi+1 ... Xk es una produccióny first(X1 ), …, first(Xi)y el terminal a first(Xi+1 ) entonces first(A) = first(A) { a }
Oscar Bonilla 188 Universidad Galileo
Ejemplo de first()• Grammar
<S> <X> $<X> <Y><X> ( <Y> ( <Y> )<Y>
first( ) ) = { ) }first( ( ) = { ( }first(S) = { } first(X) = { } first(Y) = { }
• Si a es un terminalentonces first(a) = { a }
• Si A es una producción o A X1 X2... Xk es una producción y first(X1 ), …, first(Xk) entonces first(A) = first(A) { }
• Si A X1 X2... Xi Xi+1 ... Xk es una produccióny first(X1 ), …, first(Xi)y el terminal a first(Xi+1 ) entonces first(A) = first(A) { a }
Oscar Bonilla 189 Universidad Galileo
Ejemplo de first()• Grammar
<S> <X> $<X> <Y><X> ( <Y> ( <Y> )<Y>
first( ) ) = { ) }first( ( ) = { ( }first(S) = { } first(X) = { } first(Y) = { }
• Si a es un terminalentonces first(a) = { a }
• Si A es una producción o A X1 X2... Xk es una producción y first(X1 ), …, first(Xk) entonces first(A) = first(A) { }
• Si A X1 X2... Xi Xi+1 ... Xk es una produccióny first(X1 ), …, first(Xi)y el terminal a first(Xi+1 ) entonces first(A) = first(A) { a }
Oscar Bonilla 190 Universidad Galileo
Ejemplo de first()• Grammar
<S> <X> $<X> <Y><X> ( <Y> ( <Y> )<Y>
first( ) ) = { ) }first( ( ) = { ( }first(S) = { } first(X) = { } first(Y) = { }
• Si a es un terminalentonces first(a) = { a }
• Si A es una producción o A X1 X2... Xk es una producción y first(X1 ), …, first(Xk) entonces first(A) = first(A) { }
• Si A X1 X2... Xi Xi+1 ... Xk es una produccióny first(X1 ), …, first(Xi)y el terminal a first(Xi+1 ) entonces first(A) = first(A) { a }
Oscar Bonilla 191 Universidad Galileo
Ejemplo de first()• Grammar
<S> <X> $<X> <Y><X> ( <Y> ( <Y> )<Y>
first( ) ) = { ) }first( ( ) = { ( }first(S) = { } first(X) = { } first(Y) = { }
• Si a es un terminalentonces first(a) = { a }
• Si A es una producción o A X1 X2... Xk es una producción y first(X1 ), …, first(Xk) entonces first(A) = first(A) { }
• Si A X1 X2... Xi Xi+1 ... Xk es una produccióny first(X1 ), …, first(Xi)y el terminal a first(Xi+1 ) entonces first(A) = first(A) { a }
Oscar Bonilla 192 Universidad Galileo
Ejemplo de first()• Grammar
<S> <X> $<X> <Y><X> ( <Y> ( <Y> )<Y>
first( ) ) = { ) }first( ( ) = { ( }first(S) = { } first(X) = { } first(Y) = { , ( }
• Si a es un terminalentonces first(a) = { a }
• Si A es una producción o A X1 X2... Xk es una producción y first(X1 ), …, first(Xk) entonces first(A) = first(A) { }
• Si A X1 X2... Xi Xi+1 ... Xk es una produccióny first(X1 ), …, first(Xi)y el terminal a first(Xi+1 ) entonces first(A) = first(A) { a }
Oscar Bonilla 193 Universidad Galileo
Ejemplo de first()• Grammar
<S> <X> $<X> <Y><X> ( <Y> ( <Y> )<Y>
first( ) ) = { ) }first( ( ) = { ( }first(S) = { } first(X) = { } first(Y) = { , ( }
• Si a es un terminalentonces first(a) = { a }
• Si A es una producción o A X1 X2... Xk es una producción y first(X1 ), …, first(Xk) entonces first(A) = first(A) { }
• Si A X1 X2... Xi Xi+1 ... Xk es una produccióny first(X1 ), …, first(Xi)y el terminal a first(Xi+1 ) entonces first(A) = first(A) { a }
Oscar Bonilla 194 Universidad Galileo
Ejemplo de first()• Grammar
<S> <X> $<X> <Y><X> ( <Y> ( <Y> )<Y>
first( ) ) = { ) }first( ( ) = { ( }first(S) = { } first(X) = { , ( } first(Y) = { , ( }
• Si a es un terminalentonces first(a) = { a }
• Si A es una producción o A X1 X2... Xk es una producción y first(X1 ), …, first(Xk) entonces first(A) = first(A) { }
• Si A X1 X2... Xi Xi+1 ... Xk es una produccióny first(X1 ), …, first(Xi)y el terminal a first(Xi+1 ) entonces first(A) = first(A) { a }
Oscar Bonilla 195 Universidad Galileo
Ejemplo de first()• Grammar
<S> <X> $<X> <Y><X> ( <Y> ( <Y> )<Y>
first( ) ) = { ) }first( ( ) = { ( }first(S) = { } first(X) = { , ( } first(Y) = { , ( }
• Si a es un terminalentonces first(a) = { a }
• Si A es una producción o A X1 X2... Xk es una producción y first(X1 ), …, first(Xk) entonces first(A) = first(A) { }
• Si A X1 X2... Xi Xi+1 ... Xk es una produccióny first(X1 ), …, first(Xi)y el terminal a first(Xi+1 ) entonces first(A) = first(A) { a }
Oscar Bonilla 196 Universidad Galileo
Ejemplo de first()• Grammar
<S> <X> $<X> <Y><X> ( <Y> ( <Y> )<Y>
first( ) ) = { ) }first( ( ) = { ( }first(S) = { , ( } first(X) = { , ( } first(Y) = { , ( }
• Si a es un terminalentonces first(a) = { a }
• Si A es una producción o A X1 X2... Xk es una producción y first(X1 ), …, first(Xk) entonces first(A) = first(A) { }
• Si A X1 X2... Xi Xi+1 ... Xk es una produccióny first(X1 ), …, first(Xi)y el terminal a first(Xi+1 ) entonces first(A) = first(A) { a }
Oscar Bonilla 197 Universidad Galileo
Ejemplo de first()• Grammar
<S> <X> $<X> <Y><X> ( <Y> ( <Y> )<Y>
first( ) ) = { ) }first( ( ) = { ( }first(S) = { , ( } first(X) = { , ( } first(Y) = { , ( }
• Si a es un terminalentonces first(a) = { a }
• Si A es una producción o A X1 X2... Xk es una producción y first(X1 ), …, first(Xk) entonces first(A) = first(A) { }
• Si A X1 X2... Xi Xi+1 ... Xk es una produccióny first(X1 ), …, first(Xi)y el terminal a first(Xi+1 ) entonces first(A) = first(A) { a }
Oscar Bonilla 198 Universidad Galileo
Algoritmo para follow()
• follow(S) = { $ } donde S es el símbolo de inicio
• Si A B es una producciónentonces follow(B) = follow(B) (first() - {})
• Si A B es una produccióno A B es una producción y first()entonces follow(B) = follow(B) follow(A)
Oscar Bonilla 199 Universidad Galileo
Ejemplo de follow()• Gramática
<S> <X> $<X> <Y><X> ( <Y> ( <Y> )<Y>
Oscar Bonilla 200 Universidad Galileo
Ejemplo de follow()• Gramática
<S> <X> $<X> <Y><X> ( <Y> ( <Y> )<Y>
first( ) ) = { ) }first( ( ) = { ( }first(S) = { (, } first(X) = { (, } first(Y) = { (, }
Oscar Bonilla 201 Universidad Galileo
Ejemplo de follow()• Gramática
<S> <X> $<X> <Y><X> ( <Y> ( <Y> )<Y>
follow(S) = { } follow(X) = { } follow(Y) = { }
first( ) ) = { ) }first( ( ) = { ( }first(S) = { (, } first(X) = { (, } first(Y) = { (, }
Oscar Bonilla 202 Universidad Galileo
Ejemplo de follow()• Gramática
<S> <X> $<X> <Y><X> ( <Y> ( <Y> )<Y>
follow(S) = { } follow(X) = { } follow(Y) = { }
• follow(S) = { $ } donde S es el símbolo de inicio
• Si A B es una producción entonces follow(B) = follow(B) (first() - {})
• Si A B es una produccióno A B es una producción y first()entonces follow(B) = follow(B) follow(A)
first( ) ) = { ) }first( ( ) = { ( }first(S) = { (, } first(X) = { (, } first(Y) = { (, }
Oscar Bonilla 203 Universidad Galileo
Ejemplo de follow()• Gramática
<S> <X> $<X> <Y><X> ( <Y> ( <Y> )<Y>
follow(S) = { $ } follow(X) = { } follow(Y) = { }
first( ) ) = { ) }first( ( ) = { ( }first(S) = { (, } first(X) = { (, } first(Y) = { (, }
• follow(S) = { $ } donde S es el símbolo de inicio
• Si A B es una producción entonces follow(B) = follow(B) (first() - {})
• Si A B es una produccióno A B es una producción y first()entonces follow(B) = follow(B) follow(A)
Oscar Bonilla 204 Universidad Galileo
Ejemplo de follow()• Gramática
<S> <X> $<X> <Y><X> ( <Y> ( <Y> )<Y>
follow(S) = { $ } follow(X) = { } follow(Y) = { }
first( ) ) = { ) }first( ( ) = { ( }first(S) = { (, } first(X) = { (, } first(Y) = { (, }
• follow(S) = { $ } donde S es el símbolo de inicio
• Si A B es una producción entonces follow(B) = follow(B) (first() - {})
• Si A B es una produccióno A B es una producción y first()entonces follow(B) = follow(B) follow(A)
Oscar Bonilla 205 Universidad Galileo
Ejemplo de follow()• Gramática
<S> <X> $<X> <Y><X> ( <Y> ( <Y> )<Y>
follow(S) = { $ } follow(X) = { } follow(Y) = { ) }
first( ) ) = { ) }first( ( ) = { ( }first(S) = { (, } first(X) = { (, } first(Y) = { (, }
• follow(S) = { $ } donde S es el símbolo de inicio
• Si A B es una producción entonces follow(B) = follow(B) (first() - {})
• Si A B es una produccióno A B es una producción y first()entonces follow(B) = follow(B) follow(A)
Oscar Bonilla 206 Universidad Galileo
Ejemplo de follow()• Gramática
<S> <X> $<X> <Y><X> ( <Y> ( <Y> )<Y>
follow(S) = { $ } follow(X) = { } follow(Y) = { ) }
first( ) ) = { ) }first( ( ) = { ( }first(S) = { (, } first(X) = { (, } first(Y) = { (, }
• follow(S) = { $ } donde S es el símbolo de inicio
• Si A B es una producción entonces follow(B) = follow(B) (first() - {})
• Si A B es una produccióno A B es una producción y first()entonces follow(B) = follow(B) follow(A)
Oscar Bonilla 207 Universidad Galileo
Ejemplo de follow()• Gramática
<S> <X> $<X> <Y><X> ( <Y> ( <Y> )<Y>
follow(S) = { $ } follow(X) = { $ } follow(Y) = { ) }
first( ) ) = { ) }first( ( ) = { ( }first(S) = { (, } first(X) = { (, } first(Y) = { (, }
• follow(S) = { $ } donde S es el símbolo de inicio
• Si A B es una producción entonces follow(B) = follow(B) (first() - {})
• Si A B es una produccióno A B es una producción y first()entonces follow(B) = follow(B) follow(A)
Oscar Bonilla 208 Universidad Galileo
Ejemplo de follow()• Gramática
<S> <X> $<X> <Y><X> ( <Y> ( <Y> )<Y>
follow(S) = { $ } follow(X) = { $ } follow(Y) = { ) }
first( ) ) = { ) }first( ( ) = { ( }first(S) = { (, } first(X) = { (, } first(Y) = { (, }
• follow(S) = { $ } donde S es el símbolo de inicio
• Si A B es una producción entonces follow(B) = follow(B) (first() - {})
• Si A B es una produccióno A B es una producción y first()entonces follow(B) = follow(B) follow(A)
Oscar Bonilla 209 Universidad Galileo
Ejemplo de follow()• Gramática
<S> <X> $<X> <Y><X> ( <Y> ( <Y> )<Y>
follow(S) = { $ } follow(X) = { $ } follow(Y) = { ), $ }
first( ) ) = { ) }first( ( ) = { ( }first(S) = { (, } first(X) = { (, } first(Y) = { (, }
• follow(S) = { $ } donde S es el símbolo de inicio
• Si A B es una producción entonces follow(B) = follow(B) (first() - {})
• Si A B es una produccióno A B es una producción y first()entonces follow(B) = follow(B) follow(A)
Oscar Bonilla 210 Universidad Galileo
Ejemplo de follow()• Gramática
<S> <X> $<X> <Y><X> ( <Y> ( <Y> )<Y>
follow(S) = { $ } follow(X) = { $ } follow(Y) = { ), $ }
first( ) ) = { ) }first( ( ) = { ( }first(S) = { (, } first(X) = { (, } first(Y) = { (, }
• follow(S) = { $ } donde S es el símbolo de inicio
• Si A B es una producción entonces follow(B) = follow(B) (first() - {})
• Si A B es una produccióno A B es una producción y first()entonces follow(B) = follow(B) follow(A)
Oscar Bonilla 211 Universidad Galileo
Creando un Parser Engine LR(1)
• Necesitamos definir funciones closure() y goto() para ítems LR(1)
• Necesitamos proveer un algoritmo para crear el DFA
• Necesitamos proveer un algoritmo para crear la tabla de parseo
Oscar Bonilla 212 Universidad Galileo
Algoritmo para Closure
colsure(I)
Oscar Bonilla 213 Universidad Galileo
Algoritmo para Closure
colsure(I)
repetir
hasta que I no cambie
Oscar Bonilla 214 Universidad Galileo
Algoritmo para Closure
colsure(I)
repetir
para todos los ítems [A • X c] en I
hasta que I no cambie
Oscar Bonilla 215 Universidad Galileo
Algoritmo para Closure
colsure(I)
repetir
para todos los ítems [A • X c] en I
para cualquier producción X
hasta que I no cambie
Oscar Bonilla 216 Universidad Galileo
Algoritmo para Closure
colsure(I)
repetir
para todos los ítems [A • X c] en I
para cualquier producción X
para cualquier d first(c)
hasta que I no cambie
Oscar Bonilla 217 Universidad Galileo
Algoritmo para Closure
colsure(I)
repetir
para todos los ítems [A • X c] en I
para cualquier producción X
para cualquier d first(c)
I = I { [X • d] }hasta que I no cambie
Oscar Bonilla 218 Universidad Galileo
Algoritmo para Closure
colsure(I)
repetir
para todos los ítems [A • X c] en I
para cualquier producción X
para cualquier d first(c)
I = I { [X • d] }hasta que I no cambie
retornar I
Oscar Bonilla 219 Universidad Galileo
Ejemplo de Closure• Qué es closure([ Y ( • Y ) $ ])
Oscar Bonilla 220 Universidad Galileo
Ejemplo de Closure• Qué es closure([ Y ( • Y ) $ ])
• Gramática<S> <X> $<X> <Y><X> ( <Y> ( <Y> )<Y>
Oscar Bonilla 221 Universidad Galileo
Ejemplo de Closure• Qué es closure([ Y ( • Y ) $ ])
• Gramática<S> <X> $<X> <Y><X> ( <Y> ( <Y> )<Y>
[ Y ( • Y ) $ ]
I =
Oscar Bonilla 222 Universidad Galileo
Ejemplo de Closure• Qué es closure([ Y ( • Y ) $ ])
• Gramática<S> <X> $<X> <Y><X> ( <Y> ( <Y> )<Y>
repetir para todos los ítems [A • X c] en I para cualquier producción X para cualquier d first(c) I = I { [X • d] }hasta que I no cambie
[ Y ( • Y ) $ ]
I =
Oscar Bonilla 223 Universidad Galileo
Ejemplo de Closure• Qué es closure([ Y ( • Y ) $ ])
• Gramática<S> <X> $<X> <Y><X> ( <Y> ( <Y> )<Y>
[ Y ( • Y ) $ ]
I =
repetir para todos los ítems [A • X c] en I para cualquier producción X para cualquier d first(c) I = I { [X • d] }hasta que I no cambie
Oscar Bonilla 224 Universidad Galileo
Ejemplo de Closure• Qué es closure([ Y ( • Y ) $ ])
• Gramática<S> <X> $<X> <Y><X> ( <Y> ( <Y> )<Y>
[ Y ( • Y ) $ ]
I =
repetir para todos los ítems [A • X c] en I para cualquier producción X para cualquier d first(c) I = I { [X • d] }hasta que I no cambie
Oscar Bonilla 225 Universidad Galileo
Ejemplo de Closure• Qué es closure([ Y ( • Y ) $ ])
• Gramática<S> <X> $<X> <Y><X> ( <Y> ( <Y> )<Y>
[ Y ( • Y ) $ ]
I = First( )$ ) = ???
repetir para todos los ítems [A • X c] en I para cualquier producción X para cualquier d first(c) I = I { [X • d] }hasta que I no cambie
Oscar Bonilla 226 Universidad Galileo
Ejemplo de Closure• Qué es closure([ Y ( • Y ) $ ])
• Gramática<S> <X> $<X> <Y><X> ( <Y> ( <Y> )<Y>
[ Y ( • Y ) $ ]
I = First( )$ ) = { ) }
repetir para todos los ítems [A • X c] en I para cualquier producción X para cualquier d first(c) I = I { [X • d] }hasta que I no cambie
Oscar Bonilla 227 Universidad Galileo
Ejemplo de Closure• Qué es closure([ Y ( • Y ) $ ])
• Gramática<S> <X> $<X> <Y><X> ( <Y> ( <Y> )<Y>
[ Y ( • Y ) $ ]
[ Y • ( Y ) ) ]I = First( )$ ) = { ) }
repetir para todos los ítems [A • X c] en I para cualquier producción X para cualquier d first(c) I = I { [X • d] }hasta que I no cambie
Oscar Bonilla 228 Universidad Galileo
Ejemplo de Closure• Qué es closure([ Y ( • Y ) $ ])
• Gramática<S> <X> $<X> <Y><X> ( <Y> ( <Y> )<Y>
[ Y ( • Y ) $ ]
[ Y • ( Y ) ) ]I =
repetir para todos los ítems [A • X c] en I para cualquier producción X para cualquier d first(c) I = I { [X • d] }hasta que I no cambie
Oscar Bonilla 229 Universidad Galileo
Ejemplo de Closure• Qué es closure([ Y ( • Y ) $ ])
• Gramática<S> <X> $<X> <Y><X> ( <Y> ( <Y> )<Y>
[ Y ( • Y ) $ ]
[ Y • ( Y ) ) ]I =
repetir para todos los ítems [A • X c] en I para cualquier producción X para cualquier d first(c) I = I { [X • d] }hasta que I no cambie
Oscar Bonilla 230 Universidad Galileo
Ejemplo de Closure• Qué es closure([ Y ( • Y ) $ ])
• Gramática<S> <X> $<X> <Y><X> ( <Y> ( <Y> )<Y>
[ Y ( • Y ) $ ]
[ Y • ( Y ) ) ]I = First( )$ ) = { ) }
repetir para todos los ítems [A • X c] en I para cualquier producción X para cualquier d first(c) I = I { [X • d] }hasta que I no cambie
Oscar Bonilla 231 Universidad Galileo
Ejemplo de Closure• Qué es closure([ Y ( • Y ) $ ])
• Gramática<S> <X> $<X> <Y><X> ( <Y> ( <Y> )<Y>
[ Y ( • Y ) $ ]
[ Y • ( Y ) ) ]
[ Y • ) ]I = First( )$ ) = { ) }
repetir para todos los ítems [A • X c] en I para cualquier producción X para cualquier d first(c) I = I { [X • d] }hasta que I no cambie
Oscar Bonilla 232 Universidad Galileo
Ejemplo de Closure• Qué es closure([ Y ( • Y ) $ ])
• Gramática<S> <X> $<X> <Y><X> ( <Y> ( <Y> )<Y>
[ Y ( • Y ) $ ]
[ Y • ( Y ) ) ]
[ Y • ) ]I =
repetir para todos los ítems [A • X c] en I para cualquier producción X para cualquier d first(c) I = I { [X • d] }hasta que I no cambie
Oscar Bonilla 233 Universidad Galileo
Ejemplo de Closure• Qué es closure([ Y ( • Y ) $ ])
• Gramática<S> <X> $<X> <Y><X> ( <Y> ( <Y> )<Y>
[ Y ( • Y ) $ ]
[ Y • ( Y ) ) ]
[ Y • ) ]I =
repetir para todos los ítems [A • X c] en I para cualquier producción X para cualquier d first(c) I = I { [X • d] }hasta que I no cambie
Oscar Bonilla 234 Universidad Galileo
Ejemplo de Closure• Qué es closure([ Y ( • Y ) $ ])
• Gramática<S> <X> $<X> <Y><X> ( <Y> ( <Y> )<Y>
[ Y ( • Y ) $ ]
[ Y • ( Y ) ) ]
[ Y • ) ]I =
repetir para todos los ítems [A • X c] en I para cualquier producción X para cualquier d first(c) I = I { [X • d] }hasta que I no cambie
Oscar Bonilla 235 Universidad Galileo
Pregunta: Encontrar Closure• Qué es closure([ X • Y $ ])
• Gramática<S> <X> $<X> <Y><X> ( <Y> ( <Y> )<Y>
I = ????
repetir para todos los ítems [A • X c] en I para cualquier producción X para cualquier d first(c) I = I { [X • d] }hasta que I no cambie
Oscar Bonilla 236 Universidad Galileo
Pregunta: Encontrar Closure• Qué es closure([ X • Y $ ])
• Gramática<S> <X> $<X> <Y><X> ( <Y> ( <Y> )<Y>
[ X • Y $ ]
[ Y • ( Y ) $ ]
[ Y • $ ]I =
40
repetir para todos los ítems [A • X c] en I para cualquier producción X para cualquier d first(c) I = I { [X • d] }hasta que I no cambie
Oscar Bonilla 237 Universidad Galileo
Algoritmo para Goto
goto(I, X)
Oscar Bonilla 238 Universidad Galileo
Algoritmo para Goto
goto(I, X)
J = { }
Oscar Bonilla 239 Universidad Galileo
Algoritmo para Goto
goto(I, X)
J = { }
para cualquier ítem [A • X c] en I
Oscar Bonilla 240 Universidad Galileo
Algoritmo para Goto
goto(I, X)
J = { }
para cualquier ítem [A • X c] en I
J = J {[A X • c]}
Oscar Bonilla 241 Universidad Galileo
Algoritmo para Goto
goto(I, X)
J = { }
para cualquier ítem [A • X c] en I
J = J {[A X • c]}
retornar J
Oscar Bonilla 242 Universidad Galileo
Ejemplo de Goto
• Qué es goto([ Y ( • Y ) $ ], Y)
42
Oscar Bonilla 243 Universidad Galileo
Ejemplo de Goto
• Qué es goto([ Y ( • Y ) $ ], Y)
goto(I, X)
J = { }
para cualquier ítem [A • X c] en I
J = J {[A X • c]}
Oscar Bonilla 244 Universidad Galileo
Ejemplo de Goto
• Qué es goto([ Y ( • Y ) $ ], Y)
{ }
goto(I, X)
J = { }
para cualquier ítem [A • X c] en I
J = J {[A X • c]}
Oscar Bonilla 245 Universidad Galileo
Ejemplo de Goto
• Qué es goto([ Y ( • Y ) $ ], Y)
{ }
goto(I, X)
J = { }
para cualquier ítem [A • X c] en I
J = J {[A X • c]}
Oscar Bonilla 246 Universidad Galileo
Ejemplo de Goto
• Qué es goto([ Y ( • Y ) $ ], Y)
{[ Y ( Y •) $ ]}
goto(I, X)
J = { }
para cualquier ítem [A • X c] en I
J = J {[A X • c]}
Oscar Bonilla 247 Universidad Galileo
Ejemplo de Goto
• Qué es goto([ Y ( • Y ) $ ], Y)
{[ Y ( Y •) $ ]}
goto(I, X)
J = { }
para cualquier ítem [A • X c] en I
J = J {[A X • c]}
Oscar Bonilla 248 Universidad Galileo
Construyendo el DFA
• Comenzar con el ítem [<S’> • <S> $ ?]– donde ? representa cualquier terminal
• Encontrar closure del ítem y crear un estado• Elegir un estado I
– para cada ítem [A • X c] en I
• encontrar goto(I, X)
• si goto(I, X) no es ya un estado, creamos uno
• agregar una arista X del estado I al estado goto(I, X)
• Repetir hasta que no sea posible agregar nada más
Oscar Bonilla 249 Universidad Galileo
DFA del Ejemplo Expandido
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y>
Oscar Bonilla 250 Universidad Galileo
[<S> • <X> $ ?]
DFA del Ejemplo Expandido
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y>
Oscar Bonilla 251 Universidad Galileo
[<S> • <X> $ ?]
DFA del Ejemplo Expandido
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y>
closure([<S> • <X> $ ?]) = ???
Oscar Bonilla 252 Universidad Galileo
[<S> • <X> $ ?]
DFA del Ejemplo Expandido
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y>
closure([<S> • <X> $ ?]) = ???
first( $? ) = ???
Oscar Bonilla 253 Universidad Galileo
[<S> • <X> $ ?]
DFA del Ejemplo Expandido
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y>
closure([<S> • <X> $ ?]) = ???
first( $? ) = { $ }
Oscar Bonilla 254 Universidad Galileo
DFA del Ejemplo Expandido
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y>
closure([<S> • <X> $ ?]) = ???
first( $? ) = { $ }
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
closure([<S> • <X> $ ?]) = ???
first( $? ) = { $ }
Oscar Bonilla 255 Universidad Galileo
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
DFA del Ejemplo Expandido
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y>
Oscar Bonilla 256 Universidad Galileo
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
(
DFA del Ejemplo Expandido
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y> goto( , ( ) = ???
Oscar Bonilla 257 Universidad Galileo
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
( [<X> ( • $][<Y> ( • <Y> ) $]
DFA del Ejemplo Expandido
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y> goto( , ( ) = ???
Oscar Bonilla 258 Universidad Galileo
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
( [<X> ( • $][<Y> ( • <Y> ) $]
DFA del Ejemplo Expandido
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y> closure( ) = ???
Oscar Bonilla 259 Universidad Galileo
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
( [<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
DFA del Ejemplo Expandido
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y> closure( ) = ???
Oscar Bonilla 260 Universidad Galileo
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
( [<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1
DFA del Ejemplo Expandido
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y>
Oscar Bonilla 261 Universidad Galileo
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
( [<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1
DFA del Ejemplo Expandido
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y>
Oscar Bonilla 262 Universidad Galileo
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
( [<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1(
DFA del Ejemplo Expandido
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y> goto( , ( ) = ???
Oscar Bonilla 263 Universidad Galileo
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
( [<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1[<Y> ( • <Y>) )]
(
DFA del Ejemplo Expandido
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y> goto( , ( ) = ???
Oscar Bonilla 264 Universidad Galileo
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
( [<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1[<Y> ( • <Y>) )]
(
DFA del Ejemplo Expandido
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y>
closure( ) = ???
Oscar Bonilla 265 Universidad Galileo
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
( [<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1[<Y> ( • <Y>) )]
(
DFA del Ejemplo Expandido
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y>
closure( ) = ???
first( )) ) = ???
Oscar Bonilla 266 Universidad Galileo
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
( [<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1[<Y> ( • <Y>) )]
(
DFA del Ejemplo Expandido
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y>
closure( ) = ???
first( )) ) = { ) }
Oscar Bonilla 267 Universidad Galileo
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
( [<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1(
DFA del Ejemplo Expandido
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y>
closure( ) = ???
first( )) ) = { ) }
[<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
Oscar Bonilla 268 Universidad Galileo
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
( [<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1[<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s2(
DFA del Ejemplo Expandido
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y>
Oscar Bonilla 269 Universidad Galileo
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
( [<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1[<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s2(
DFA del Ejemplo Expandido
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y>
Oscar Bonilla 270 Universidad Galileo
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
( [<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1
([<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s2(
DFA del Ejemplo Expandido
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y> [<Y> ( • <Y> ) )]
Oscar Bonilla 271 Universidad Galileo
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
( [<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1
([<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s2(
DFA del Ejemplo Expandido
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y> [<Y> ( • <Y> ) )][<Y> • ( <Y> ) )][<Y> • )]
Oscar Bonilla 272 Universidad Galileo
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
( [<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1
([<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s2(
DFA del Ejemplo Expandido
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y>
Oscar Bonilla 273 Universidad Galileo
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
[<S> <X> •$ ?]
( [<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1
([<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s2(
X
DFA del Ejemplo Expandido
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y>
Oscar Bonilla 274 Universidad Galileo
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
[<S> <X> •$ ?]s5
( [<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1
([<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s2(
X
DFA del Ejemplo Expandido
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y>
Oscar Bonilla 275 Universidad Galileo
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
Y
[<S> <X> •$ ?]s5
( [<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1
([<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s2(
[<X> <Y> • $]
X
DFA del Ejemplo Expandido
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y>
Oscar Bonilla 276 Universidad Galileo
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
Y
[<S> <X> •$ ?]s5
( [<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1
([<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s2(
[<X> <Y> • $]s6
X
DFA del Ejemplo Expandido
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y>
Oscar Bonilla 277 Universidad Galileo
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
Y
[<S> <X> •$ ?]s5
(Y
[<Y> (<Y> • ) $]
[<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1
([<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s2(
[<X> <Y> • $]s6
X
DFA del Ejemplo Expandido
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y>
Oscar Bonilla 278 Universidad Galileo
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
Y
[<S> <X> •$ ?]s5
(Y
[<Y> (<Y> • ) $]s3
[<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1
([<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s2(
[<X> <Y> • $]s6
X
DFA del Ejemplo Expandido
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y>
Oscar Bonilla 279 Universidad Galileo
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
Y
[<S> <X> •$ ?]s5
(Y
[<Y> (<Y>) • $]
)[<Y> (<Y> • ) $]s3
[<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1
([<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s2(
[<X> <Y> • $]s6
X
DFA del Ejemplo Expandido
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y>
Oscar Bonilla 280 Universidad Galileo
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
Y
[<S> <X> •$ ?]s5
(Y
s4[<Y> (<Y>) • $]
)[<Y> (<Y> • ) $]s3
[<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1
([<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s2(
[<X> <Y> • $]s6
X
DFA del Ejemplo Expandido
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y>
Oscar Bonilla 281 Universidad Galileo
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
Y
[<S> <X> •$ ?]s5
(Y
s4[<Y> (<Y>) • $]
)[<Y> (<Y> • ) $]s3
[<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1
([<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s2(
[<X> <Y> • $]s6
X
DFA del Ejemplo Expandido
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y> [<Y> (<Y> • ) $]
Y
Oscar Bonilla 282 Universidad Galileo
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
Y
[<S> <X> •$ ?]s5
(Y
s4[<Y> (<Y>) • $]
)[<Y> (<Y> • ) $]s3
[<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1
([<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s2(
[<X> <Y> • $]s6
X
Y
DFA del Ejemplo Expandido
<S> <X> $
<X> <Y>
<X> (
<Y> ( <Y> )
<Y>
46
Oscar Bonilla 283 Universidad Galileo
Creando las tablas de parseo
• Para cada estado• Transición a otro estado usando un símbolo
terminal es un shift a ese estado (shift to sn)• Transición a otro estado usando un símbolo no-
terminal es un goto a ese estado (goto sn)• Si hay un ítem [A • a] en el estado, hacemos
una reducción para el símbolo de entrada “a” con la producción (reduce k)
Oscar Bonilla 284 Universidad Galileo
ACTION GotoState ( ) $ X Ys0 s1 s2 s3 s4 s5 s6
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
Y
[<S> <X> •$ ?]s5
(Y
s4[<Y> (<Y>) • $]
)[<Y> (<Y> • ) $]s3
[<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1
([<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s2(
[<X> <Y> • ?]s6
X
Y
Oscar Bonilla 285 Universidad Galileo
ACTION GotoState ( ) $ X Ys0 shift to s1 s1 s2 s3 s4 s5 s6
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
Y
[<S> <X> •$ ?]s5
(Y
s4[<Y> (<Y>) • $]
)[<Y> (<Y> • ) $]s3
[<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1
([<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s2(
[<X> <Y> • ?]s6
X
Y
Oscar Bonilla 286 Universidad Galileo
ACTION GotoState ( ) $ X Ys0 shift to s1 goto s5 s1 s2 s3 s4 s5 s6
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
Y
[<S> <X> •$ ?]s5
(Y
s4[<Y> (<Y>) • $]
)[<Y> (<Y> • ) $]s3
[<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1
([<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s2(
[<X> <Y> • ?]s6
X
Y
Oscar Bonilla 287 Universidad Galileo
ACTION GotoState ( ) $ X Ys0 shift to s1 goto s5 goto s6s1 s2 s3 s4 s5 s6
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
Y
[<S> <X> •$ ?]s5
(Y
s4[<Y> (<Y>) • $]
)[<Y> (<Y> • ) $]s3
[<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1
([<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s2(
[<X> <Y> • ?]s6
X
Y
Oscar Bonilla 288 Universidad Galileo
ACTION GotoState ( ) $ X Ys0 shift to s1 reduce (5) goto s5 goto s6s1 s2 s3 s4 s5 s6
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
Y
[<S> <X> •$ ?]s5
(Y
s4[<Y> (<Y>) • $]
)[<Y> (<Y> • ) $]s3
[<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1
([<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s2(
[<X> <Y> • ?]s6
X
Y
Oscar Bonilla 289 Universidad Galileo
ACTION GotoState ( ) $ X Ys0 shift to s1 error reduce (5) goto s5 goto s6s1 s2 s3 s4 s5 s6
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
Y
[<S> <X> •$ ?]s5
(Y
s4[<Y> (<Y>) • $]
)[<Y> (<Y> • ) $]s3
[<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1
([<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s2(
[<X> <Y> • ?]s6
X
Y
Oscar Bonilla 290 Universidad Galileo
ACTION GotoState ( ) $ X Ys0 shift to s1 error reduce (5) goto s5 goto s6s1 s2 s3 s4 s5 s6
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
Y
[<S> <X> •$ ?]s5
(Y
s4[<Y> (<Y>) • $]
)[<Y> (<Y> • ) $]s3
[<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1
([<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s2(
[<X> <Y> • ?]s6
X
Y
Oscar Bonilla 291 Universidad Galileo
ACTION GotoState ( ) $ X Ys0 shift to s1 error reduce (5) goto s5 goto s6s1 shift to s2 s2 s3 s4 s5 s6
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
Y
[<S> <X> •$ ?]s5
(Y
s4[<Y> (<Y>) • $]
)[<Y> (<Y> • ) $]s3
[<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1
([<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s2(
[<X> <Y> • ?]s6
X
Y
Oscar Bonilla 292 Universidad Galileo
ACTION GotoState ( ) $ X Ys0 shift to s1 error reduce (5) goto s5 goto s6s1 shift to s2 goto s3s2 s3 s4 s5 s6
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
Y
[<S> <X> •$ ?]s5
(Y
s4[<Y> (<Y>) • $]
)[<Y> (<Y> • ) $]s3
[<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1
([<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s2(
[<X> <Y> • ?]s6
X
Y
Oscar Bonilla 293 Universidad Galileo
ACTION GotoState ( ) $ X Ys0 shift to s1 error reduce (5) goto s5 goto s6s1 shift to s2 goto s3s2 s3 s4 s5 s6
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
Y
[<S> <X> •$ ?]s5
(Y
s4[<Y> (<Y>) • $]
)[<Y> (<Y> • ) $]s3
[<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1
([<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s2(
[<X> <Y> • ?]s6
X
Y
Oscar Bonilla 294 Universidad Galileo
ACTION GotoState ( ) $ X Ys0 shift to s1 error reduce (5) goto s5 goto s6s1 shift to s2 reduce (3) goto s3s2 s3 s4 s5 s6
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
Y
[<S> <X> •$ ?]s5
(Y
s4[<Y> (<Y>) • $]
)[<Y> (<Y> • ) $]s3
[<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1
([<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s2(
[<X> <Y> • ?]s6
X
Y
Oscar Bonilla 295 Universidad Galileo
ACTION GotoState ( ) $ X Ys0 shift to s1 error reduce (5) goto s5 goto s6s1 shift to s2 reduce (3) goto s3s2 s3 s4 s5 s6
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
Y
[<S> <X> •$ ?]s5
(Y
s4[<Y> (<Y>) • $]
)[<Y> (<Y> • ) $]s3
[<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1
([<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s2(
[<X> <Y> • ?]s6
X
Y
Oscar Bonilla 296 Universidad Galileo
ACTION GotoState ( ) $ X Ys0 shift to s1 error reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce (3) goto s3s2 s3 s4 s5 s6
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
Y
[<S> <X> •$ ?]s5
(Y
s4[<Y> (<Y>) • $]
)[<Y> (<Y> • ) $]s3
[<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1
([<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s2(
[<X> <Y> • ?]s6
X
Y
Oscar Bonilla 297 Universidad Galileo
ACTION GotoState ( ) $ X Ys0 shift to s1 error reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce (3) goto s3s2 s3 s4 s5 s6
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
Y
[<S> <X> •$ ?]s5
(Y
s4[<Y> (<Y>) • $]
)[<Y> (<Y> • ) $]s3
[<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1
([<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s2(
[<X> <Y> • ?]s6
X
Y
Oscar Bonilla 298 Universidad Galileo
ACTION GotoState ( ) $ X Ys0 shift to s1 error reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce (3) goto s3s2 s3 s4 s5 s6
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
Y
[<S> <X> •$ ?]s5
(Y
s4[<Y> (<Y>) • $]
)[<Y> (<Y> • ) $]s3
[<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1
([<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s2(
[<X> <Y> • ?]s6
X
Y
Oscar Bonilla 299 Universidad Galileo
ACTION GotoState ( ) $ X Ys0 shift to s1 error reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce (3) goto s3s2 shift to s2 s3 s4 s5 s6
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
Y
[<S> <X> •$ ?]s5
(Y
s4[<Y> (<Y>) • $]
)[<Y> (<Y> • ) $]s3
[<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1
([<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s2(
[<X> <Y> • ?]s6
X
Y
Oscar Bonilla 300 Universidad Galileo
ACTION GotoState ( ) $ X Ys0 shift to s1 error reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce (3) goto s3s2 shift to s2 goto s3s3 s4 s5 s6
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
Y
[<S> <X> •$ ?]s5
(Y
s4[<Y> (<Y>) • $]
)[<Y> (<Y> • ) $]s3
[<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1
([<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s2(
[<X> <Y> • ?]s6
X
Y
Oscar Bonilla 301 Universidad Galileo
ACTION GotoState ( ) $ X Ys0 shift to s1 error reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce (3) goto s3s2 shift to s2 goto s3s3 s4 s5 s6
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
Y
[<S> <X> •$ ?]s5
(Y
s4[<Y> (<Y>) • $]
)[<Y> (<Y> • ) $]s3
[<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1
([<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s2(
[<X> <Y> • ?]s6
X
Y
Oscar Bonilla 302 Universidad Galileo
ACTION GotoState ( ) $ X Ys0 shift to s1 error reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce (3) goto s3s2 shift to s2 reduce (5) goto s3s3 s4 s5 s6
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
Y
[<S> <X> •$ ?]s5
(Y
s4[<Y> (<Y>) • $]
)[<Y> (<Y> • ) $]s3
[<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1
([<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s2(
[<X> <Y> • ?]s6
X
Y
Oscar Bonilla 303 Universidad Galileo
ACTION GotoState ( ) $ X Ys0 shift to s1 error reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce (3) goto s3s2 shift to s2 reduce (5) error goto s3s3 s4 s5 s6
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
Y
[<S> <X> •$ ?]s5
(Y
s4[<Y> (<Y>) • $]
)[<Y> (<Y> • ) $]s3
[<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1
([<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s2(
[<X> <Y> • $]s6
X
Y
Oscar Bonilla 304 Universidad Galileo
ACTION GotoState ( ) $ X Ys0 shift to s1 error reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce (3) goto s3s2 shift to s2 reduce (5) error goto s3s3 s4 s5 s6
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
Y
[<S> <X> •$ ?]s5
(Y
s4[<Y> (<Y>) • $]
)[<Y> (<Y> • ) $]s3
[<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1
([<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s2(
[<X> <Y> • $]s6
X
Y
Oscar Bonilla 305 Universidad Galileo
ACTION GotoState ( ) $ X Ys0 shift to s1 error reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce (3) goto s3s2 shift to s2 reduce (5) error goto s3s3 shift to s4 s4 s5 s6
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
Y
[<S> <X> •$ ?]s5
(Y
s4[<Y> (<Y>) • $]
)[<Y> (<Y> • ) $]s3
[<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1
([<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s2(
[<X> <Y> • $]s6
X
Y
Oscar Bonilla 306 Universidad Galileo
ACTION GotoState ( ) $ X Ys0 shift to s1 error reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce (3) goto s3s2 shift to s2 reduce (5) error goto s3s3 error shift to s4 error s4 s5 s6
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
Y
[<S> <X> •$ ?]s5
(Y
s4[<Y> (<Y>) • $]
)[<Y> (<Y> • ) $]s3
[<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1
([<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s2(
[<X> <Y> • $]s6
X
Y
Oscar Bonilla 307 Universidad Galileo
ACTION GotoState ( ) $ X Ys0 shift to s1 error reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce (3) goto s3s2 shift to s2 reduce (5) error goto s3s3 error shift to s4 error s4 s5 s6
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
Y
[<S> <X> •$ ?]s5
(Y
s4[<Y> (<Y>) • $]
)[<Y> (<Y> • ) $]s3
[<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1
([<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s2(
[<X> <Y> • $]s6
X
Y
Oscar Bonilla 308 Universidad Galileo
ACTION GotoState ( ) $ X Ys0 shift to s1 error reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce (3) goto s3s2 shift to s2 reduce (5) error goto s3s3 error shift to s4 error s4 s5 s6
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
Y
[<S> <X> •$ ?]s5
(Y
s4[<Y> (<Y>) • $]
)[<Y> (<Y> • ) $]s3
[<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1
([<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s2(
[<X> <Y> • $]s6
X
Y
Oscar Bonilla 309 Universidad Galileo
ACTION GotoState ( ) $ X Ys0 shift to s1 error reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce (3) goto s3s2 shift to s2 reduce (5) error goto s3s3 error shift to s4 error s4 reduce (4) s5 s6
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
Y
[<S> <X> •$ ?]s5
(Y
s4[<Y> (<Y>) • $]
)[<Y> (<Y> • ) $]s3
[<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1
([<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s2(
[<X> <Y> • $]s6
X
Y
Oscar Bonilla 310 Universidad Galileo
ACTION GotoState ( ) $ X Ys0 shift to s1 error reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce (3) goto s3s2 shift to s2 reduce (5) error goto s3s3 error shift to s4 error s4 error error reduce (4) s5 s6
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
Y
[<S> <X> •$ ?]s5
(Y
s4[<Y> (<Y>) • $]
)[<Y> (<Y> • ) $]s3
[<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1
([<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s2(
[<X> <Y> • $]s6
X
Y
Oscar Bonilla 311 Universidad Galileo
ACTION GotoState ( ) $ X Ys0 shift to s1 error reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce (3) goto s3s2 shift to s2 reduce (5) error goto s3s3 error shift to s4 error s4 error error reduce (4) s5 s6
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
Y
[<S> <X> •$ ?]s5
(Y
s4[<Y> (<Y>) • $]
)[<Y> (<Y> • ) $]s3
[<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1
([<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s2(
[<X> <Y> • $]s6
X
Y
Oscar Bonilla 312 Universidad Galileo
ACTION GotoState ( ) $ X Ys0 shift to s1 error reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce (3) goto s3s2 shift to s2 reduce (5) error goto s3s3 error shift to s4 error s4 error error reduce (4) s5 accept s6
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
Y
[<S> <X> •$ ?]s5
(Y
s4[<Y> (<Y>) • $]
)[<Y> (<Y> • ) $]s3
[<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1
([<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s2(
[<X> <Y> • $]s6
X
Y
Oscar Bonilla 313 Universidad Galileo
ACTION GotoState ( ) $ X Ys0 shift to s1 error reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce (3) goto s3s2 shift to s2 reduce (5) error goto s3s3 error shift to s4 error s4 error error reduce (4) s5 error error accept s6
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
Y
[<S> <X> •$ ?]s5
(Y
s4[<Y> (<Y>) • $]
)[<Y> (<Y> • ) $]s3
[<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1
([<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s2(
[<X> <Y> • $]s6
X
Y
Oscar Bonilla 314 Universidad Galileo
ACTION GotoState ( ) $ X Ys0 shift to s1 error reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce (3) goto s3s2 shift to s2 reduce (5) error goto s3s3 error shift to s4 error s4 error error reduce (4) s5 error error accept s6
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
Y
[<S> <X> •$ ?]s5
(Y
s4[<Y> (<Y>) • $]
)[<Y> (<Y> • ) $]s3
[<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1
([<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s2(
[<X> <Y> • $]s6
X
Y
Oscar Bonilla 315 Universidad Galileo
ACTION GotoState ( ) $ X Ys0 shift to s1 error reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce (3) goto s3s2 shift to s2 reduce (5) error goto s3s3 error shift to s4 error s4 error error reduce (4) s5 error error accept s6
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
Y
[<S> <X> •$ ?]s5
(Y
s4[<Y> (<Y>) • $]
)[<Y> (<Y> • ) $]s3
[<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1
([<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s2(
[<X> <Y> • $]s6
X
Y
Oscar Bonilla 316 Universidad Galileo
ACTION GotoState ( ) $ X Ys0 shift to s1 error reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce (3) goto s3s2 shift to s2 reduce (5) error goto s3s3 error shift to s4 error s4 error error reduce (4) s5 error error accept s6 error error reduce (2)
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
Y
[<S> <X> •$ ?]s5
(Y
s4[<Y> (<Y>) • $]
)[<Y> (<Y> • ) $]s3
[<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1
([<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s2(
[<X> <Y> • $]s6
X
Y
Oscar Bonilla 317 Universidad Galileo
ACTION GotoState ( ) $ X Ys0 shift to s1 error reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce (3) goto s3s2 shift to s2 reduce (5) error goto s3s3 error shift to s4 error s4 error error reduce (4) s5 error error accept s6 error error reduce (2)
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
Y
[<S> <X> •$ ?]s5
(Y
s4[<Y> (<Y>) • $]
)[<Y> (<Y> • ) $]s3
[<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1
([<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s2(
[<X> <Y> • $]s6
X
Y
Oscar Bonilla 318 Universidad Galileo
ACTION GotoState ( ) $ X Ys0 shift to s1 error reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce (3) goto s3s2 shift to s2 reduce (5) error goto s3s3 error shift to s4 error s4 error error reduce (4) s5 error error accept s6 error error reduce (2)
[<S> • <X> $ ?][<X> • <Y> $][<X> • ( $][<Y> • (<Y>) $][<Y> • $]
s0
Y
[<S> <X> •$ ?]s5
(Y
s4[<Y> (<Y>) • $]
)[<Y> (<Y> • ) $]s3
[<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s1
([<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s2(
[<X> <Y> • $]s6
X
Y
51
Oscar Bonilla 319 Universidad Galileo
ACTION GotoState ( ) $ X Ys0 shift to s1 reduce (5) reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce(3 or 5) goto s3s2 shift to s2 reduce (5) reduce (5) goto s3s3 error shift to s4 error s4 error reduce (4) reduce (4) s5 error error accept s6 error error reduce (2)
SL
R(1
)L
R(1
)ACTION Goto
State ( ) $ X Ys0 shift to s1 error reduce (5) goto s5 goto s6s1 shift to s2 reduce (5) reduce (3) goto s3s2 shift to s2 reduce (5) error goto s3s3 error shift to s4 error s4 error error reduce (4) s5 error error accept s6 error error reduce (2)
52
Oscar Bonilla 320 Universidad Galileo
Gramáticas LR(1)
• Ahora sabemos cómo construir un parse engine para gramáticas LR(1)
• Muchas de las construcciones de programa que necesitamos pueden ser representadas por una gramática LR(1)
Oscar Bonilla 321 Universidad Galileo
Resumen
• Resumen de la construcción de un parser LR(0)
• Limitaciones de los lenguajes LR(0)
• Construcción de un parser engine SLR(1)
• Limitaciones de los lenguajes SLR(1)
• Construcción de un parser engine LR(1)
• Construcción de un parser engine LALR(1)
Oscar Bonilla 322 Universidad Galileo
Parser LALR(1)
• Motivación– Los parse engines LR(1) tienen un gran número de
estados – Método simple para eliminar estados
• Si dos estados son idénticos, excepto por el símbolo de look ahead de los ítems Unir los estados
Oscar Bonilla 323 Universidad Galileo
Ejemplo de LALR(1)
[<X> ( • $][<Y> ( • <Y> ) )][<Y> • ( <Y>) )][<Y> • )]
s1
[<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s2
[<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s3
[<Y> ( • <Y>) )][<Y> ( <Y> •) )][<Y> • )]
s4
Oscar Bonilla 324 Universidad Galileo
Ejemplo de LALR(1)
[<X> ( • $][<Y> ( • <Y> ) )][<Y> • ( <Y>) )][<Y> • )]
s1
[<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
s2
[<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s3
[<Y> ( • <Y>) )][<Y> ( <Y> •) )][<Y> • )]
s4
Oscar Bonilla 325 Universidad Galileo
Ejemplo de LALR(1)
[<X> ( • $][<Y> ( • <Y> ) )$][<Y> • ( <Y>) )][<Y> • )]
[<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s3
[<Y> ( • <Y>) )][<Y> ( <Y> •) )][<Y> • )]
s4
[<X> ( • $][<Y> ( • <Y> ) )][<Y> • ( <Y>) )][<Y> • )]
[<X> ( • $][<Y> ( • <Y> ) $][<Y> • ( <Y>) )][<Y> • )]
Oscar Bonilla 326 Universidad Galileo
Ejemplo de LALR(1)
[<X> ( • $][<Y> ( • <Y> ) )$][<Y> • ( <Y>) )][<Y> • )]
s1
[<Y> ( • <Y>) )][<Y> • ( <Y> ) )][<Y> • )]
s3
[<Y> ( • <Y>) )][<Y> ( <Y> •) )][<Y> • )]
s4
Oscar Bonilla 327 Universidad Galileo
Lecturas
• El Tigre– 3.4
• El Dragón– 4.1, 4.8