09 parser engines[1]

327
Compiladores Implementando un Parser LR Contrucción de parser engines SLR(1), LR(1) y LALR(1)

Upload: holylance

Post on 29-Jun-2015

229 views

Category:

Education


0 download

TRANSCRIPT

Page 1: 09 parser engines[1]

Compiladores

Implementando un Parser LR

Contrucción de parser engines SLR(1), LR(1) y LALR(1)

Page 2: 09 parser engines[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)

Page 3: 09 parser engines[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> )

Page 4: 09 parser engines[1]

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> ( ) •

Page 5: 09 parser engines[1]

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

Page 6: 09 parser engines[1]

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)

Page 7: 09 parser engines[1]

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> • ( )

Page 8: 09 parser engines[1]

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

Page 9: 09 parser engines[1]

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> • )

Page 10: 09 parser engines[1]

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

Page 11: 09 parser engines[1]

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

Page 12: 09 parser engines[1]

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)

Page 13: 09 parser engines[1]

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)

Page 14: 09 parser engines[1]

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

Page 15: 09 parser engines[1]

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)

Page 16: 09 parser engines[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

Page 17: 09 parser engines[1]

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>

Page 18: 09 parser engines[1]

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> ????

Page 19: 09 parser engines[1]

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> •

Page 20: 09 parser engines[1]

Oscar Bonilla 20 Universidad Galileo

Construcción del DFA para el Ejemplo

<S> • <X> $<X> • ( <X> )<X> •

s0

Page 21: 09 parser engines[1]

Oscar Bonilla 21 Universidad Galileo

Construcción del DFA para el Ejemplo

<S> • <X> $<X> • ( <X> )<X> •

s0<S> <X> • $

s1X

Page 22: 09 parser engines[1]

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

(

Page 23: 09 parser engines[1]

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

(

Page 24: 09 parser engines[1]

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

(

Page 25: 09 parser engines[1]

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

((

Page 26: 09 parser engines[1]

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(

Page 27: 09 parser engines[1]

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(

Page 28: 09 parser engines[1]

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

Page 29: 09 parser engines[1]

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

Page 30: 09 parser engines[1]

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

Page 31: 09 parser engines[1]

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

Page 32: 09 parser engines[1]

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

Page 33: 09 parser engines[1]

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

Page 34: 09 parser engines[1]

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

Page 35: 09 parser engines[1]

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

Page 36: 09 parser engines[1]

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

Page 37: 09 parser engines[1]

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

Page 38: 09 parser engines[1]

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

Page 39: 09 parser engines[1]

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

Page 40: 09 parser engines[1]

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

Page 41: 09 parser engines[1]

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

Page 42: 09 parser engines[1]

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

Page 43: 09 parser engines[1]

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

Page 44: 09 parser engines[1]

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

Page 45: 09 parser engines[1]

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

Page 46: 09 parser engines[1]

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

Page 47: 09 parser engines[1]

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

Page 48: 09 parser engines[1]

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

Page 49: 09 parser engines[1]

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

Page 50: 09 parser engines[1]

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

Page 51: 09 parser engines[1]

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

Page 52: 09 parser engines[1]

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

Page 53: 09 parser engines[1]

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?

Page 54: 09 parser engines[1]

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

Page 55: 09 parser engines[1]

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)

Page 56: 09 parser engines[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

Page 57: 09 parser engines[1]

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 $

Page 58: 09 parser engines[1]

Oscar Bonilla 58 Universidad Galileo

Ejemplo de follow()

• Encontrar follow(<X>) • gramática<S> <X> $<X> ( <X> )<X>

???

Page 59: 09 parser engines[1]

Oscar Bonilla 59 Universidad Galileo

Ejemplo de follow()

• Encontrar follow(<X>) • gramática<S> <X> $<X> ( <X> )<X>

)

Page 60: 09 parser engines[1]

Oscar Bonilla 60 Universidad Galileo

Ejemplo de follow()

• Encontrar follow(<X>) • gramática<S> <X> $<X> ( <X> )<X>

)

Page 61: 09 parser engines[1]

Oscar Bonilla 61 Universidad Galileo

Ejemplo de follow()

• Encontrar follow(<X>) • gramática<S> <X> $<X> ( <X> )<X>

), $

Page 62: 09 parser engines[1]

Oscar Bonilla 62 Universidad Galileo

Ejemplo de follow()

• Encontrar follow(<X>) • gramática<S> <X> $<X> ( <X> )<X>

), $

Page 63: 09 parser engines[1]

Oscar Bonilla 63 Universidad Galileo

Pregunta: Encuentren follow()

• Qué es follow(<S>) • gramática<S> <X> $<X> ( <X> )<X>

???

Page 64: 09 parser engines[1]

Oscar Bonilla 64 Universidad Galileo

Pregunta: Encuentren follow()

• Qué es follow(<S>) • gramática<S> <X> $<X> ( <X> )<X>

$

Page 65: 09 parser engines[1]

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

Page 66: 09 parser engines[1]

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)

Page 67: 09 parser engines[1]

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>) = { $ }

Page 68: 09 parser engines[1]

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>) = { $ }

Page 69: 09 parser engines[1]

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>) = { $ }

Page 70: 09 parser engines[1]

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>) = { $ }

Page 71: 09 parser engines[1]

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>) = { $ }

Page 72: 09 parser engines[1]

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>) = { $ }

Page 73: 09 parser engines[1]

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>) = { $ }

Page 74: 09 parser engines[1]

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>) = { $ }

Page 75: 09 parser engines[1]

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>) = { $ }

Page 76: 09 parser engines[1]

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>) = { $ }

Page 77: 09 parser engines[1]

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>) = { $ }

Page 78: 09 parser engines[1]

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>) = { $ }

Page 79: 09 parser engines[1]

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>) = { $ }

Page 80: 09 parser engines[1]

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>) = { $ }

Page 81: 09 parser engines[1]

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>) = { $ }

Page 82: 09 parser engines[1]

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>) = { $ }

Page 83: 09 parser engines[1]

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>) = { $ }

Page 84: 09 parser engines[1]

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>) = { $ }

Page 85: 09 parser engines[1]

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>) = { $ }

Page 86: 09 parser engines[1]

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>) = { $ }

Page 87: 09 parser engines[1]

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>) = { $ }

Page 88: 09 parser engines[1]

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>) = { $ }

Page 89: 09 parser engines[1]

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>) = { $ }

Page 90: 09 parser engines[1]

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>) = { $ }

Page 91: 09 parser engines[1]

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>) = { $ }

Page 92: 09 parser engines[1]

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>) = { $ }

Page 93: 09 parser engines[1]

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>) = { $ }

Page 94: 09 parser engines[1]

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>) = { $ }

Page 95: 09 parser engines[1]

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>) = { $ }

Page 96: 09 parser engines[1]

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>) = { $ }

Page 97: 09 parser engines[1]

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>) = { $ }

Page 98: 09 parser engines[1]

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

)

Page 99: 09 parser engines[1]

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)

Page 100: 09 parser engines[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)

Page 101: 09 parser engines[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)

Page 102: 09 parser engines[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

Page 103: 09 parser engines[1]

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

Page 104: 09 parser engines[1]

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

Page 105: 09 parser engines[1]

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>

Page 106: 09 parser engines[1]

Oscar Bonilla 106 Universidad Galileo

DFA del Ejemplo Expandido

<S> <X> $

<X> <Y>

<X> (

<Y> ( <Y> )

<Y>

Page 107: 09 parser engines[1]

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>

Page 108: 09 parser engines[1]

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>

Page 109: 09 parser engines[1]

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>

Page 110: 09 parser engines[1]

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>

Page 111: 09 parser engines[1]

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>

Page 112: 09 parser engines[1]

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>

Page 113: 09 parser engines[1]

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>

Page 114: 09 parser engines[1]

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>

Page 115: 09 parser engines[1]

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>

Page 116: 09 parser engines[1]

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

Page 117: 09 parser engines[1]

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>

Page 118: 09 parser engines[1]

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>

Page 119: 09 parser engines[1]

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>

Page 120: 09 parser engines[1]

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>

Page 121: 09 parser engines[1]

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>

Page 122: 09 parser engines[1]

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>

Page 123: 09 parser engines[1]

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>

Page 124: 09 parser engines[1]

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>) = ???

Page 125: 09 parser engines[1]

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>) = ???

Page 126: 09 parser engines[1]

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>

$

$

Page 127: 09 parser engines[1]

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>

$

), $

$

Page 128: 09 parser engines[1]

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

Page 129: 09 parser engines[1]

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

Page 130: 09 parser engines[1]

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

Page 131: 09 parser engines[1]

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

Page 132: 09 parser engines[1]

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

Page 133: 09 parser engines[1]

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

Page 134: 09 parser engines[1]

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>) = { ), $ }

Page 135: 09 parser engines[1]

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>) = { ), $ }

Page 136: 09 parser engines[1]

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>) = { ), $ }

Page 137: 09 parser engines[1]

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

Page 138: 09 parser engines[1]

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

Page 139: 09 parser engines[1]

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

Page 140: 09 parser engines[1]

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

Page 141: 09 parser engines[1]

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

Page 142: 09 parser engines[1]

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>) = { $ }

Page 143: 09 parser engines[1]

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>) = { $ }

Page 144: 09 parser engines[1]

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

Page 145: 09 parser engines[1]

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>) = { ), $ }

Page 146: 09 parser engines[1]

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>) = { ), $ }

Page 147: 09 parser engines[1]

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!

Page 148: 09 parser engines[1]

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

Page 149: 09 parser engines[1]

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

Page 150: 09 parser engines[1]

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

Page 151: 09 parser engines[1]

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

Page 152: 09 parser engines[1]

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

Page 153: 09 parser engines[1]

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

Page 154: 09 parser engines[1]

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

Page 155: 09 parser engines[1]

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

Page 156: 09 parser engines[1]

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

Page 157: 09 parser engines[1]

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

Page 158: 09 parser engines[1]

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

Page 159: 09 parser engines[1]

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

Page 160: 09 parser engines[1]

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

Page 161: 09 parser engines[1]

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

Page 162: 09 parser engines[1]

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

Page 163: 09 parser engines[1]

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

Page 164: 09 parser engines[1]

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

Page 165: 09 parser engines[1]

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

Page 166: 09 parser engines[1]

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

Page 167: 09 parser engines[1]

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

Page 168: 09 parser engines[1]

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

Page 169: 09 parser engines[1]

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

Page 170: 09 parser engines[1]

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

Page 171: 09 parser engines[1]

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

Page 172: 09 parser engines[1]

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

Page 173: 09 parser engines[1]

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?

Page 174: 09 parser engines[1]

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)

Page 175: 09 parser engines[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

Page 176: 09 parser engines[1]

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)

Page 177: 09 parser engines[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

Page 178: 09 parser engines[1]

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 }

Page 179: 09 parser engines[1]

Oscar Bonilla 179 Universidad Galileo

Ejemplo de first()• Gramática

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

Page 180: 09 parser engines[1]

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) = { }

Page 181: 09 parser engines[1]

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 }

Page 182: 09 parser engines[1]

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 }

Page 183: 09 parser engines[1]

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 }

Page 184: 09 parser engines[1]

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 }

Page 185: 09 parser engines[1]

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 }

Page 186: 09 parser engines[1]

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 }

Page 187: 09 parser engines[1]

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 }

Page 188: 09 parser engines[1]

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 }

Page 189: 09 parser engines[1]

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 }

Page 190: 09 parser engines[1]

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 }

Page 191: 09 parser engines[1]

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 }

Page 192: 09 parser engines[1]

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 }

Page 193: 09 parser engines[1]

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 }

Page 194: 09 parser engines[1]

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 }

Page 195: 09 parser engines[1]

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 }

Page 196: 09 parser engines[1]

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 }

Page 197: 09 parser engines[1]

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 }

Page 198: 09 parser engines[1]

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)

Page 199: 09 parser engines[1]

Oscar Bonilla 199 Universidad Galileo

Ejemplo de follow()• Gramática

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

Page 200: 09 parser engines[1]

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) = { (, }

Page 201: 09 parser engines[1]

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) = { (, }

Page 202: 09 parser engines[1]

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) = { (, }

Page 203: 09 parser engines[1]

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)

Page 204: 09 parser engines[1]

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)

Page 205: 09 parser engines[1]

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)

Page 206: 09 parser engines[1]

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)

Page 207: 09 parser engines[1]

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)

Page 208: 09 parser engines[1]

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)

Page 209: 09 parser engines[1]

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)

Page 210: 09 parser engines[1]

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)

Page 211: 09 parser engines[1]

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

Page 212: 09 parser engines[1]

Oscar Bonilla 212 Universidad Galileo

Algoritmo para Closure

colsure(I)

Page 213: 09 parser engines[1]

Oscar Bonilla 213 Universidad Galileo

Algoritmo para Closure

colsure(I)

repetir

hasta que I no cambie

Page 214: 09 parser engines[1]

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

Page 215: 09 parser engines[1]

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

Page 216: 09 parser engines[1]

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

Page 217: 09 parser engines[1]

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

Page 218: 09 parser engines[1]

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

Page 219: 09 parser engines[1]

Oscar Bonilla 219 Universidad Galileo

Ejemplo de Closure• Qué es closure([ Y ( • Y ) $ ])

Page 220: 09 parser engines[1]

Oscar Bonilla 220 Universidad Galileo

Ejemplo de Closure• Qué es closure([ Y ( • Y ) $ ])

• Gramática<S> <X> $<X> <Y><X> ( <Y> ( <Y> )<Y>

Page 221: 09 parser engines[1]

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 =

Page 222: 09 parser engines[1]

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 =

Page 223: 09 parser engines[1]

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

Page 224: 09 parser engines[1]

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

Page 225: 09 parser engines[1]

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

Page 226: 09 parser engines[1]

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

Page 227: 09 parser engines[1]

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

Page 228: 09 parser engines[1]

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

Page 229: 09 parser engines[1]

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

Page 230: 09 parser engines[1]

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

Page 231: 09 parser engines[1]

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

Page 232: 09 parser engines[1]

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

Page 233: 09 parser engines[1]

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

Page 234: 09 parser engines[1]

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

Page 235: 09 parser engines[1]

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

Page 236: 09 parser engines[1]

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

Page 237: 09 parser engines[1]

Oscar Bonilla 237 Universidad Galileo

Algoritmo para Goto

goto(I, X)

Page 238: 09 parser engines[1]

Oscar Bonilla 238 Universidad Galileo

Algoritmo para Goto

goto(I, X)

J = { }

Page 239: 09 parser engines[1]

Oscar Bonilla 239 Universidad Galileo

Algoritmo para Goto

goto(I, X)

J = { }

para cualquier ítem [A • X c] en I

Page 240: 09 parser engines[1]

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]}

Page 241: 09 parser engines[1]

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

Page 242: 09 parser engines[1]

Oscar Bonilla 242 Universidad Galileo

Ejemplo de Goto

• Qué es goto([ Y ( • Y ) $ ], Y)

42

Page 243: 09 parser engines[1]

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]}

Page 244: 09 parser engines[1]

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]}

Page 245: 09 parser engines[1]

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]}

Page 246: 09 parser engines[1]

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]}

Page 247: 09 parser engines[1]

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]}

Page 248: 09 parser engines[1]

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

Page 249: 09 parser engines[1]

Oscar Bonilla 249 Universidad Galileo

DFA del Ejemplo Expandido

<S> <X> $

<X> <Y>

<X> (

<Y> ( <Y> )

<Y>

Page 250: 09 parser engines[1]

Oscar Bonilla 250 Universidad Galileo

[<S> • <X> $ ?]

DFA del Ejemplo Expandido

<S> <X> $

<X> <Y>

<X> (

<Y> ( <Y> )

<Y>

Page 251: 09 parser engines[1]

Oscar Bonilla 251 Universidad Galileo

[<S> • <X> $ ?]

DFA del Ejemplo Expandido

<S> <X> $

<X> <Y>

<X> (

<Y> ( <Y> )

<Y>

closure([<S> • <X> $ ?]) = ???

Page 252: 09 parser engines[1]

Oscar Bonilla 252 Universidad Galileo

[<S> • <X> $ ?]

DFA del Ejemplo Expandido

<S> <X> $

<X> <Y>

<X> (

<Y> ( <Y> )

<Y>

closure([<S> • <X> $ ?]) = ???

first( $? ) = ???

Page 253: 09 parser engines[1]

Oscar Bonilla 253 Universidad Galileo

[<S> • <X> $ ?]

DFA del Ejemplo Expandido

<S> <X> $

<X> <Y>

<X> (

<Y> ( <Y> )

<Y>

closure([<S> • <X> $ ?]) = ???

first( $? ) = { $ }

Page 254: 09 parser engines[1]

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( $? ) = { $ }

Page 255: 09 parser engines[1]

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>

Page 256: 09 parser engines[1]

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( , ( ) = ???

Page 257: 09 parser engines[1]

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( , ( ) = ???

Page 258: 09 parser engines[1]

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( ) = ???

Page 259: 09 parser engines[1]

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( ) = ???

Page 260: 09 parser engines[1]

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>

Page 261: 09 parser engines[1]

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>

Page 262: 09 parser engines[1]

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( , ( ) = ???

Page 263: 09 parser engines[1]

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( , ( ) = ???

Page 264: 09 parser engines[1]

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( ) = ???

Page 265: 09 parser engines[1]

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( )) ) = ???

Page 266: 09 parser engines[1]

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( )) ) = { ) }

Page 267: 09 parser engines[1]

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> • )]

Page 268: 09 parser engines[1]

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>

Page 269: 09 parser engines[1]

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>

Page 270: 09 parser engines[1]

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> ) )]

Page 271: 09 parser engines[1]

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> • )]

Page 272: 09 parser engines[1]

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>

Page 273: 09 parser engines[1]

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>

Page 274: 09 parser engines[1]

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>

Page 275: 09 parser engines[1]

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>

Page 276: 09 parser engines[1]

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>

Page 277: 09 parser engines[1]

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>

Page 278: 09 parser engines[1]

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>

Page 279: 09 parser engines[1]

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>

Page 280: 09 parser engines[1]

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>

Page 281: 09 parser engines[1]

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

Page 282: 09 parser engines[1]

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

Page 283: 09 parser engines[1]

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)

Page 284: 09 parser engines[1]

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

Page 285: 09 parser engines[1]

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

Page 286: 09 parser engines[1]

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

Page 287: 09 parser engines[1]

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

Page 288: 09 parser engines[1]

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

Page 289: 09 parser engines[1]

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

Page 290: 09 parser engines[1]

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

Page 291: 09 parser engines[1]

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

Page 292: 09 parser engines[1]

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

Page 293: 09 parser engines[1]

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

Page 294: 09 parser engines[1]

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

Page 295: 09 parser engines[1]

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

Page 296: 09 parser engines[1]

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

Page 297: 09 parser engines[1]

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

Page 298: 09 parser engines[1]

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

Page 299: 09 parser engines[1]

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

Page 300: 09 parser engines[1]

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

Page 301: 09 parser engines[1]

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

Page 302: 09 parser engines[1]

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

Page 303: 09 parser engines[1]

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

Page 304: 09 parser engines[1]

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

Page 305: 09 parser engines[1]

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

Page 306: 09 parser engines[1]

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

Page 307: 09 parser engines[1]

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

Page 308: 09 parser engines[1]

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

Page 309: 09 parser engines[1]

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

Page 310: 09 parser engines[1]

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

Page 311: 09 parser engines[1]

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

Page 312: 09 parser engines[1]

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

Page 313: 09 parser engines[1]

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

Page 314: 09 parser engines[1]

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

Page 315: 09 parser engines[1]

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

Page 316: 09 parser engines[1]

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

Page 317: 09 parser engines[1]

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

Page 318: 09 parser engines[1]

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

Page 319: 09 parser engines[1]

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

Page 320: 09 parser engines[1]

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)

Page 321: 09 parser engines[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)

Page 322: 09 parser engines[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

Page 323: 09 parser engines[1]

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

Page 324: 09 parser engines[1]

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

Page 325: 09 parser engines[1]

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> • )]

Page 326: 09 parser engines[1]

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

Page 327: 09 parser engines[1]

Oscar Bonilla 327 Universidad Galileo

Lecturas

• El Tigre– 3.4

• El Dragón– 4.1, 4.8