1 / 391

Parsers

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

morna
Download Presentation

Parsers

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  2. 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

  3. 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

  4. 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

  5. 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

  6. 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

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

  8. 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

  9. 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

  10. 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

  11. 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

  12. 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

  13. 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

  14. 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

  15. 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

  16. 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

  17. 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

  18. 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

  19. 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

  20. 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

  21. 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

  22. 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

  23. 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

  24. 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

  25. 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

  26. 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

  27. 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

  28. 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

  29. 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

  30. 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

  31. 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

  32. 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

  33. 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

  34. 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

  35. 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

  36. 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

  37. 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

  38. 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

  39. 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

  40. 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

  41. 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

  42. 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

  43. 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

  44. 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

  45. 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

  46. 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

  47. 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

  48. 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

  49. 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

  50. 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

More Related