compiladores parsers parsers predictivos, ll(0), ll(k), parsers shift-reduce, construcción de un...

391
Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Upload: sancha-rolan

Post on 23-Jan-2016

240 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Compiladores

Parsers

Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de

un Parser LL(0)

Page 2: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 2 Universidad Galileo

Resumen

• Parsers Predictivos

• Implementando un Parser

• Ejemplo de un Parser shift-reduce

• ¿Por qué es difícil construir un parser engine?

• LR(k) parser tables

• Construyendo un Parser Engine LR(0)

Page 3: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 3 Universidad Galileo

Parsers Predictivos

• Algunas gramáticas pueden parsearse usando un algoritmo conocido como Recursive Descent

• Recursive Descent: Una función para cada no terminal, una clausula para cada terminal

Page 4: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 4 Universidad Galileo

Ejemplo: Parser Predictivo

• Gramática:<S> if <E> then <S> else <S><S> begin <S> <L><S> print <E><L> end<L> ; <S><L><E> num = num

Page 5: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 5 Universidad Galileo

Ejemplo: Parser PredictivoGramática:

<S> if <E> then <S> else <S><S> begin <S> <L><S> print <E><L> end<L> ; <S><L><E> num = num

void S (void) { switch(token) { case IF: eat(IF); E(); eat(THEN); S(); eat(ELSE); S(); break; case BEGIN: eat(BEGIN); S(); L(); break; case PRINT: eat(PRINT); E(); break; default: error(); }}

void L (void) { switch(token) { case END: eat(END); break; case SEMI: eat(SEMI); S(); L(); break; default: error(); }}

void E (void) { eat(NUM); eat(EQ); eat(NUM); }

Page 6: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 6 Universidad Galileo

Ejemplo: Parser PredictivoGramática:

<S> if <E> then <S> else <S><S> begin <S> <L><S> print <E><L> end<L> ; <S><L><E> num = num

void S (void) { switch(token) { case IF: eat(IF); E(); eat(THEN); S(); eat(ELSE); S(); break; case BEGIN: eat(BEGIN); S(); L(); break; case PRINT: eat(PRINT); E(); break; default: error(); }}

void L (void) { switch(token) { case END: eat(END); break; case SEMI: eat(SEMI); S(); L(); break; default: error(); }}

void E (void) { eat(NUM); eat(EQ); eat(NUM); }

No terminales

Page 7: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 7 Universidad Galileo

Ejemplo: Parser PredictivoGramática:

<S> if <E> then <S> else <S><S> begin <S> <L><S> print <E><L> end<L> ; <S><L><E> num = num

void S (void) { switch(token) { case IF: eat(IF); E(); eat(THEN); S(); eat(ELSE); S(); break; case BEGIN: eat(BEGIN); S(); L(); break; case PRINT: eat(PRINT); E(); break; default: error(); }}

void L (void) { switch(token) { case END: eat(END); break; case SEMI: eat(SEMI); S(); L(); break; default: error(); }}

void E (void) { eat(NUM); eat(EQ); eat(NUM); }

terminales

Page 8: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 8 Universidad Galileo

Parsers Predictivos

• Los parsers predictivos sólo funcionan para gramáticas donde el primer símbolo terminal de cada subexpresión provee suficiente información para determinar qué producción usar.

Page 9: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 9 Universidad Galileo

Ejemplo

• Gramática<E> <E> + <T><E> <E> - <T><E> <T><T> <T> * <F><T> <T> / <F><T> <F><F> id<F> num<F> ( <E> )

• Ejemplos:

( 1 * 2 – 3 ) + 4 ( 1 * 2 – 3 )

Page 10: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 10 Universidad Galileo

Ejemplo• Gramática

<E> <E> + <T><E> <E> - <T><E> <T><T> <T> * <F><T> <T> / <F><T> <F><F> id<F> num<F> ( <E> )

void E (void) { switch(token) { case ??: E(); eat(PLUS); T(); break; case ??: E(); eat(MINUS); T(); break; case ??: T(); break; default: error(); }}

Void T (void) { switch(token) { case ??: T(); eat(TIMES); F(); break; case ??: T(); eat(DIV); F(); break; case ??: F(); break; default: error(); }}

Page 11: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 11 Universidad Galileo

Ejemplo• Gramática

<E> <E> + <T><E> <E> - <T><E> <T><T> <T> * <F><T> <T> / <F><T> <F><F> id<F> num<F> ( <E> )

void E (void) { switch(token) { case ??: E(); eat(PLUS); T(); break; case ??: E(); eat(MINUS); T(); break; case ??: T(); break; default: error(); }}

Void T (void) { switch(token) { case ??: T(); eat(TIMES); F(); break; case ??: T(); eat(DIV); F(); break; case ??: F(); break; default: error(); }}

¿Qué ponemos aquí?

Page 12: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 12 Universidad Galileo

Ejemplo• Gramática

<E> <E> + <T><E> <E> - <T><E> <T><T> <T> * <F><T> <T> / <F><T> <F><F> id<F> num<F> ( <E> )

void E (void) { switch(token) { case ??: E(); eat(PLUS); T(); break; case ??: E(); eat(MINUS); T(); break; case ??: T(); break; default: error(); }}

Void T (void) { switch(token) { case ??: T(); eat(TIMES); F(); break; case ??: T(); eat(DIV); F(); break; case ??: F(); break; default: error(); }}

( 1 * 2 – 3 ) + 4

Page 13: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 13 Universidad Galileo

Ejemplo• Gramática

<E> <E> + <T><E> <E> - <T><E> <T><T> <T> * <F><T> <T> / <F><T> <F><F> id<F> num<F> ( <E> )

void E (void) { switch(token) { case ??: E(); eat(PLUS); T(); break; case ??: E(); eat(MINUS); T(); break; case ??: T(); break; default: error(); }}

Void T (void) { switch(token) { case ??: T(); eat(TIMES); F(); break; case ??: T(); eat(DIV); F(); break; case ??: F(); break; default: error(); }}

( 1 * 2 – 3 ) + 4

Page 14: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 14 Universidad Galileo

Ejemplo• Gramática

<E> <E> + <T><E> <E> - <T><E> <T><T> <T> * <F><T> <T> / <F><T> <F><F> id<F> num<F> ( <E> )

void E (void) { switch(token) { case LPAREN: E(); eat(PLUS); T(); break; case ??: E(); eat(MINUS); T(); break; case ??: T(); break; default: error(); }}

Void T (void) { switch(token) { case ??: T(); eat(TIMES); F(); break; case ??: T(); eat(DIV); F(); break; case ??: F(); break; default: error(); }}

( 1 * 2 – 3 ) + 4

Page 15: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 15 Universidad Galileo

Ejemplo• Gramática

<E> <E> + <T><E> <E> - <T><E> <T><T> <T> * <F><T> <T> / <F><T> <F><F> id<F> num<F> ( <E> )

void E (void) { switch(token) { case LPAREN: E(); eat(PLUS); T(); break; case ??: E(); eat(MINUS); T(); break; case ??: T(); break; default: error(); }}

Void T (void) { switch(token) { case ??: T(); eat(TIMES); F(); break; case ??: T(); eat(DIV); F(); break; case ??: F(); break; default: error(); }}

( 1 * 2 – 3 ) + 4( 1 * 2 – 3 )

Page 16: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 16 Universidad Galileo

Ejemplo• Gramática

<E> <E> + <T><E> <E> - <T><E> <T><T> <T> * <F><T> <T> / <F><T> <F><F> id<F> num<F> ( <E> )

void E (void) { switch(token) { case LPAREN: E(); eat(PLUS); T(); break; case ??: E(); eat(MINUS); T(); break; case ??: T(); break; default: error(); }}

Void T (void) { switch(token) { case ??: T(); eat(TIMES); F(); break; case ??: T(); eat(DIV); F(); break; case ??: F(); break; default: error(); }}

( 1 * 2 – 3 ) + 4( 1 * 2 – 3 )

Page 17: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 17 Universidad Galileo

Ejemplo• Gramática

<E> <E> + <T><E> <E> - <T><E> <T><T> <T> * <F><T> <T> / <F><T> <F><F> id<F> num<F> ( <E> )

void E (void) { switch(token) { case LPAREN: E(); eat(PLUS); T(); break; case ??: E(); eat(MINUS); T(); break; case LPAREN: T(); break; default: error(); }}

Void T (void) { switch(token) { case ??: T(); eat(TIMES); F(); break; case ??: T(); eat(DIV); F(); break; case ??: F(); break; default: error(); }}

( 1 * 2 – 3 ) + 4( 1 * 2 – 3 )

Page 18: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 18 Universidad Galileo

First(), Follow() y Nullable()

• Nullable(X) es verdadero si X puede derivar

• FIRST() es el conjunto de terminales que pueden comenzar strings derivados de

• FOLLOW(X) es el conjunto de terminales que pueden seguir a X. Esto es, t FOLLOW(X) si hay una derivación que contenga Xt. Esto puede ocurrir si una derivación contiene XYZt donde tanto Y como Z derivan .

Page 19: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 19 Universidad Galileo

Algoritmo para First(), Follow() y Nullable()

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

Page 20: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 20 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X

Y

Z

Page 21: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 21 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X

Y

Z

Page 22: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 22 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y no

Z no

Page 23: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 23 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y no

Z no

Page 24: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 24 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y no

Z no

Page 25: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 25 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y no

Z no

Page 26: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 26 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y no

Z no

Page 27: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 27 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y no

Z no

Page 28: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 28 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y no

Z no

i = 1, j = 2, k = 1

Page 29: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 29 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y no

Z no

i = 1, j = 2, k = 1

Page 30: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 30 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y no

Z no

i = 1, j = 2, k = 1

Page 31: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 31 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y no

Z no d

i = 1, j = 2, k = 1

Page 32: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 32 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y no

Z no d

i = 1, j = 2, k = 1

Page 33: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 33 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y no

Z no d

i = 1, j = 2, k = 1

Page 34: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 34 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y no

Z no d

i = 1, j = 2, k = 1

Page 35: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 35 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y no

Z no d

i = 1, j = 2, k = 1

Page 36: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 36 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y no

Z no d

Page 37: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 37 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y no

Z no d

Page 38: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 38 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y no

Z no d

Page 39: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 39 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y no

Z no d

i = 1, j = 2, k = 3

Page 40: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 40 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y no

Z no d

i = 1, j = 2, k = 3

Page 41: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 41 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y no

Z no d

i = 1, j = 2, k = 3

Page 42: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 42 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y no

Z no d

i = 1, j = 2, k = 3

Page 43: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 43 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y no

Z no d

i = 1, j = 2, k = 3

Page 44: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 44 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y no

Z no d

i = 1, j = 2, k = 3

Page 45: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 45 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y no

Z no d

i = 1, j = 3, k = 3

Page 46: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 46 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y no

Z no d

i = 1, j = 3, k = 3

Page 47: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 47 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y no

Z no d

i = 1, j = 3, k = 3

Page 48: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 48 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y no

Z no d

i = 1, j = 3, k = 3

Page 49: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 49 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y no

Z no d

i = 2, j = 3, k = 3

Page 50: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 50 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y no

Z no d

i = 2, j = 3, k = 3

Page 51: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 51 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y no

Z no d

i = 2, j = 3, k = 3

Page 52: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 52 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y no

Z no d

i = 2, j = 3, k = 3

Page 53: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 53 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y no d

Z no d

i = 2, j = 3, k = 3

Page 54: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 54 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y no d

Z no d

i = 3, j = 4, k = 3

Page 55: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 55 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y no d

Z no d

i = 3, j = 4, k = 3

Page 56: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 56 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y no d

Z no d

i = 3, j = 4, k = 3

Page 57: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 57 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y no d

Z no d

i = 3, j = 4, k = 3

Page 58: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 58 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y no d

Z no d

i = 3, j = 4, k = 3

Page 59: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 59 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y no d

Z no d

i = 3, j = 4, k = 3

Page 60: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 60 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y no d

Z no d

Page 61: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 61 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y no d

Z no d

Page 62: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 62 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y no d

Z no d

Page 63: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 63 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y no d

Z no d

Page 64: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 64 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y yes d

Z no d

Page 65: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 65 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y yes d

Z no d

i = 1, j = 2, k = 0

Page 66: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 66 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y yes d

Z no d

Page 67: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 67 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y yes d

Z no d

Page 68: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 68 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y yes d

Z no d

Page 69: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 69 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y yes d

Z no d

i = 1, j = 2, k = 1

Page 70: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 70 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y yes d

Z no d

i = 1, j = 2, k = 1

Page 71: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 71 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y yes d

Z no d

i = 1, j = 2, k = 1

Page 72: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 72 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y yes c d

Z no d

i = 1, j = 2, k = 1

Page 73: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 73 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y yes c d

Z no d

i = 1, j = 2, k = 1

Page 74: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 74 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y yes c d

Z no d

i = 1, j = 2, k = 1

Page 75: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 75 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y yes c d

Z no d

i = 1, j = 2, k = 1

Page 76: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 76 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y yes c d

Z no d

i = 1, j = 2, k = 1

Page 77: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 77 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y yes c d

Z no d

Page 78: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 78 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y yes c d

Z no d

Page 79: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 79 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y yes c d

Z no d

Page 80: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 80 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X no

Y yes c d

Z no d

Page 81: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 81 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X yes

Y yes c d

Z no d

Page 82: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 82 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X yes

Y yes c d

Z no d

i = 1, j = 2, k = 1

Page 83: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 83 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X yes

Y yes c d

Z no d

i = 1, j = 2, k = 1

Page 84: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 84 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X yes

Y yes c d

Z no d

i = 1, j = 2, k = 1

Page 85: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 85 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X yes c

Y yes c d

Z no d

i = 1, j = 2, k = 1

Page 86: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 86 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X yes c

Y yes c d

Z no d

i = 1, j = 2, k = 1

Page 87: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 87 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X yes c

Y yes c d

Z no d

i = 1, j = 2, k = 1

Page 88: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 88 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X yes c

Y yes c d

Z no d

i = 1, j = 2, k = 1

Page 89: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 89 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X yes c

Y yes c d

Z no d

i = 1, j = 2, k = 1

Page 90: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 90 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X yes c

Y yes c d

Z no d

i = 1, j = 2, k = 1

Page 91: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 91 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X yes c

Y yes c d

Z no d

i = 1, j = 2, k = 1

Page 92: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 92 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X yes c

Y yes c d

Z no d

Page 93: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 93 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X yes c

Y yes c d

Z no d

Page 94: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 94 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X yes c

Y yes c d

Z no d

Page 95: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 95 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X yes c

Y yes c d

Z no d

i = 1, j = 2, k = 1

Page 96: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 96 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X yes c

Y yes c d

Z no d

i = 1, j = 2, k = 1

Page 97: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 97 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X yes c

Y yes c d

Z no d

i = 1, j = 2, k = 1

Page 98: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 98 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X yes a c

Y yes c d

Z no d

i = 1, j = 2, k = 1

Page 99: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 99 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X yes a c

Y yes c d

Z no d

i = 1, j = 2, k = 1

Page 100: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 100 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X yes a c

Y yes c d

Z no d

i = 1, j = 2, k = 1

Page 101: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 101 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X yes a c

Y yes c d

Z no d

i = 1, j = 2, k = 1

Page 102: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 102 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X yes a c

Y yes c d

Z no d

i = 1, j = 2, k = 1

Page 103: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 103 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X yes a c

Y yes c d

Z no d

Page 104: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 104 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X yes a c

Y yes c d

Z no d

Page 105: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 105 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X yes a c

Y yes c d

Z no d

Page 106: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 106 Universidad Galileo

EjemploGramática

<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

Incializar FIRST y FOLLOW al conjunto vacío y nullable a falsoPara cada símbolo terminal Z, FIRST[Z] = {Z}Repetir

Para cada producción X Y1 Y2 Yk

Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y1 Yi-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X] FIRST[Yi] Si Yi+1 Yk son todos nullable (o si i = k ) entonces FOLLOW[Yi] = FOLLOW[Yi] FOLLOW[X] Si Yi+1 Yj-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Yi] = FOLLOW[Yi] FIRST[Yj]

Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

nullable FIRST FOLLOW

X yes a c a c d

Y yes c a c d

Z no a c d

Page 107: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 107 Universidad Galileo

Construyendo un Parser Predictivo

• Usando la información de FIRST y FOLLOW podemos crear una tabla de parseo

• Ingresamos la producción X en la fila X, columna T de una tabla para cada T FIRST()

• Si es nullable, ingresamos la producción en la fila X, columna T para cada T FOLLOW(X)

Page 108: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 108 Universidad Galileo

Ejemplo: Tabla de Parser Predictivo

nullable FIRST FOLLOW

X yes a c a c d

Y yes c a c d

Z no a c d

Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

a c d

X

Y

Z

Ingresamos la producción X en la fila X, columna T de una tabla para cada T FIRST()

Si es nullable, ingresamos la producción en la fila X, columna T para cada T FOLLOW(X)

Page 109: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 109 Universidad Galileo

Ejemplo: Tabla de Parser Predictivo

nullable FIRST FOLLOW

X yes a c a c d

Y yes c a c d

Z no a c d

Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

a c d

X

Y

Z

Ingresamos la producción X en la fila X, columna T de una tabla para cada T FIRST()

Si es nullable, ingresamos la producción en la fila X, columna T para cada T FOLLOW(X)

Page 110: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 110 Universidad Galileo

Ejemplo: Tabla de Parser Predictivo

nullable FIRST FOLLOW

X yes a c a c d

Y yes c a c d

Z no a c d

Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

a c d

X

Y

Z

Ingresamos la producción X en la fila X, columna T de una tabla para cada T FIRST()

Si es nullable, ingresamos la producción en la fila X, columna T para cada T FOLLOW(X)

Page 111: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 111 Universidad Galileo

Ejemplo: Tabla de Parser Predictivo

nullable FIRST FOLLOW

X yes a c a c d

Y yes c a c d

Z no a c d

Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

a c d

X

Y

Z

Ingresamos la producción X en la fila X, columna T de una tabla para cada T FIRST()

Si es nullable, ingresamos la producción en la fila X, columna T para cada T FOLLOW(X)

Page 112: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 112 Universidad Galileo

Ejemplo: Tabla de Parser Predictivo

nullable FIRST FOLLOW

X yes a c a c d

Y yes c a c d

Z no a c d

Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

a c d

X

Y

Z <Z> d

Ingresamos la producción X en la fila X, columna T de una tabla para cada T FIRST()

Si es nullable, ingresamos la producción en la fila X, columna T para cada T FOLLOW(X)

Page 113: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 113 Universidad Galileo

Ejemplo: Tabla de Parser Predictivo

nullable FIRST FOLLOW

X yes a c a c d

Y yes c a c d

Z no a c d

Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

a c d

X

Y

Z <Z> d

Ingresamos la producción X en la fila X, columna T de una tabla para cada T FIRST()

Si es nullable, ingresamos la producción en la fila X, columna T para cada T FOLLOW(X)

Page 114: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 114 Universidad Galileo

Ejemplo: Tabla de Parser Predictivo

nullable FIRST FOLLOW

X yes a c a c d

Y yes c a c d

Z no a c d

Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

a c d

X

Y

Z <Z> d

Ingresamos la producción X en la fila X, columna T de una tabla para cada T FIRST()

Si es nullable, ingresamos la producción en la fila X, columna T para cada T FOLLOW(X)

Page 115: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 115 Universidad Galileo

Ejemplo: Tabla de Parser Predictivo

nullable FIRST FOLLOW

X yes a c a c d

Y yes c a c d

Z no a c d

Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

a c d

X

Y

Z<Z> <X><Y><Z> <Z> <X><Y><Z>

<Z> d

<Z> <X><Y><Z>

Ingresamos la producción X en la fila X, columna T de una tabla para cada T FIRST()

Si es nullable, ingresamos la producción en la fila X, columna T para cada T FOLLOW(X)

Page 116: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 116 Universidad Galileo

Ejemplo: Tabla de Parser Predictivo

nullable FIRST FOLLOW

X yes a c a c d

Y yes c a c d

Z no a c d

Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

a c d

X

Y

Z<Z> <X><Y><Z> <Z> <X><Y><Z>

<Z> d

<Z> <X><Y><Z>

Ingresamos la producción X en la fila X, columna T de una tabla para cada T FIRST()

Si es nullable, ingresamos la producción en la fila X, columna T para cada T FOLLOW(X)

Page 117: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 117 Universidad Galileo

Ejemplo: Tabla de Parser Predictivo

nullable FIRST FOLLOW

X yes a c a c d

Y yes c a c d

Z no a c d

Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

a c d

X

Y

Z<Z> <X><Y><Z> <Z> <X><Y><Z>

<Z> d

<Z> <X><Y><Z>

Ingresamos la producción X en la fila X, columna T de una tabla para cada T FIRST()

Si es nullable, ingresamos la producción en la fila X, columna T para cada T FOLLOW(X)

Page 118: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 118 Universidad Galileo

Ejemplo: Tabla de Parser Predictivo

nullable FIRST FOLLOW

X yes a c a c d

Y yes c a c d

Z no a c d

Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

a c d

X

Y

Z<Z> <X><Y><Z> <Z> <X><Y><Z>

<Z> d

<Z> <X><Y><Z>

Ingresamos la producción X en la fila X, columna T de una tabla para cada T FIRST()

Si es nullable, ingresamos la producción en la fila X, columna T para cada T FOLLOW(X)

Page 119: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 119 Universidad Galileo

Ejemplo: Tabla de Parser Predictivo

nullable FIRST FOLLOW

X yes a c a c d

Y yes c a c d

Z no a c d

Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

a c d

X

Y <Y> <Y> <Y>

Z<Z> <X><Y><Z> <Z> <X><Y><Z>

<Z> d

<Z> <X><Y><Z>

Ingresamos la producción X en la fila X, columna T de una tabla para cada T FIRST()

Si es nullable, ingresamos la producción en la fila X, columna T para cada T FOLLOW(X)

Page 120: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 120 Universidad Galileo

Ejemplo: Tabla de Parser Predictivo

nullable FIRST FOLLOW

X yes a c a c d

Y yes c a c d

Z no a c d

Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

a c d

X

Y <Y> <Y> <Y>

Z<Z> <X><Y><Z> <Z> <X><Y><Z>

<Z> d

<Z> <X><Y><Z>

Ingresamos la producción X en la fila X, columna T de una tabla para cada T FIRST()

Si es nullable, ingresamos la producción en la fila X, columna T para cada T FOLLOW(X)

Page 121: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 121 Universidad Galileo

Ejemplo: Tabla de Parser Predictivo

nullable FIRST FOLLOW

X yes a c a c d

Y yes c a c d

Z no a c d

Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

a c d

X

Y <Y> <Y> <Y> c

<Y>

Z<Z> <X><Y><Z> <Z> <X><Y><Z>

<Z> d

<Z> <X><Y><Z>

Ingresamos la producción X en la fila X, columna T de una tabla para cada T FIRST()

Si es nullable, ingresamos la producción en la fila X, columna T para cada T FOLLOW(X)

Page 122: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 122 Universidad Galileo

Ejemplo: Tabla de Parser Predictivo

nullable FIRST FOLLOW

X yes a c a c d

Y yes c a c d

Z no a c d

Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

a c d

X

Y <Y> <Y> <Y> c

<Y>

Z<Z> <X><Y><Z> <Z> <X><Y><Z>

<Z> d

<Z> <X><Y><Z>

Ingresamos la producción X en la fila X, columna T de una tabla para cada T FIRST()

Si es nullable, ingresamos la producción en la fila X, columna T para cada T FOLLOW(X)

Page 123: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 123 Universidad Galileo

Ejemplo: Tabla de Parser Predictivo

nullable FIRST FOLLOW

X yes a c a c d

Y yes c a c d

Z no a c d

Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

a c d

X

Y <Y> <Y> <Y> c

<Y>

Z<Z> <X><Y><Z> <Z> <X><Y><Z>

<Z> d

<Z> <X><Y><Z>

Ingresamos la producción X en la fila X, columna T de una tabla para cada T FIRST()

Si es nullable, ingresamos la producción en la fila X, columna T para cada T FOLLOW(X)

Page 124: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 124 Universidad Galileo

Ejemplo: Tabla de Parser Predictivo

nullable FIRST FOLLOW

X yes a c a c d

Y yes c a c d

Z no a c d

Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

a c d

X <X> <Y>

Y <Y> <Y> <Y> c

<Y>

Z<Z> <X><Y><Z> <Z> <X><Y><Z>

<Z> d

<Z> <X><Y><Z>

Ingresamos la producción X en la fila X, columna T de una tabla para cada T FIRST()

Si es nullable, ingresamos la producción en la fila X, columna T para cada T FOLLOW(X)

Page 125: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 125 Universidad Galileo

Ejemplo: Tabla de Parser Predictivo

nullable FIRST FOLLOW

X yes a c a c d

Y yes c a c d

Z no a c d

Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

a c d

X <X> <Y> <X> <Y> <X> <Y>

Y <Y> <Y> <Y> c

<Y>

Z<Z> <X><Y><Z> <Z> <X><Y><Z>

<Z> d

<Z> <X><Y><Z>

Ingresamos la producción X en la fila X, columna T de una tabla para cada T FIRST()

Si es nullable, ingresamos la producción en la fila X, columna T para cada T FOLLOW(X)

Page 126: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 126 Universidad Galileo

Ejemplo: Tabla de Parser Predictivo

nullable FIRST FOLLOW

X yes a c a c d

Y yes c a c d

Z no a c d

Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

a c d

X <X> <Y> <X> <Y> <X> <Y>

Y <Y> <Y> <Y> c

<Y>

Z<Z> <X><Y><Z> <Z> <X><Y><Z>

<Z> d

<Z> <X><Y><Z>

Ingresamos la producción X en la fila X, columna T de una tabla para cada T FIRST()

Si es nullable, ingresamos la producción en la fila X, columna T para cada T FOLLOW(X)

Page 127: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 127 Universidad Galileo

Ejemplo: Tabla de Parser Predictivo

nullable FIRST FOLLOW

X yes a c a c d

Y yes c a c d

Z no a c d

Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

a c d

X <X> <Y>

<X> a

<X> <Y> <X> <Y>

Y <Y> <Y> <Y> c

<Y>

Z<Z> <X><Y><Z> <Z> <X><Y><Z>

<Z> d

<Z> <X><Y><Z>

Ingresamos la producción X en la fila X, columna T de una tabla para cada T FIRST()

Si es nullable, ingresamos la producción en la fila X, columna T para cada T FOLLOW(X)

Page 128: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 128 Universidad Galileo

Ejemplo: Tabla de Parser Predictivo

nullable FIRST FOLLOW

X yes a c a c d

Y yes c a c d

Z no a c d

Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

a c d

X <X> <Y>

<X> a

<X> <Y> <X> <Y>

Y <Y> <Y> <Y> c

<Y>

Z<Z> <X><Y><Z> <Z> <X><Y><Z>

<Z> d

<Z> <X><Y><Z>

Ingresamos la producción X en la fila X, columna T de una tabla para cada T FIRST()

Si es nullable, ingresamos la producción en la fila X, columna T para cada T FOLLOW(X)

Page 129: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 129 Universidad Galileo

Ejemplo: Tabla de Parser Predictivo

nullable FIRST FOLLOW

X yes a c a c d

Y yes c a c d

Z no a c d

Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

a c d

X <X> <Y>

<X> a

<X> <Y> <X> <Y>

Y <Y> <Y> <Y> c

<Y>

Z<Z> <X><Y><Z> <Z> <X><Y><Z>

<Z> d

<Z> <X><Y><Z>

Ingresamos la producción X en la fila X, columna T de una tabla para cada T FIRST()

Si es nullable, ingresamos la producción en la fila X, columna T para cada T FOLLOW(X)

Page 130: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 130 Universidad Galileo

Ejemplo: Tabla de Parser Predictivo

nullable FIRST FOLLOW

X yes a c a c d

Y yes c a c d

Z no a c d

Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a

a c d

X <X> <Y>

<X> a

<X> <Y> <X> <Y>

Y <Y> <Y> <Y> c

<Y>

Z<Z> <X><Y><Z> <Z> <X><Y><Z>

<Z> d

<Z> <X><Y><Z>

Ingresamos la producción X en la fila X, columna T de una tabla para cada T FIRST()

Si es nullable, ingresamos la producción en la fila X, columna T para cada T FOLLOW(X)

¡¡Múltiples Entradas!!

Page 131: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 131 Universidad Galileo

Parsers Predictivos

• Los parsers predictivos sólo funcionan para gramáticas donde el primer símbolo terminal de cada subexpresión provee suficiente información para determinar qué producción usar.

• ¡La gramática que usamos es ambigua!

Page 132: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 132 Universidad Galileo

Gramáticas LL(1)

• A las gramáticas para las que la tabla de parseo de un parser predictivo no contiene entradas duplicadas se les llama LL(1)

• Si generalizamos la noción de FIRST para describir k tokens (en vez de 1), podemos construir una tabla de parseo LL(k)

• Esto casi no se hace ya que las tablas de parseo serían demasiado grandes.

Page 133: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 133 Universidad Galileo

Recursión Izquierda

• Si una gramática tiene recursión izquierda, no puede ser parseada por un parser predictivo

• Ejemplo:<E> <E> + <T><E> <T>

• Las gramáticas con recursión izquierda no son LL(1)

Page 134: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 134 Universidad Galileo

Eliminando Recursión Izquierda

• Para eliminar la recursión izquierda, podemos reescribir la gramática usando recursión derecha.

Page 135: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 135 Universidad Galileo

Ejemplo: Eliminando Recursión Izquierda

<E> <E> + <T><E> <T>

<E> <T><E’><E’> + <T><E’><E’>

Page 136: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 136 Universidad Galileo

Eliminando Recursión Izquierda

• En general, cuando tenemos producciones de la forma <X> <X> y <X> donde no comienza con <X>, sabemos que esto deriva strings de la forma *, así que la podemos reescribir usando recursión derecha.

11

22

11

22

<X> <X ><X> <X>

<X> <X ><X> <X>

<X > <X ><X>

<X > <X ><X>

<X >

Page 137: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 137 Universidad Galileo

Factorización Izquierda

• Un problema similar ocurre cuando dos producciones con el mismo no-terminal comienzan con el mismo símbolo.

• Ejemplo:<S> if <E> then <S> else <S><S> if <E> then <S>

• En este caso, podemos factorizar la gramática por la izquierda, es decir, tomar las terminaciones posibles y crear un nuevo no terminal <X> que las incluya.

Page 138: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 138 Universidad Galileo

Ejemplo: Factorización Izquierda

<S> if <E> then <S> else <S><S> if <E> then <S>

<S> if <E> then <S> <X><X> <X> else <S>

Nota: La gramática todavía es ambigua, pero las producciones resultantes no van a ser problema para un parser predictivo (podemos usar siempre la producción “else <S>”)

Page 139: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 139 Universidad Galileo

Resumen

• Parsers Predictivos

• Implementando un Parser

• Ejemplo de un Parser shift-reduce

• ¿Por qué es difícil construir un parser engine?

• LR(k) parser tables

• Construyendo un Parser Engine LR(0)

Page 140: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 140 Universidad Galileo

Implementando un Parser

• Técnicas diferentes– Cada una puede manejar distintas CFGs– Categorización de Técnicas

Page 141: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 141 Universidad Galileo

Implementando un Parser

• Técnicas diferentes– Cada una puede manejar distintas CFGs– Categorización de Técnicas

( )

Page 142: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 142 Universidad Galileo

Implementando un Parser

• Técnicas diferentes– Cada una puede manejar distintas CFGs– Categorización de Técnicas

( )

L – parsear de izquierda a derechaR – parsear de derecha a izquierda

Page 143: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 143 Universidad Galileo

Implementando un Parser

• Técnicas diferentes– Cada una puede manejar distintas CFGs– Categorización de Técnicas

( )

L - leftmost derivationR - rightmost derivation

Page 144: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 144 Universidad Galileo

Implementando un Parser

• Técnicas diferentes– Cada una puede manejar distintas CFGs– Categorización de Técnicas

( )

Número de caracteres de lookahead

Page 145: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 145 Universidad Galileo

Implementando un Parser

• Técnicas diferentes– Cada una puede manejar distintas CFGs– Categorización de Técnicas

– Ejemplos: LL(0), LR(1)

( )

Page 146: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 146 Universidad Galileo

Implementando un Parser

• Técnicas diferentes– Cada una puede manejar distintas CFGs– Categorización de Técnicas

– Ejemplos: LL(0), LR(1)

• Ya vimos parser LL(1)• Vamos a estudiar parsers LR(k)

( )L R k

Page 147: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 147 Universidad Galileo

Resumen

• Parsers Predictivos

• Implementando un Parser

• Ejemplo de un Parser shift-reduce

• ¿Por qué es difícil construir un parser engine?

• LR(k) parser tables

• Construyendo un Parser Engine LR(0)

Page 148: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 148 Universidad Galileo

Por qué usar un parser LR(k)

• Puede ser construido para que reconozca una gran gama de CFGs– Virtualmente todas las construcciones de los lenguajes de

programación

• Es el método más general de parseo que no necesita retroceder

• Se puede contruir un parser engine muy eficiente

• Puede detectar errores sintácticos tan pronto como es posible detectarlos

Page 149: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 149 Universidad Galileo

Veamos la implementación de un Parser

• Funcionamiento de un parser LR(k)

• parsea de izquierda a derecha

• rightmost derivation– Comenzamos con el string de entrada– Terminamos con el símbolo de inicio

Page 150: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 150 Universidad Galileo

Acciones de un Parser shift-reduce

Arbol deParseo

Page 151: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 151 Universidad Galileo

Acciones de un Parser shift-reduce

ParseTree

Arbol deParseo

Page 152: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 152 Universidad Galileo

Acciones de un Parser shift-reduce

ParseTree

Arbol deParseo

Page 153: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 153 Universidad Galileo

Acciones de un Parser shift-reduce

ParseTree

Arbol deParseo

Page 154: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 154 Universidad Galileo

Acciones de un Parser shift-reduce

ParseTree

Arbol deParseo

Page 155: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 155 Universidad Galileo

Acciones de un Parser shift-reduce

ParseTree

Arbol deParseo

Page 156: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 156 Universidad Galileo

Acciones de un Parser shift-reduce

ParseTree

Arbol deParseo

Page 157: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 157 Universidad Galileo

Acciones de un Parser shift-reduce

ParseTree

Arbol deParseo

Page 158: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 158 Universidad Galileo

Acciones de un Parser shift-reduce

Arbol deParseo

Page 159: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 159 Universidad Galileo

Acciones de un Parser shift-reduce

Arbol deParseo

Page 160: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 160 Universidad Galileo

Acciones de un Parser shift-reduce

Arbol deParseo

Page 161: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 161 Universidad Galileo

Acciones de un Parser shift-reduce

Arbol deParseo

Page 162: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 162 Universidad Galileo

Acciones de un Parser shift-reduce

• No podemos crear un sub-árbol de parseo completo

• Necesitamos la información del look ahead

• Por lo tanto, mantenemos estado

ParseTree

Page 163: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 163 Universidad Galileo

Acciones de un Parser shift-reduce

ParseTree

Est

ado

Act

ual

Page 164: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 164 Universidad Galileo

Acciones de un Parser shift-reduceS

tack

Símbolo Actual

stack

Acción

del P

arserParserEngine

Page 165: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 165 Universidad Galileo

Acciones de un Parser shift-reduce• Shift

– Shift del símbolo actual al top del stack– Movemos el pointer actual

• Reduce– Aplicamos una producción– El top del stack debe hacer match con el RHS– Eliminamos esos símbolos del stack– Agregamos los no-terminales del LHS

• Accept– Llegamos al final del stream de input &– El stack sólo tiene el símbolo de inicio

• Reject– Llegamos al final del stream de input, pero – El stack tiene más que el símbolo de inicio

Page 166: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 166 Universidad Galileo

Ejemplo: Parser Shift-Reduce

* ( + num )numnum

Page 167: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 167 Universidad Galileo

Ejemplo: Parser Shift-Reduce

* ( + num )numnum

Page 168: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 168 Universidad Galileo

Ejemplo: Parser Shift-Reduce

* ( + num )numnum

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> - <expr>

<expr> num

<op> +

<op> -

<op> *

Page 169: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 169 Universidad Galileo

Ejemplo: Parser Shift-Reduce

* ( + num )numnum

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> - <expr>

<expr> num

<op> +

<op> -

<op> *

Page 170: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 170 Universidad Galileo

Ejemplo: Parser Shift-Reduce

* ( + num )numnum

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> - <expr>

<expr> num

<op> +

<op> -

<op> *

Page 171: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 171 Universidad Galileo

Ejemplo: Parser Shift-Reduce

* ( + num )num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> - <expr>

<expr> num

<op> +

<op> -

<op> *

num

Page 172: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 172 Universidad Galileo

Ejemplo: Parser Shift-Reduce

* ( + num )numnum

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> - <expr>

<expr> num

<op> +

<op> -

<op> *num

SH

IFT

Page 173: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 173 Universidad Galileo

Ejemplo: Parser Shift-Reduce

* ( + num )numnum

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> - <expr>

<expr> num

<op> +

<op> -

<op> *num

Page 174: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 174 Universidad Galileo

Ejemplo: Parser Shift-Reduce

* ( + num )numnum

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> - <expr>

<expr> num

<op> +

<op> -

<op> *num

RE

DU

CE

Page 175: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 175 Universidad Galileo

Ejemplo: Parser Shift-Reduce

* ( + num )num

<expr> <expr> <expr><op> <op>

<expr>

<expr>

<expr>

num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> - <expr>

<expr> num

<op> +

<op> -

<op> *<expr>

RE

DU

CE

Page 176: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 176 Universidad Galileo

Ejemplo: Parser Shift-Reduce

* ( + num )num

<expr> <expr> <expr><op> <op>

<expr>

<expr>

<expr>

num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> - <expr>

<expr> num

<op> +

<op> -

<op> *<expr>

Page 177: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 177 Universidad Galileo

Ejemplo: Parser Shift-Reduce

( + num )num

<expr> <expr> <expr><op> <op>

<expr>

<expr>

<expr>

num *

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> - <expr>

<expr> num

<op> +

<op> -

<op> *

*

<expr>

SH

IFT

Page 178: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 178 Universidad Galileo

Ejemplo: Parser Shift-Reduce

( + num )num

<expr> <expr> <expr><op> <op>

<expr>

<expr>

<expr>

num *

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> - <expr>

<expr> num

<op> +

<op> -

<op> *

*

<expr>

Page 179: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 179 Universidad Galileo

Ejemplo: Parser Shift-Reduce

( + num )num

<expr> <expr> <expr><op> <op>

<expr>

<expr>

<expr>

num *

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> - <expr>

<expr> num

<op> +

<op> -

<op> *

*

<expr>

RE

DU

CE

Page 180: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 180 Universidad Galileo

Ejemplo: Parser Shift-Reduce

( + num )num

<expr> <expr> <expr><op> <op>

<expr>

<expr>

<expr>

num *

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> - <expr>

<expr> num

<op> +

<op> -

<op> *

<op>

<expr>

RE

DU

CE

Page 181: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 181 Universidad Galileo

(

Ejemplo: Parser Shift-Reduce

+ num )num

<expr> <expr> <expr><op> <op>

<expr>

<expr>

<expr>

num *

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> - <expr>

<expr> num

<op> +

<op> -

<op> *

<op>

<expr>

Page 182: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 182 Universidad Galileo

Ejemplo: Parser Shift-Reduce

+ num )num

<expr> <expr> <expr><op> <op>

<expr>

<expr>

<expr>

num * (

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> - <expr>

<expr> num

<op> +

<op> -

<op> *

<op>

(

<expr>

SH

IFT

Page 183: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 183 Universidad Galileo

Ejemplo: Parser Shift-Reduce

+ num )num

<expr> <expr> <expr><op> <op>

<expr>

<expr>

<expr>

num * (

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> - <expr>

<expr> num

<op> +

<op> -

<op> *

<op>

(

<expr>

Page 184: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 184 Universidad Galileo

Ejemplo: Parser Shift-Reduce

* + num )

<expr> <expr> <expr><op> <op>

<expr>

<expr>

<expr>

num ( num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> - <expr>

<expr> num

<op> +

<op> -

<op> *

<op>

(

num

<expr>

SH

IFT

Page 185: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 185 Universidad Galileo

Ejemplo: Parser Shift-Reduce

* + num )

<expr> <expr> <expr><op> <op>

<expr>

<expr>

<expr>

num ( num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> - <expr>

<expr> num

<op> +

<op> -

<op> *

<op>

(

num

<expr>

Page 186: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 186 Universidad Galileo

Ejemplo: Parser Shift-Reduce

* + num )

<expr> <expr> <expr><op> <op>

<expr>

<expr>

<expr>

num ( num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> - <expr>

<expr> num

<op> +

<op> -

<op> *

<op>

(

num

<expr>

RE

DU

CE

Page 187: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 187 Universidad Galileo

Ejemplo: Parser Shift-Reduce

* + num )

<expr> <expr> <expr><op> <op>

<expr>

<expr>

<expr>

num ( num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> - <expr>

<expr> num

<op> +

<op> -

<op> *

<op>

(

<expr>

<expr>

RE

DU

CE

Page 188: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 188 Universidad Galileo

+

Ejemplo: Parser Shift-Reduce

* num )

<expr> <expr> <expr><op> <op>

<expr>

<expr>

<expr>

num ( num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> - <expr>

<expr> num

<op> +

<op> -

<op> *

<op>

(

<expr>

<expr>

Page 189: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 189 Universidad Galileo

Ejemplo: Parser Shift-Reduce

* num )

<expr> <expr> <expr><op> <op>

<expr>

<expr>

<expr>

num ( num +

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> - <expr>

<expr> num

<op> +

<op> -

<op> *

<op>

(

<expr>

+

<expr>

SH

IFT

Page 190: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 190 Universidad Galileo

Ejemplo: Parser Shift-Reduce

* num )

<expr> <expr> <expr><op> <op>

<expr>

<expr>

<expr>

num ( num +

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> - <expr>

<expr> num

<op> +

<op> -

<op> *

<op>

(

<expr>

+

<expr>

Page 191: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 191 Universidad Galileo

Ejemplo: Parser Shift-Reduce

* num )

<expr> <expr> <expr><op> <op>

<expr>

<expr>

<expr>

num ( num +

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> - <expr>

<expr> num

<op> +

<op> -

<op> *

<op>

(

<expr>

+

<expr>

RE

DU

CE

Page 192: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 192 Universidad Galileo

Ejemplo: Parser Shift-Reduce

* num )

<expr> <expr> <expr><op> <op>

<expr>

<expr>

<expr>

num ( num +

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> - <expr>

<expr> num

<op> +

<op> -

<op> *

<op>

(

<expr>

<op>

<expr>

RE

DU

CE

Page 193: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 193 Universidad Galileo

num

Ejemplo: Parser Shift-Reduce

* )

<expr> <expr> <expr><op> <op>

<expr>

<expr>

<expr>

num ( num +

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> - <expr>

<expr> num

<op> +

<op> -

<op> *

<op>

(

<expr>

<op>

<expr>

Page 194: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 194 Universidad Galileo

Ejemplo: Parser Shift-Reduce

* )

<expr> <expr> <expr><op> <op>

<expr>

<expr>

<expr>

num ( num + num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> - <expr>

<expr> num

<op> +

<op> -

<op> *

<op>

(

<expr>

<op>

num

<expr>

SH

IFT

Page 195: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 195 Universidad Galileo

Ejemplo: Parser Shift-Reduce

* )

<expr> <expr> <expr><op> <op>

<expr>

<expr>

<expr>

num ( num + num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> - <expr>

<expr> num

<op> +

<op> -

<op> *

<op>

(

<expr>

<op>

num

<expr>

Page 196: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 196 Universidad Galileo

Ejemplo: Parser Shift-Reduce

* )

<expr> <expr> <expr><op> <op>

<expr>

<expr>

<expr>

num ( num + num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> - <expr>

<expr> num

<op> +

<op> -

<op> *

<op>

(

<expr>

<op>

num

<expr>

RE

DU

CE

Page 197: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 197 Universidad Galileo

Ejemplo: Parser Shift-Reduce

* )

<expr> <expr> <expr><op> <op>

<expr>

<expr>

<expr>

num ( num + num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> - <expr>

<expr> num

<op> +

<op> -

<op> *

<op>

(

<expr>

<op>

<expr>

<expr>

RE

DU

CE

Page 198: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 198 Universidad Galileo

Ejemplo: Parser Shift-Reduce

* )

<expr> <op>

<expr>

<expr>

<expr>

num ( num + num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> - <expr>

<expr> num

<op> +

<op> -

<op> *

<op>

(

<expr>

<op>

<expr>

<expr>

<op><expr> <expr>

Page 199: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 199 Universidad Galileo

Ejemplo: Parser Shift-Reduce

* )

<expr> <expr> <expr><op> <op>

<expr>

<expr>

<expr>

num ( num + num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> - <expr>

<expr> num

<op> +

<op> -

<op> *

<op>

(

<expr>

<op>

<expr>

<expr>

RE

DU

CE

Page 200: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 200 Universidad Galileo

Ejemplo: Parser Shift-Reduce

* )

<expr> <expr> <expr><op> <op>

<expr>

<expr>

num ( num + num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> - <expr>

<expr> num

<op> +

<op> -

<op> *

<op>

(

<expr>

<expr>

<expr>

RE

DU

CE

Page 201: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 201 Universidad Galileo

Ejemplo: Parser Shift-Reduce

* )

<expr> <expr> <expr><op> <op>

<expr>

<expr>

<expr>

num ( num + num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> - <expr>

<expr> num

<op> +

<op> -

<op> *

<op>

(

<expr>

<expr>

Page 202: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 202 Universidad Galileo

Ejemplo: Parser Shift-Reduce

* )

<expr> <expr> <expr><op> <op>

<expr>

<expr>

<expr>

num ( num + num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> - <expr>

<expr> num

<op> +

<op> -

<op> *

<op>

(

<expr>

)

<expr>

SH

IFT

Page 203: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 203 Universidad Galileo

Ejemplo: Parser Shift-Reduce

* )

<expr> <expr> <expr><op> <op>

<expr>

<expr>

<expr>

num ( num + num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> - <expr>

<expr> num

<op> +

<op> -

<op> *

<op>

(

<expr>

)

<expr>

Page 204: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 204 Universidad Galileo

Ejemplo: Parser Shift-Reduce

* )

<expr> <expr> <expr><op> <op>

<expr>

<expr>

<expr>

num ( num + num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> - <expr>

<expr> num

<op> +

<op> -

<op> *

<op>

(

<expr>

)

<expr>

RE

DU

CE

Page 205: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 205 Universidad Galileo

Ejemplo: Parser Shift-Reduce

* )

<expr> <expr> <expr><op> <op>

<expr>

num ( num + num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> - <expr>

<expr> num

<op> +

<op> -

<op> *

<op>

<expr>

<expr>

<expr>

<expr>

RE

DU

CE

Page 206: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 206 Universidad Galileo

Ejemplo: Parser Shift-Reduce

* )

<expr> <expr> <expr><op> <op>

<expr>

<expr>

<expr>

num ( num + num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> - <expr>

<expr> num

<op> +

<op> -

<op> *

<op>

<expr>

<expr>

Page 207: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 207 Universidad Galileo

Ejemplo: Parser Shift-Reduce

* )

<expr> <expr> <expr><op> <op>

<expr>

<expr>

<expr>

num ( num + num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> - <expr>

<expr> num

<op> +

<op> -

<op> *

<op>

<expr>

<expr>

RE

DU

CE

Page 208: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 208 Universidad Galileo

Ejemplo: Parser Shift-Reduce

* )

<expr> <expr> <expr><op> <op>

<expr>

<expr>

num ( num + num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> - <expr>

<expr> num

<op> +

<op> -

<op> *<expr>

<expr>

RE

DU

CE

Page 209: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 209 Universidad Galileo

Ejemplo: Parser Shift-Reduce

* )

<expr> <expr> <expr><op> <op>

<expr>

<expr>

num ( num + num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> - <expr>

<expr> num

<op> +

<op> -

<op> *<expr>

<expr>

Page 210: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 210 Universidad Galileo

Ejemplo: Parser Shift-Reduce

* )

<expr> <expr> <expr><op> <op>

<expr>

<expr>

num ( num + num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> - <expr>

<expr> num

<op> +

<op> -

<op> *<expr>

<expr>

AC

CE

PT

Page 211: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 211 Universidad Galileo

¿Qúe hace el parser engine?

• Si los símbolos en el top del stack hacen match con el RHS de una producción, hacemos la reducción– Pop del RHS del top del stack– Push del símbolo del LHS al stack

• Si no se encuentra ninguna producción, se hace un shift– push del input actual al stack

• Si el input está vacío– accept si en el stack sólo está el símbolo de inicio– reject en cualquier otro caso

ParserEngine

Page 212: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 212 Universidad Galileo

Resumen

• Parsers Predictivos

• Implementando un Parser

• Ejemplo de un Parser shift-reduce

• ¿Por qué es difícil construir un Parser Engine?

• LR(k) parser tables

• Construyendo un Parser Engine LR(0)

Page 213: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 213 Universidad Galileo

¿Qúe hace el parser engine?

• Si los símbolos en el top del stack hacen match con el RHS de una producción, hacemos la reducción– Pop del RHS del top del stack– Push del símbolo del LHS al stack

• Si no se encuentra ninguna producción, se hace un shift– push del input actual al stack

• Si el input está vacío– accept si en el stack sólo está el símbolo de inicio– reject en cualquier otro caso

ParserEngine

Page 214: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 214 Universidad Galileo

¡No es tan simple!

• Muchas opciones para reducir– Match con múltiples RHS

• Elección entre shift y reduce– Stack contiene un RHS– Pero puede ser que reducir no sea lo más adecuado– Puede ser que si hacemos shift del input, después

encontremos una reducción distinta

Page 215: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 215 Universidad Galileo

Ejemplo: Parser Shift-Reduce

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> - <expr>

<expr> num

<op> +

<op> -

<op> *

•Un cambio en la gramática

Page 216: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 216 Universidad Galileo

Ejemplo: Parser Shift-Reduce

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> - <expr>

<expr> num

<op> +

<op> -

<op> *

•Un cambio en la gramática

Page 217: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 217 Universidad Galileo

Ejemplo: Parser Shift-Reduce

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> <expr> -<expr> num

<op> +

<op> -

<op> *

•Un cambio en la gramática

Page 218: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 218 Universidad Galileo

Ejemplo: Parser Shift-Reduce

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> <expr> -<expr> num

<op> +

<op> -

<op> *

•Un cambio en la gramática

Page 219: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 219 Universidad Galileo

Ejemplo: Parser Shift-Reduce

- numnum

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> <expr> -

<expr> num

<op> +

<op> -

<op> *

Page 220: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 220 Universidad Galileo

Ejemplo: Parser Shift-Reduce

- num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> <expr> -

<expr> num

<op> +

<op> -

<op> *

num

Page 221: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 221 Universidad Galileo

num

Ejemplo: Parser Shift-Reduce

- num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> <expr> -

<expr> num

<op> +

<op> -

<op> *

numnum

SH

IFT

Page 222: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 222 Universidad Galileo

num

Ejemplo: Parser Shift-Reduce

- num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> <expr> -

<expr> num

<op> +

<op> -

<op> *

numnum

Page 223: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 223 Universidad Galileo

num

Ejemplo: Parser Shift-Reduce

- num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> <expr> -

<expr> num

<op> +

<op> -

<op> *

numnum

RE

DU

CE

Page 224: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 224 Universidad Galileo

<expr>

Ejemplo: Parser Shift-Reduce

- num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> <expr> -

<expr> num

<op> +

<op> -

<op> *

numnum

RE

DU

CE

<expr>

Page 225: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 225 Universidad Galileo

<expr>

Ejemplo: Parser Shift-Reduce

- num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> <expr> -

<expr> num

<op> +

<op> -

<op> *

numnum

<expr>

Page 226: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 226 Universidad Galileo

-<expr>

Ejemplo: Parser Shift-Reduce

num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> <expr> -

<expr> num

<op> +

<op> -

<op> *

numnum -

<op><expr>

SH

IFT

Page 227: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 227 Universidad Galileo

-<expr>

Ejemplo: Parser Shift-Reduce

num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> <expr> -

<expr> num

<op> +

<op> -

<op> *

numnum -

<op><expr>

Page 228: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 228 Universidad Galileo

-<expr>

Ejemplo: Parser Shift-Reduce

num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> <expr> -

<expr> num

<op> +

<op> -

<op> *

numnum -

¡¡¡Tenemos elección!!!<op><expr>

RE

DU

CE

Page 229: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 229 Universidad Galileo

-<expr>

Ejemplo: Parser Shift-Reduce

num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> <expr> -

<expr> num

<op> +

<op> -

<op> *

numnum -

¡¡Pero esto no es lo correcto!!<op><expr>

RE

DU

CE

Page 230: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 230 Universidad Galileo

<expr>

Ejemplo: Parser Shift-Reduce

num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> <expr> -

<expr> num

<op> +

<op> -

<op> *

numnum -

¡¡Pero esto no es lo correcto!!<expr>

<expr>

RE

DU

CE

Page 231: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 231 Universidad Galileo

<expr>

Ejemplo: Parser Shift-Reduce

num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> <expr> -

<expr> num

<op> +

<op> -

<op> *

numnum -

¡¡Pero esto no es lo correcto!!<expr>

<expr>

Page 232: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 232 Universidad Galileo

num

<expr>

Ejemplo: Parser Shift-Reduce

num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> <expr> -

<expr> num

<op> +

<op> -

<op> *

numnum -

¡¡Pero esto no es lo correcto!!<expr>

<expr>

SH

IFT

Page 233: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 233 Universidad Galileo

num

<expr>

Ejemplo: Parser Shift-Reduce

num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> <expr> -

<expr> num

<op> +

<op> -

<op> *

numnum -

¡¡Pero esto no es lo correcto!!<expr>

<expr>

Page 234: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 234 Universidad Galileo

num

<expr>

Ejemplo: Parser Shift-Reduce

num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> <expr> -

<expr> num

<op> +

<op> -

<op> *

numnum -

¡¡Pero esto no es lo correcto!!<expr>

<expr>

RE

DU

CE

Page 235: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 235 Universidad Galileo

<expr>

<expr>

Ejemplo: Parser Shift-Reduce

num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> <expr> -

<expr> num

<op> +

<op> -

<op> *

numnum -

¡¡Pero esto no es lo correcto!!<expr>

<expr>

<expr>

RE

DU

CE

Page 236: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 236 Universidad Galileo

<expr>

<expr>

Ejemplo: Parser Shift-Reduce

num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> <expr> -

<expr> num

<op> +

<op> -

<op> *

numnum -

¡¡Pero esto no es lo correcto!!<expr>

<expr>

<expr>

Page 237: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 237 Universidad Galileo

<expr>

<expr>

Ejemplo: Parser Shift-Reduce

num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> <expr> -

<expr> num

<op> +

<op> -

<op> *

numnum -

¡¡Pero esto no es lo correcto!! ¡¡No hay más acciones!!

<expr>

<expr>

<expr>

ER

RO

R

Page 238: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 238 Universidad Galileo

Ejemplo: Parser Shift-Reduce

numnumnum -

• Pero este input es perfectamente válido para la gramática

• Elegimos la producción equivocada

• Veamos cuál es la producción apropiada

Page 239: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 239 Universidad Galileo

-<expr>

Ejemplo: Parser Shift-Reduce

num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> <expr> -

<expr> num

<op> +

<op> -

<op> *

numnum -

Tenemos elección<op><expr>

RE

DU

CE

El paso anterior a nuestro error

Page 240: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 240 Universidad Galileo

-<expr>

Ejemplo: Parser Shift-Reduce

num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> <expr> -

<expr> num

<op> +

<op> -

<op> *

numnum -

Usamos laotra producción

<op><expr>

RE

DU

CE

Page 241: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 241 Universidad Galileo

<op>

<expr>

Ejemplo: Parser Shift-Reduce

num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> <expr> -

<expr> num

<op> +

<op> -

<op> *

numnum -

<expr>

RE

DU

CE

<op> Usamos laotra producción

Page 242: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 242 Universidad Galileo

<op>

<expr>

Ejemplo: Parser Shift-Reduce

num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> <expr> -

<expr> num

<op> +

<op> -

<op> *

numnum -

<expr> <op>

Page 243: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 243 Universidad Galileo

num

<op>

<expr>

Ejemplo: Parser Shift-Reduce

num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> <expr> -

<expr> num

<op> +

<op> -

<op> *

numnum -

<expr> <op>

SH

IFT

Page 244: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 244 Universidad Galileo

num

<op>

<expr>

Ejemplo: Parser Shift-Reduce

num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> <expr> -

<expr> num

<op> +

<op> -

<op> *

numnum -

<expr> <op>

Page 245: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 245 Universidad Galileo

num

<op>

<expr>

Ejemplo: Parser Shift-Reduce

num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> <expr> -

<expr> num

<op> +

<op> -

<op> *

numnum -

<expr> <op>

RE

DU

CE

Page 246: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 246 Universidad Galileo

<expr>

<op>

<expr>

Ejemplo: Parser Shift-Reduce

num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> <expr> -

<expr> num

<op> +

<op> -

<op> *

numnum -

<expr> <op>

RE

DU

CE

<expr>

Page 247: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 247 Universidad Galileo

<expr>

<op>

<expr>

Ejemplo: Parser Shift-Reduce

num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> <expr> -

<expr> num

<op> +

<op> -

<op> *

numnum -

<expr> <op> <expr>

Page 248: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 248 Universidad Galileo

<expr>

<op>

<expr>

Ejemplo: Parser Shift-Reduce

num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> <expr> -

<expr> num

<op> +

<op> -

<op> *

numnum -

<expr> <op> <expr>

RE

DU

CE

Page 249: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 249 Universidad Galileo

<expr>

Ejemplo: Parser Shift-Reduce

num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> <expr> -

<expr> num

<op> +

<op> -

<op> *

numnum -

<expr> <op> <expr>

RE

DU

CE

<expr>

Page 250: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 250 Universidad Galileo

<expr>

Ejemplo: Parser Shift-Reduce

num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> <expr> -

<expr> num

<op> +

<op> -

<op> *

numnum -

<expr> <op> <expr>

<expr>

Page 251: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 251 Universidad Galileo

<expr>

Ejemplo: Parser Shift-Reduce

num

<expr> <expr> <op> <expr>

<expr> ( <expr> )

<expr> <expr> -

<expr> num

<op> +

<op> -

<op> *

numnum -

<expr> <op> <expr>

<expr>

AC

CE

PT

Page 252: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 252 Universidad Galileo

¡No es tan simple!

• Muchas opciones para reducir– Match con múltiples RHS

• Elección entre shift y reduce– Stack contiene un RHS– Pero puede ser que reducir no sea lo más adecuado– Puede ser que si hacemos shift del input después

encontremos una reducción distinta

• Mantenemos información adicional

Page 253: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 253 Universidad Galileo

Resumen

• Parsers Predictivos

• Implementando un Parser

• Ejemplo de un Parser shift-reduce

• ¿Por qué es difícil construir un Parser Engine?

• LR(k) parser tables

• Construyendo un Parser Engine LR(0)

Page 254: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 254 Universidad Galileo

Construyendo un Parser LR(k)

• Vamos a construir unos cuantos parsers LR(k)– LR(0), – SLR (o simple LR)– LR(1)

Page 255: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 255 Universidad Galileo

Construyendo un Parser LR(k)

• Vamos a construir unos cuantos parsers LR(k)– LR(0), – SLR (o simple LR)– LR(1)

• Ya seguimos las acciones del parseo

• ¿Qué hay en el parse engine?– elegir entre shift y reduce– elegir la reducción correcta

Page 256: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 256 Universidad Galileo

Acciones de un Parser Shift-ReduceS

tack

Símbolo Actual

stack

Acción

del P

arserParserEngine

Page 257: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 257 Universidad Galileo

Construyendo un Parser LR(k)

• Creamos un DFA – Codifica todos los posibles estados en que puede estar

el parser– Ocurre una transición de estado del DFA en terminales

y no-terminales

• Creamos una Tabla de Parseo– Guarda que acción debe ser tomada a partir del estado

actual y el símbolo de entrada actual

• Mantenemos un stack de estados– En paralelo con el stack de símbolos

Page 258: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 258 Universidad Galileo

LR(k) Parser Engine

Símbolo Actual

Acción

del P

arser

LR(k)ParserEngine

Sta

ck d

e S

ímb

olos

Sta

ck d

e E

stad

os

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 259: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 259 Universidad Galileo

Tablas de Parseo

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)

• Buscamos – [top del stack de estados]

– [ símbolo de entrada]

en la tabla de parseo• Ejecutamos la acción descrita

Page 260: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 260 Universidad Galileo

Tablas de Parseo

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)

• Shift to sn– Push del token de entrada en el stack de símbolos– Push sn en el stack de estados– Avanzamos al siguiente símbolo de entrada

Page 261: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 261 Universidad Galileo

Tablas de Parseo

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)

• Reduce (n)– Pop de ambos stacks tantas veces como el número de

símbolos en el RHS de la regla n – Push LHS de la regla n en el stack de símbolos– Buscar [top del stack de estados][top del stack de símbolos]– Push de ese estado (en goto k) en el stack de estados

Page 262: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 262 Universidad Galileo

Tablas de Parseo

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)

• Accept– Dejar de parsear y reportar éxito

Page 263: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 263 Universidad Galileo

Tablas de Parseo

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)

• Error– Dejar de parsear y reportar Error

Page 264: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 264 Universidad Galileo

Ejemplo LR

• La gramática

<S> <X> $ (1)

<X> ( <X> ) (2)

<X> ( ) (3)

Page 265: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 265 Universidad Galileo

Pregunta

• La gramática

<S> <X> $ (1)

<X> ( <X> ) (2)

<X> ( ) (3)

• ¿Cuál es el lenguaje aceptado por esta CFG?

Page 266: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 266 Universidad Galileo

Tabla de Parseo en Acción• La gramática

<S> <X> $ (1)

<X> ( <X> ) (2)

<X> ( ) (3)

Page 267: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 267 Universidad Galileo

Tabla de Parseo en Acción

• Tabla de Acciones• La gramática

<S> <X> $ (1)

<X> ( <X> ) (2)

<X> ( ) (3)ACTION Goto

State ( ) $ 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 268: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 268 Universidad Galileo

Tabla de Parseo en Acción

• Tabla de Acciones• La gramática

<S> <X> $ (1)

<X> ( <X> ) (2)

<X> ( ) (3)

$

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 269: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 269 Universidad Galileo

Tabla de Parseo en Acción

• Tabla de Acciones• La gramática

<S> <X> $ (1)

<X> ( <X> ) (2)

<X> ( ) (3)

s0 $

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 270: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 270 Universidad Galileo

Tabla de Parseo en Acción

• Tabla de Acciones• La gramática

<S> <X> $ (1)

<X> ( <X> ) (2)

<X> ( ) (3)

s0 $

)( ( )

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 271: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 271 Universidad Galileo

Tabla de Parseo en Acción

• Tabla de Acciones• La gramática

<S> <X> $ (1)

<X> ( <X> ) (2)

<X> ( ) (3)

s0 $

)( )(

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 272: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 272 Universidad Galileo

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)

Tabla de Parseo en Acción

• Tabla de Acciones• La gramática

<S> <X> $ (1)

<X> ( <X> ) (2)

<X> ( ) (3)

s0 $

)( )( $

Page 273: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 273 Universidad Galileo

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)

Tabla de Parseo en Acción

• Tabla de Acciones• La gramática

<S> <X> $ (1)

<X> ( <X> ) (2)

<X> ( ) (3)

s0 $

)( )( $

Page 274: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 274 Universidad Galileo

(

s2 (

Tabla de Parseo en Acción

• Tabla de Acciones• La gramática

<S> <X> $ (1)

<X> ( <X> ) (2)

<X> ( ) (3)

s0 $

))(

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 275: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 275 Universidad Galileo

s2 (

Tabla de Parseo en Acción

• Tabla de Acciones• La gramática

<S> <X> $ (1)

<X> ( <X> ) (2)

<X> ( ) (3)

s0 $

))( (

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 276: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 276 Universidad Galileo

s2 (

Tabla de Parseo en Acción

• Tabla de Acciones• La gramática

<S> <X> $ (1)

<X> ( <X> ) (2)

<X> ( ) (3)

s0 $

))( (

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 277: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 277 Universidad Galileo

s2 (

Tabla de Parseo en Acción

• Tabla de Acciones• La gramática

<S> <X> $ (1)

<X> ( <X> ) (2)

<X> ( ) (3)

s0 $

))( (

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 278: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 278 Universidad Galileo

s2 (s2 (

Tabla de Parseo en Acción

• Tabla de Acciones• La gramática

<S> <X> $ (1)

<X> ( <X> ) (2)

<X> ( ) (3)

s0 $

))( (

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 279: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 279 Universidad Galileo

s2 (s2 (

Tabla de Parseo en Acción

• Tabla de Acciones• La gramática

<S> <X> $ (1)

<X> ( <X> ) (2)

<X> ( ) (3)

s0 $

)( ( )

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 280: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 280 Universidad Galileo

s2 (s2 (

Tabla de Parseo en Acción

• Tabla de Acciones• La gramática

<S> <X> $ (1)

<X> ( <X> ) (2)

<X> ( ) (3)

s0 $

)( ( )

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 281: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 281 Universidad Galileo

s2 (s2 (

Tabla de Parseo en Acción

• Tabla de Acciones• La gramática

<S> <X> $ (1)

<X> ( <X> ) (2)

<X> ( ) (3)

s0 $

)( ( )

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 282: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 282 Universidad Galileo

s5 )s2 (s2 (

Tabla de Parseo en Acción

• Tabla de Acciones• La gramática

<S> <X> $ (1)

<X> ( <X> ) (2)

<X> ( ) (3)

s0 $

)( ( )

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 283: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 283 Universidad Galileo

s5 )s2 (s2 (

Tabla de Parseo en Acción

• Tabla de Acciones• La gramática

<S> <X> $ (1)

<X> ( <X> ) (2)

<X> ( ) (3)

s0 $

)( ( )

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 284: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 284 Universidad Galileo

s5 )s2 (s2 (

Tabla de Parseo en Acción

• Tabla de Acciones• La gramática

<S> <X> $ (1)

<X> ( <X> ) (2)

<X> ( ) (3)

s0 $

)( ( )

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 285: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 285 Universidad Galileo

s5 )s2 (s2 (

Tabla de Parseo en Acción

• Tabla de Acciones• La gramática

<S> <X> $ (1)

<X> ( <X> ) (2)

<X> ( ) (3)

s0 $

)( ( )

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 286: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 286 Universidad Galileo

s5 )s2 (s2 (

Tabla de Parseo en Acción

• Tabla de Acciones• La gramática

<S> <X> $ (1)

<X> ( <X> ) (2)

<X> ( ) (3)

s0 $

)( ( )

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 287: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 287 Universidad Galileo

s5 )s2 (s2 (

Tabla de Parseo en Acción

• Tabla de Acciones• La gramática

<S> <X> $ (1)

<X> ( <X> ) (2)

<X> ( ) (3)

s0 $

)( ( )

s5 )s2 (

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 288: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 288 Universidad Galileo

Xs2 (

Tabla de Parseo en Acción

• Tabla de Acciones• La gramática

<S> <X> $ (1)

<X> ( <X> ) (2)

<X> ( ) (3)

s0 $

)( ( )

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 289: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 289 Universidad Galileo

Xs2 (

Tabla de Parseo en Acción

• Tabla de Acciones• La gramática

<S> <X> $ (1)

<X> ( <X> ) (2)

<X> ( ) (3)

s0 $

)( ( )

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 290: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 290 Universidad Galileo

Xs2 (

Tabla de Parseo en Acción

• Tabla de Acciones• La gramática

<S> <X> $ (1)

<X> ( <X> ) (2)

<X> ( ) (3)

s0 $

)( ( )

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 291: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 291 Universidad Galileo

s3 Xs2 (

Tabla de Parseo en Acción

• Tabla de Acciones• La gramática

<S> <X> $ (1)

<X> ( <X> ) (2)

<X> ( ) (3)

s0 $

)( ( )

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 292: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 292 Universidad Galileo

s3 Xs2 (

Tabla de Parseo en Acción

• Tabla de Acciones• La gramática

<S> <X> $ (1)

<X> ( <X> ) (2)

<X> ( ) (3)

s0 $

)( ( )

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 293: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 293 Universidad Galileo

s3 Xs2 (

Tabla de Parseo en Acción

• Tabla de Acciones• La gramática

<S> <X> $ (1)

<X> ( <X> ) (2)

<X> ( ) (3)

s0 $

)( ( )

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 294: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 294 Universidad Galileo

s3 Xs2 (

Tabla de Parseo en Acción

• Tabla de Acciones• La gramática

<S> <X> $ (1)

<X> ( <X> ) (2)

<X> ( ) (3)

s0 $

)( ( )

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 295: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 295 Universidad Galileo

s4 )s3 Xs2 (

Tabla de Parseo en Acción

• Tabla de Acciones• La gramática

<S> <X> $ (1)

<X> ( <X> ) (2)

<X> ( ) (3)

s0 $

)( ( )

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 296: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 296 Universidad Galileo

s4 )s3 Xs2 (

Tabla de Parseo en Acción

• Tabla de Acciones• La gramática

<S> <X> $ (1)

<X> ( <X> ) (2)

<X> ( ) (3)

s0 $

)( ( )

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 297: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 297 Universidad Galileo

s4 )s3 Xs2 (

Tabla de Parseo en Acción

• Tabla de Acciones• La gramática

<S> <X> $ (1)

<X> ( <X> ) (2)

<X> ( ) (3)

s0 $

)( ( )

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 298: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 298 Universidad Galileo

s4 )s3 Xs2 (

Tabla de Parseo en Acción

• Tabla de Acciones• La gramática

<S> <X> $ (1)

<X> ( <X> ) (2)

<X> ( ) (3)

s0 $

)( ( )

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 299: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 299 Universidad Galileo

s4 )s3 Xs2 (

Tabla de Parseo en Acción

• Tabla de Acciones• La gramática

<S> <X> $ (1)

<X> ( <X> ) (2)

<X> ( ) (3)

s0 $

)( ( )

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)

$

s4 )s3 Xs2 (

Page 300: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 300 Universidad Galileo

X

Tabla de Parseo en Acción

• Tabla de Acciones• La gramática

<S> <X> $ (1)

<X> ( <X> ) (2)

<X> ( ) (3)

s0 $

)( ( )

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 301: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 301 Universidad Galileo

X

Tabla de Parseo en Acción

• Tabla de Acciones• La gramática

<S> <X> $ (1)

<X> ( <X> ) (2)

<X> ( ) (3)

s0 $

)( ( )

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 302: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 302 Universidad Galileo

X

Tabla de Parseo en Acción

• Tabla de Acciones• La gramática

<S> <X> $ (1)

<X> ( <X> ) (2)

<X> ( ) (3)

s0 $

)( ( )

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 303: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 303 Universidad Galileo

s1 X

Tabla de Parseo en Acción

• Tabla de Acciones• La gramática

<S> <X> $ (1)

<X> ( <X> ) (2)

<X> ( ) (3)

s0 $

)( ( )

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 304: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 304 Universidad Galileo

s1 X

Tabla de Parseo en Acción

• Tabla de Acciones• La gramática

<S> <X> $ (1)

<X> ( <X> ) (2)

<X> ( ) (3)

s0 $

)( ( )

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 305: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 305 Universidad Galileo

s1 X

Tabla de Parseo en Acción

• Tabla de Acciones• La gramática

<S> <X> $ (1)

<X> ( <X> ) (2)

<X> ( ) (3)

s0 $

)( ( )

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 306: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 306 Universidad Galileo

s1 X

Tabla de Parseo en Acción

• Tabla de Acciones• La gramática

<S> <X> $ (1)

<X> ( <X> ) (2)

<X> ( ) (3)

s0 $

)( ( )

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)

$

Accept

Page 307: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 307 Universidad Galileo

Resumen

• Parsers Predictivos

• Implementando un Parser

• Ejemplo de un Parser shift-reduce

• ¿Por qué es difícil construir un Parser Engine?

• LR(k) parser tables

• Construyendo un Parser Engine LR(0)

Page 308: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 308 Universidad Galileo

Items LR(0)

• Tenemos que capturar cuánto de una producción hemos escaneado hasta ahora

<X> ( <X> )

¿Estamos aquí? ¿o aquí? ¿o aquí? ¿o aquí?

Page 309: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 309 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 310: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 310 Universidad Galileo

Ejemplo de Items

• 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 311: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 311 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 312: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 312 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 313: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 313 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 314: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 314 Universidad Galileo

Pregunta: Encuentren Closure

• Encuentren closure(<S> • <X> $ ) • Items<S> • <X> $<S> <X> • $<X> • ( <X> ) <X> ( • <X> )<X> ( <X> • )<X> ( <X> ) •<X> • ( )<X> ( • )<X> ( ) •

????

Page 315: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 315 Universidad Galileo

Pregunta: Encuentren Closure

• Encuentren closure(<S> • <X> $ ) • Items<S> • <X> $<S> <X> • $<X> • ( <X> ) <X> ( • <X> )<X> ( <X> • )<X> ( <X> ) •<X> • ( )<X> ( • )<X> ( ) •

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

Page 316: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 316 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 317: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 317 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 318: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 318 Universidad Galileo

Pregunta: Encuentren goto

• Encuentren goto(<X> • ( <X> ), ( ) Items<S> • <X> $<S> <X> • $<X> • ( <X> ) <X> ( • <X> )<X> ( <X> • )<X> ( <X> ) •<X> • ( )<X> ( • )<X> ( ) •

????

Page 319: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 319 Universidad Galileo

Pregunta: Encuentren goto

• Encuentren goto(<X> • ( <X> ), ( ) Items<S> • <X> $<S> <X> • $<X> • ( <X> ) <X> ( • <X> )<X> ( <X> • )<X> ( <X> ) •<X> • ( )<X> ( • )<X> ( ) •

<X> ( • <X> ) <X> • ( <X> )<X> • ( )

Page 320: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 320 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 321: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 321 Universidad Galileo

Ejemplo de construcción de los estados del DFAComenzar con la producción <S’> • <S> $Crear el primer estado como closure(<S’> • <S> $)Elegir un estado I

Para cada A • X en Iencontrar goto(I, X)si goto(I, X) no es ya un estado, crear unoAgregar una arista X del estado I al estado goto(I, X)

Repetir hasta que no sea posible agregar nada más

Page 322: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 322 Universidad Galileo

Ejemplo de construcción de los estados del DFAComenzar con la producción <S’> • <S> $Crear el primer estado como closure(<S’> • <S> $)Elegir un estado I

Para cada A • X en Iencontrar goto(I, X)si goto(I, X) no es ya un estado, crear unoAgregar una arista X del estado I al estado goto(I, X)

Repetir hasta que no sea posible agregar nada más

Page 323: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 323 Universidad Galileo

<S> • <X> $

Ejemplo de construcción de los estados del DFAComenzar con la producción <S’> • <S> $Crear el primer estado como closure(<S’> • <S> $)Elegir un estado I

Para cada A • X en Iencontrar goto(I, X)si goto(I, X) no es ya un estado, crear unoAgregar una arista X del estado I al estado goto(I, X)

Repetir hasta que no sea posible agregar nada más

Page 324: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 324 Universidad Galileo

Ejemplo de construcción de los estados del DFAComenzar con la producción <S’> • <S> $Crear el primer estado como closure(<S’> • <S> $)Elegir un estado I

Para cada A • X en Iencontrar goto(I, X)si goto(I, X) no es ya un estado, crear unoAgregar una arista X del estado I al estado goto(I, X)

Repetir hasta que no sea posible agregar nada más

<S> • <X> $

Page 325: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 325 Universidad Galileo

Ejemplo de construcción de los estados del DFAComenzar con la producción <S’> • <S> $Crear el primer estado como closure(<S’> • <S> $)Elegir un estado I

Para cada A • X en Iencontrar goto(I, X)si goto(I, X) no es ya un estado, crear unoAgregar una arista X del estado I al estado goto(I, X)

Repetir hasta que no sea posible agregar nada más

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

Page 326: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 326 Universidad Galileo

Ejemplo de construcción de los estados del DFAComenzar con la producción <S’> • <S> $Crear el primer estado como closure(<S’> • <S> $)Elegir un estado I

Para cada A • X en Iencontrar goto(I, X)si goto(I, X) no es ya un estado, crear unoAgregar una arista X del estado I al estado goto(I, X)

Repetir hasta que no sea posible agregar nada más

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

s0

Page 327: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 327 Universidad Galileo

Ejemplo de construcción de los estados del DFAComenzar con la producción <S’> • <S> $Crear el primer estado como closure(<S’> • <S> $)Elegir un estado I

Para cada A • X en Iencontrar goto(I, X)si goto(I, X) no es ya un estado, crear unoAgregar una arista X del estado I al estado goto(I, X)

Repetir hasta que no sea posible agregar nada más

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

s0

Page 328: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 328 Universidad Galileo

Ejemplo de construcción de los estados del DFAComenzar con la producción <S’> • <S> $Crear el primer estado como closure(<S’> • <S> $)Elegir un estado I

Para cada A • X en Iencontrar goto(I, X)si goto(I, X) no es ya un estado, crear unoAgregar una arista X del estado I al estado goto(I, X)

Repetir hasta que no sea posible agregar nada más

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

s0

Page 329: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 329 Universidad Galileo

Ejemplo de construcción de los estados del DFAComenzar con la producción <S’> • <S> $Crear el primer estado como closure(<S’> • <S> $)Elegir un estado I

Para cada A • X en Iencontrar goto(I, X)si goto(I, X) no es ya un estado, crear unoAgregar una arista X del estado I al estado goto(I, X)

Repetir hasta que no sea posible agregar nada más

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

s0

Page 330: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 330 Universidad Galileo

Ejemplo de construcción de los estados del DFAComenzar con la producción <S’> • <S> $Crear el primer estado como closure(<S’> • <S> $)Elegir un estado I

Para cada A • X en Iencontrar goto(I, X)si goto(I, X) no es ya un estado, crear unoAgregar una arista X del estado I al estado goto(I, X)

Repetir hasta que no sea posible agregar nada más

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

s0

Page 331: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 331 Universidad Galileo

Ejemplo de construcción de los estados del DFAComenzar con la producción <S’> • <S> $Crear el primer estado como closure(<S’> • <S> $)Elegir un estado I

Para cada A • X en Iencontrar goto(I, X)si goto(I, X) no es ya un estado, crear unoAgregar una arista X del estado I al estado goto(I, X)

Repetir hasta que no sea posible agregar nada más

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

s0

goto( , <X>)

Page 332: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 332 Universidad Galileo

Ejemplo de construcción de los estados del DFAComenzar con la producción <S’> • <S> $Crear el primer estado como closure(<S’> • <S> $)Elegir un estado I

Para cada A • X en Iencontrar goto(I, X)si goto(I, X) no es ya un estado, crear unoAgregar una arista X del estado I al estado goto(I, X)

Repetir hasta que no sea posible agregar nada más

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

s0<S> <X> • $

goto( , <X>)

Page 333: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 333 Universidad Galileo

Ejemplo de construcción de los estados del DFAComenzar con la producción <S’> • <S> $Crear el primer estado como closure(<S’> • <S> $)Elegir un estado I

Para cada A • X en Iencontrar goto(I, X)si goto(I, X) no es ya un estado, crear unoAgregar una arista X del estado I al estado goto(I, X)

Repetir hasta que no sea posible agregar nada más

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

s0<S> <X> • $

Page 334: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 334 Universidad Galileo

Ejemplo de construcción de los estados del DFAComenzar con la producción <S’> • <S> $Crear el primer estado como closure(<S’> • <S> $)Elegir un estado I

Para cada A • X en Iencontrar goto(I, X)si goto(I, X) no es ya un estado, crear unoAgregar una arista X del estado I al estado goto(I, X)

Repetir hasta que no sea posible agregar nada más

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

s0<S> <X> • $

s1

Page 335: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 335 Universidad Galileo

Ejemplo de construcción de los estados del DFAComenzar con la producción <S’> • <S> $Crear el primer estado como closure(<S’> • <S> $)Elegir un estado I

Para cada A • X en Iencontrar goto(I, X)si goto(I, X) no es ya un estado, crear unoAgregar una arista X del estado I al estado goto(I, X)

Repetir hasta que no sea posible agregar nada más

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

s0<S> <X> • $

s1

Page 336: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 336 Universidad Galileo

Ejemplo de construcción de los estados del DFAComenzar con la producción <S’> • <S> $Crear el primer estado como closure(<S’> • <S> $)Elegir un estado I

Para cada A • X en Iencontrar goto(I, X)si goto(I, X) no es ya un estado, crear unoAgregar una arista X del estado I al estado goto(I, X)

Repetir hasta que no sea posible agregar nada más

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

s0<S> <X> • $

s1X

Page 337: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 337 Universidad Galileo

Ejemplo de construcción de los estados del DFAComenzar con la producción <S’> • <S> $Crear el primer estado como closure(<S’> • <S> $)Elegir un estado I

Para cada A • X en Iencontrar goto(I, X)si goto(I, X) no es ya un estado, crear unoAgregar una arista X del estado I al estado goto(I, X)

Repetir hasta que no sea posible agregar nada más

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

s0<S> <X> • $

s1X

Page 338: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 338 Universidad Galileo

Ejemplo de construcción de los estados del DFAComenzar con la producción <S’> • <S> $Crear el primer estado como closure(<S’> • <S> $)Elegir un estado I

Para cada A • X en Iencontrar goto(I, X)si goto(I, X) no es ya un estado, crear unoAgregar una arista X del estado I al estado goto(I, X)

Repetir hasta que no sea posible agregar nada más

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

s0<S> <X> • $

s1X

Page 339: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 339 Universidad Galileo

Ejemplo de construcción de los estados del DFAComenzar con la producción <S’> • <S> $Crear el primer estado como closure(<S’> • <S> $)Elegir un estado I

Para cada A • X en Iencontrar goto(I, X)si goto(I, X) no es ya un estado, crear unoAgregar una arista X del estado I al estado goto(I, X)

Repetir hasta que no sea posible agregar nada más

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

s0<S> <X> • $

s1X

goto( , ( )

Page 340: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 340 Universidad Galileo

Ejemplo de construcción de los estados del DFAComenzar con la producción <S’> • <S> $Crear el primer estado como closure(<S’> • <S> $)Elegir un estado I

Para cada A • X en Iencontrar goto(I, X)si goto(I, X) no es ya un estado, crear unoAgregar una arista X del estado I al estado goto(I, X)

Repetir hasta que no sea posible agregar nada más

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

s0<S> <X> • $

s1X

<X> ( • <X> )<X> ( • )<X> • ( <X> )<X> • ( )

goto( , ( )

Page 341: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 341 Universidad Galileo

Ejemplo de construcción de los estados del DFAComenzar con la producción <S’> • <S> $Crear el primer estado como closure(<S’> • <S> $)Elegir un estado I

Para cada A • X en Iencontrar goto(I, X)si goto(I, X) no es ya un estado, crear unoAgregar una arista X del estado I al estado goto(I, X)

Repetir hasta que no sea posible agregar nada más

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

s0<S> <X> • $

s1X

<X> ( • <X> )<X> ( • )<X> • ( <X> )<X> • ( )

goto( , ( )

Page 342: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 342 Universidad Galileo

Ejemplo de construcción de los estados del DFAComenzar con la producción <S’> • <S> $Crear el primer estado como closure(<S’> • <S> $)Elegir un estado I

Para cada A • X en Iencontrar goto(I, X)si goto(I, X) no es ya un estado, crear unoAgregar una arista X del estado I al estado goto(I, X)

Repetir hasta que no sea posible agregar nada más

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

s0<S> <X> • $

s1X

<X> ( • <X> )<X> ( • )<X> • ( <X> )<X> • ( )

goto( , ( )

Page 343: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 343 Universidad Galileo

Ejemplo de construcción de los estados del DFAComenzar con la producción <S’> • <S> $Crear el primer estado como closure(<S’> • <S> $)Elegir un estado I

Para cada A • X en Iencontrar goto(I, X)si goto(I, X) no es ya un estado, crear unoAgregar una arista X del estado I al estado goto(I, X)

Repetir hasta que no sea posible agregar nada más

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

s0<S> <X> • $

s1X

<X> ( • <X> )<X> ( • )<X> • ( <X> )<X> • ( )

Page 344: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 344 Universidad Galileo

Ejemplo de construcción de los estados del DFAComenzar con la producción <S’> • <S> $Crear el primer estado como closure(<S’> • <S> $)Elegir un estado I

Para cada A • X en Iencontrar goto(I, X)si goto(I, X) no es ya un estado, crear unoAgregar una arista X del estado I al estado goto(I, X)

Repetir hasta que no sea posible agregar nada más

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

s0<S> <X> • $

s1X

<X> ( • <X> )<X> ( • )<X> • ( <X> )<X> • ( )

s2

Page 345: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 345 Universidad Galileo

Ejemplo de construcción de los estados del DFAComenzar con la producción <S’> • <S> $Crear el primer estado como closure(<S’> • <S> $)Elegir un estado I

Para cada A • X en Iencontrar goto(I, X)si goto(I, X) no es ya un estado, crear unoAgregar una arista X del estado I al estado goto(I, X)

Repetir hasta que no sea posible agregar nada más

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

s0<S> <X> • $

s1X

<X> ( • <X> )<X> ( • )<X> • ( <X> )<X> • ( )

s2

Page 346: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 346 Universidad Galileo

Ejemplo de construcción de los estados del DFAComenzar con la producción <S’> • <S> $Crear el primer estado como closure(<S’> • <S> $)Elegir un estado I

Para cada A • X en Iencontrar goto(I, X)si goto(I, X) no es ya un estado, crear unoAgregar una arista X del estado I al estado goto(I, X)

Repetir hasta que no sea posible agregar nada más

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

s0<S> <X> • $

s1X

<X> ( • <X> )<X> ( • )<X> • ( <X> )<X> • ( )

s2

(

Page 347: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 347 Universidad Galileo

Ejemplo de construcción de los estados del DFAComenzar con la producción <S’> • <S> $Crear el primer estado como closure(<S’> • <S> $)Elegir un estado I

Para cada A • X en Iencontrar goto(I, X)si goto(I, X) no es ya un estado, crear unoAgregar una arista X del estado I al estado goto(I, X)

Repetir hasta que no sea posible agregar nada más

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

s0<S> <X> • $

s1X

<X> ( • <X> )<X> ( • )<X> • ( <X> )<X> • ( )

s2

(

Page 348: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 348 Universidad Galileo

Ejemplo de construcción de los estados del DFAComenzar con la producción <S’> • <S> $Crear el primer estado como closure(<S’> • <S> $)Elegir un estado I

Para cada A • X en Iencontrar goto(I, X)si goto(I, X) no es ya un estado, crear unoAgregar una arista X del estado I al estado goto(I, X)

Repetir hasta que no sea posible agregar nada más

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

s0<S> <X> • $

s1X

<X> ( • <X> )<X> ( • )<X> • ( <X> )<X> • ( )

s2

(

Page 349: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 349 Universidad Galileo

Ejemplo de construcción de los estados del DFAComenzar con la producción <S’> • <S> $Crear el primer estado como closure(<S’> • <S> $)Elegir un estado I

Para cada A • X en Iencontrar goto(I, X)si goto(I, X) no es ya un estado, crear unoAgregar una arista X del estado I al estado goto(I, X)

Repetir hasta que no sea posible agregar nada más

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

s0<S> <X> • $

s1X

<X> ( • <X> )<X> ( • )<X> • ( <X> )<X> • ( )

s2

(

goto( , ( )

Page 350: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 350 Universidad Galileo

Ejemplo de construcción de los estados del DFAComenzar con la producción <S’> • <S> $Crear el primer estado como closure(<S’> • <S> $)Elegir un estado I

Para cada A • X en Iencontrar goto(I, X)si goto(I, X) no es ya un estado, crear unoAgregar una arista X del estado I al estado goto(I, X)

Repetir hasta que no sea posible agregar nada más

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

s0<S> <X> • $

s1X

<X> ( • <X> )<X> ( • )<X> • ( <X> )<X> • ( )

s2

(

goto( , ( )El mismo de la vez pasada

Page 351: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 351 Universidad Galileo

Ejemplo de construcción de los estados del DFAComenzar con la producción <S’> • <S> $Crear el primer estado como closure(<S’> • <S> $)Elegir un estado I

Para cada A • X en Iencontrar goto(I, X)si goto(I, X) no es ya un estado, crear unoAgregar una arista X del estado I al estado goto(I, X)

Repetir hasta que no sea posible agregar nada más

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

s0<S> <X> • $

s1X

<X> ( • <X> )<X> ( • )<X> • ( <X> )<X> • ( )

s2

(

Page 352: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 352 Universidad Galileo

Ejemplo de construcción de los estados del DFAComenzar con la producción <S’> • <S> $Crear el primer estado como closure(<S’> • <S> $)Elegir un estado I

Para cada A • X en Iencontrar goto(I, X)si goto(I, X) no es ya un estado, crear unoAgregar una arista X del estado I al estado goto(I, X)

Repetir hasta que no sea posible agregar nada más

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

s0<S> <X> • $

s1X

<X> ( • <X> )<X> ( • )<X> • ( <X> )<X> • ( )

s2

(

Page 353: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 353 Universidad Galileo

Ejemplo de construcción de los estados del DFAComenzar con la producción <S’> • <S> $Crear el primer estado como closure(<S’> • <S> $)Elegir un estado I

Para cada A • X en Iencontrar goto(I, X)si goto(I, X) no es ya un estado, crear unoAgregar una arista X del estado I al estado goto(I, X)

Repetir hasta que no sea posible agregar nada más

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

s0<S> <X> • $

s1X

<X> ( • <X> )<X> ( • )<X> • ( <X> )<X> • ( )

s2

(

Page 354: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 354 Universidad Galileo

Ejemplo de construcción de los estados del DFAComenzar con la producción <S’> • <S> $Crear el primer estado como closure(<S’> • <S> $)Elegir un estado I

Para cada A • X en Iencontrar goto(I, X)si goto(I, X) no es ya un estado, crear unoAgregar una arista X del estado I al estado goto(I, X)

Repetir hasta que no sea posible agregar nada más

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

s0<S> <X> • $

s1X

<X> ( • <X> )<X> ( • )<X> • ( <X> )<X> • ( )

s2

(

Page 355: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 355 Universidad Galileo

Ejemplo de construcción de los estados del DFAComenzar con la producción <S’> • <S> $Crear el primer estado como closure(<S’> • <S> $)Elegir un estado I

Para cada A • X en Iencontrar goto(I, X)si goto(I, X) no es ya un estado, crear unoAgregar una arista X del estado I al estado goto(I, X)

Repetir hasta que no sea posible agregar nada más

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

s0<S> <X> • $

s1X

<X> ( • <X> )<X> ( • )<X> • ( <X> )<X> • ( )

s2

(

Page 356: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

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

(

Page 357: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

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

Page 358: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

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

(

Page 359: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

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

Page 360: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

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

Page 361: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

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

Page 362: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 362 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 363: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 363 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 364: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 364 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 365: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 365 Universidad Galileo

Construyendo un Parser Engine LR(0)

• Construir un DFA– HECHO

• Construir una tabla de parseo usando el DFA

Page 366: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 366 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 367: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

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

Page 368: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 368 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 ( ) $ X

Page 369: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 369 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 ( ) $ Xs0s1s2s3s4s5

Page 370: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 370 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 ( ) $ Xs0s1s2s3s4s5

Page 371: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 371 Universidad Galileo

Ejemplo de Construcción de Parse Table

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 s2s1s2s3s4s5

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

Page 372: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 372 Universidad Galileo

Ejemplo de Construcción de Parse Table

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 goto s1s1s2s3s4s5

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

Page 373: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 373 Universidad Galileo

Ejemplo de Construcción de Parse Table

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 s1s1s2s3s4s5

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

Page 374: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 374 Universidad Galileo

Ejemplo de Construcción de Parse Table

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 s1s1s2s3s4s5

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

Page 375: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 375 Universidad Galileo

Ejemplo de Construcción de Parse Table

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

s0

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 accept s2s3s4s5

<S> <X> • $

Page 376: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 376 Universidad Galileo

Ejemplo de Construcción de Parse Table

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

s0

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 s2s3s4s5

<S> <X> • $

Page 377: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 377 Universidad Galileo

Ejemplo de Construcción de Parse Table

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

s0

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 s2s3s4s5

<S> <X> • $

Page 378: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 378 Universidad Galileo

Ejemplo de Construcción de Parse Table

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

s0

s1X

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 s2s3s4s5

<S> <X> • $

<X> ( • <X> )<X> ( • )<X> • ( <X> )<X> • ( )

Page 379: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 379 Universidad Galileo

Ejemplo de Construcción de Parse Table

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

s0

s1X

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 s5s3s4s5

<S> <X> • $

<X> ( • <X> )<X> ( • )<X> • ( <X> )<X> • ( )

Page 380: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 380 Universidad Galileo

Ejemplo de Construcción de Parse Table

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

s0

s1X

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 goto s3s3s4s5

<S> <X> • $

<X> ( • <X> )<X> ( • )<X> • ( <X> )<X> • ( )

Page 381: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 381 Universidad Galileo

Ejemplo de Construcción de Parse Table

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

s0

s1X

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 s3s3s4s5

<S> <X> • $

<X> ( • <X> )<X> ( • )<X> • ( <X> )<X> • ( )

Page 382: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 382 Universidad Galileo

Ejemplo de Construcción de Parse Table

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

s0

s1X

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 s3s3s4s5

<S> <X> • $

<X> ( • <X> )<X> ( • )<X> • ( <X> )<X> • ( )

Page 383: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 383 Universidad Galileo

Ejemplo de Construcción de Parse Table

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

s0

s1X

s2

(

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 shift to s4 s4 s5

<S> <X> • $

<X> ( • <X> )<X> ( • )<X> • ( <X> )<X> • ( ) <X> ( <X> • )

Page 384: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 384 Universidad Galileo

Ejemplo de Construcción de Parse Table

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

s0

s1X

s2

(

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 s5

<S> <X> • $

<X> ( • <X> )<X> ( • )<X> • ( <X> )<X> • ( ) <X> ( <X> • )

Page 385: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 385 Universidad Galileo

Ejemplo de Construcción de Parse Table

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

s0

s1X

s2

(

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 s5

<S> <X> • $

<X> ( • <X> )<X> ( • )<X> • ( <X> )<X> • ( ) <X> ( <X> • )

Page 386: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 386 Universidad Galileo

Ejemplo de Construcción de Parse Table

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

s0

s1X

s2

(

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

<S> <X> • $

<X> ( • <X> )<X> ( • )<X> • ( <X> )<X> • ( ) <X> ( <X> • )

Page 387: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

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

Page 388: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 388 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 389: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 389 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 390: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 390 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 391: Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)

Oscar Bonilla 391 Universidad Galileo

Lecturas

• El Tigre– Secciones 3.0 a 3.3

• El Dragón– Secciones 4.2 a 4.5 y 4.7