3.92k likes | 4.1k Views
Parsers. Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0). 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
E N D
Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)
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) Oscar Bonilla2Universidad 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 Oscar Bonilla3Universidad 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 Oscar Bonilla4Universidad 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 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); } Oscar Bonilla5Universidad Galileo
Ejemplo: Parser Predictivo No terminales Gramá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); } Oscar Bonilla6Universidad Galileo
Ejemplo: Parser Predictivo terminales Gramá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); } Oscar Bonilla7Universidad 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. Oscar Bonilla8Universidad 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 ) Oscar Bonilla9Universidad Galileo
Ejemplo 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(); } } • Gramática<E> <E> + <T><E> <E> - <T><E> <T><T> <T> * <F><T> <T> / <F><T> <F><F> id<F> num<F> ( <E> ) Oscar Bonilla10Universidad Galileo
Ejemplo ¿Qué ponemos aquí? 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(); } } • Gramática<E> <E> + <T><E> <E> - <T><E> <T><T> <T> * <F><T> <T> / <F><T> <F><F> id<F> num<F> ( <E> ) Oscar Bonilla11Universidad Galileo
Ejemplo ( 1 * 2 – 3 ) + 4 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(); } } • Gramática<E> <E> + <T><E> <E> - <T><E> <T><T> <T> * <F><T> <T> / <F><T> <F><F> id<F> num<F> ( <E> ) Oscar Bonilla12Universidad Galileo
Ejemplo ( 1 * 2 – 3 ) + 4 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(); } } • Gramática<E> <E> + <T><E> <E> - <T><E> <T><T> <T> * <F><T> <T> / <F><T> <F><F> id<F> num<F> ( <E> ) Oscar Bonilla13Universidad Galileo
Ejemplo ( 1 * 2 – 3 ) + 4 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(); } } • Gramática<E> <E> + <T><E> <E> - <T><E> <T><T> <T> * <F><T> <T> / <F><T> <F><F> id<F> num<F> ( <E> ) Oscar Bonilla14Universidad Galileo
Ejemplo ( 1 * 2 – 3 ) + 4 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(); } } • Gramática<E> <E> + <T><E> <E> - <T><E> <T><T> <T> * <F><T> <T> / <F><T> <F><F> id<F> num<F> ( <E> ) ( 1 * 2 – 3 ) Oscar Bonilla15Universidad Galileo
Ejemplo ( 1 * 2 – 3 ) + 4 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(); } } • Gramática<E> <E> + <T><E> <E> - <T><E> <T><T> <T> * <F><T> <T> / <F><T> <F><F> id<F> num<F> ( <E> ) ( 1 * 2 – 3 ) Oscar Bonilla16Universidad Galileo
Ejemplo ( 1 * 2 – 3 ) + 4 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(); } } • Gramática<E> <E> + <T><E> <E> - <T><E> <T><T> <T> * <F><T> <T> / <F><T> <F><F> id<F> num<F> ( <E> ) ( 1 * 2 – 3 ) Oscar Bonilla17Universidad 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 . Oscar Bonilla18Universidad Galileo
Algoritmo para First(), Follow() y Nullable() Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} RepetirPara 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 Oscar Bonilla19Universidad Galileo
Ejemplo Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} RepetirPara 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 Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a Oscar Bonilla20Universidad Galileo
Ejemplo Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} RepetirPara 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 Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a Oscar Bonilla21Universidad Galileo
Ejemplo Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} RepetirPara 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 Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a Oscar Bonilla22Universidad Galileo
Ejemplo Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} RepetirPara 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 Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a Oscar Bonilla23Universidad Galileo
Ejemplo Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} RepetirPara 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 Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a Oscar Bonilla24Universidad Galileo
Ejemplo Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} RepetirPara 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 Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a Oscar Bonilla25Universidad Galileo
Ejemplo Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} RepetirPara cada producción X Y1 Y2 YkSi 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 Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a Oscar Bonilla26Universidad Galileo
Ejemplo Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} RepetirPara cada producción X Y1 Y2 Yk Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = truePara 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 Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a Oscar Bonilla27Universidad Galileo
Ejemplo Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} RepetirPara cada producción X Y1 Y2 Yk Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = truePara 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 i = 1, j = 2, k = 1 Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a Oscar Bonilla28Universidad Galileo
Ejemplo Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} RepetirPara 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 kSi 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 i = 1, j = 2, k = 1 Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a Oscar Bonilla29Universidad Galileo
Ejemplo Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} RepetirPara 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 i = 1, j = 2, k = 1 Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a Oscar Bonilla30Universidad Galileo
Ejemplo Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} RepetirPara 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 i = 1, j = 2, k = 1 Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a Oscar Bonilla31Universidad Galileo
Ejemplo Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} RepetirPara 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 i = 1, j = 2, k = 1 Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a Oscar Bonilla32Universidad Galileo
Ejemplo Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} RepetirPara 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 i = 1, j = 2, k = 1 Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a Oscar Bonilla33Universidad Galileo
Ejemplo Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} RepetirPara 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 i = 1, j = 2, k = 1 Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a Oscar Bonilla34Universidad Galileo
Ejemplo Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} RepetirPara 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 i = 1, j = 2, k = 1 Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a Oscar Bonilla35Universidad Galileo
Ejemplo Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} RepetirPara 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 Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a Oscar Bonilla36Universidad Galileo
Ejemplo Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} RepetirPara 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 Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a Oscar Bonilla37Universidad Galileo
Ejemplo Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} RepetirPara cada producción X Y1 Y2 YkSi 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 Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a Oscar Bonilla38Universidad Galileo
Ejemplo Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} RepetirPara cada producción X Y1 Y2 Yk Si Y1 Yk son todos nullable (o si k=0) entonces nullable[X] = truePara 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 i = 1, j = 2, k = 3 Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a Oscar Bonilla39Universidad Galileo
Ejemplo Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} RepetirPara 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 kSi 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 i = 1, j = 2, k = 3 Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a Oscar Bonilla40Universidad Galileo
Ejemplo Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} RepetirPara 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 i = 1, j = 2, k = 3 Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a Oscar Bonilla41Universidad Galileo
Ejemplo Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} RepetirPara 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 i = 1, j = 2, k = 3 Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a Oscar Bonilla42Universidad Galileo
Ejemplo Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} RepetirPara 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 i = 1, j = 2, k = 3 Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a Oscar Bonilla43Universidad Galileo
Ejemplo Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} RepetirPara 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 i = 1, j = 2, k = 3 Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a Oscar Bonilla44Universidad Galileo
Ejemplo Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} RepetirPara 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 kSi 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 i = 1, j = 3, k = 3 Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a Oscar Bonilla45Universidad Galileo
Ejemplo Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} RepetirPara 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 i = 1, j = 3, k = 3 Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a Oscar Bonilla46Universidad Galileo
Ejemplo Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} RepetirPara 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 i = 1, j = 3, k = 3 Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a Oscar Bonilla47Universidad Galileo
Ejemplo Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} RepetirPara 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 i = 1, j = 3, k = 3 Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a Oscar Bonilla48Universidad Galileo
Ejemplo Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} RepetirPara 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 kSi 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 i = 2, j = 3, k = 3 Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a Oscar Bonilla49Universidad Galileo
Ejemplo Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} RepetirPara 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 i = 2, j = 3, k = 3 Gramática<Z> d<Z> <X><Y><Z><Y> <Y> c<X> <Y><X> a Oscar Bonilla50Universidad Galileo