La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

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

Presentaciones similares


Presentación del tema: "Compiladores Parsers Parsers Predictivos, LL(0), LL(k), Parsers shift-reduce, Construcción de un Parser LL(0)"— Transcripción de la presentación:

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

2 Oscar Bonilla 2Universidad 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)

3 Oscar Bonilla 3Universidad 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

4 Oscar Bonilla 4Universidad Galileo Ejemplo: Parser Predictivo Gramática:  if then else  begin  print  end  ;  num = num

5 Oscar Bonilla 5Universidad Galileo Ejemplo: Parser Predictivo Gramática:  if then else  begin  print  end  ;  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); }

6 Oscar Bonilla 6Universidad Galileo Ejemplo: Parser Predictivo Gramática:  if then else  begin  print  end  ;  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

7 Oscar Bonilla 7Universidad Galileo Ejemplo: Parser Predictivo Gramática:  if then else  begin  print  end  ;  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

8 Oscar Bonilla 8Universidad 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.

9 Oscar Bonilla 9Universidad Galileo Ejemplo Gramática  +  -   *  /   id  num  ( ) Ejemplos: ( 1 * 2 – 3 ) + 4 ( 1 * 2 – 3 )

10 Oscar Bonilla 10Universidad Galileo Ejemplo Gramática  +  -   *  /   id  num  ( ) 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(); }

11 Oscar Bonilla 11Universidad Galileo Ejemplo Gramática  +  -   *  /   id  num  ( ) 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í?

12 Oscar Bonilla 12Universidad Galileo Ejemplo Gramática  +  -   *  /   id  num  ( ) 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

13 Oscar Bonilla 13Universidad Galileo Ejemplo Gramática  +  -   *  /   id  num  ( ) 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

14 Oscar Bonilla 14Universidad Galileo Ejemplo Gramática  +  -   *  /   id  num  ( ) 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

15 Oscar Bonilla 15Universidad Galileo Ejemplo Gramática  +  -   *  /   id  num  ( ) 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 )

16 Oscar Bonilla 16Universidad Galileo Ejemplo Gramática  +  -   *  /   id  num  ( ) 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 )

17 Oscar Bonilla 17Universidad Galileo Ejemplo Gramática  +  -   *  /   id  num  ( ) 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 )

18 Oscar Bonilla 18Universidad 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 .

19 Oscar Bonilla 19Universidad 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} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración

20 Oscar Bonilla 20Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW X Y Z

21 Oscar Bonilla 21Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW X Y Z

22 Oscar Bonilla 22Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Y Z

23 Oscar Bonilla 23Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Y Z

24 Oscar Bonilla 24Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Y Z

25 Oscar Bonilla 25Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Y Z

26 Oscar Bonilla 26Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Y Z

27 Oscar Bonilla 27Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Y Z

28 Oscar Bonilla 28Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Y Z i = 1, j = 2, k = 1

29 Oscar Bonilla 29Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Y Z i = 1, j = 2, k = 1

30 Oscar Bonilla 30Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Y Z i = 1, j = 2, k = 1

31 Oscar Bonilla 31Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Y Z d i = 1, j = 2, k = 1

32 Oscar Bonilla 32Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Y Z d i = 1, j = 2, k = 1

33 Oscar Bonilla 33Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Y Z d i = 1, j = 2, k = 1

34 Oscar Bonilla 34Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Y Z d i = 1, j = 2, k = 1

35 Oscar Bonilla 35Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Y Z d i = 1, j = 2, k = 1

36 Oscar Bonilla 36Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Y Z d

37 Oscar Bonilla 37Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Y Z d

38 Oscar Bonilla 38Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Y Z d

39 Oscar Bonilla 39Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Y Z d i = 1, j = 2, k = 3

40 Oscar Bonilla 40Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Y Z d i = 1, j = 2, k = 3

41 Oscar Bonilla 41Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Y Z d i = 1, j = 2, k = 3

42 Oscar Bonilla 42Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Y Z d i = 1, j = 2, k = 3

43 Oscar Bonilla 43Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Y Z d i = 1, j = 2, k = 3

44 Oscar Bonilla 44Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Y Z d i = 1, j = 2, k = 3

45 Oscar Bonilla 45Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Y Z d i = 1, j = 3, k = 3

46 Oscar Bonilla 46Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Y Z d i = 1, j = 3, k = 3

47 Oscar Bonilla 47Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Y Z d i = 1, j = 3, k = 3

48 Oscar Bonilla 48Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Y Z d i = 1, j = 3, k = 3

49 Oscar Bonilla 49Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Y Z d i = 2, j = 3, k = 3

50 Oscar Bonilla 50Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Y Z d i = 2, j = 3, k = 3

51 Oscar Bonilla 51Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Y Z d i = 2, j = 3, k = 3

52 Oscar Bonilla 52Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Y Z d i = 2, j = 3, k = 3

53 Oscar Bonilla 53Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Y d Z d i = 2, j = 3, k = 3

54 Oscar Bonilla 54Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Y d Z d i = 3, j = 4, k = 3

55 Oscar Bonilla 55Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Y d Z d i = 3, j = 4, k = 3

56 Oscar Bonilla 56Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Y d Z d i = 3, j = 4, k = 3

57 Oscar Bonilla 57Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Y d Z d i = 3, j = 4, k = 3

58 Oscar Bonilla 58Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Y d Z d i = 3, j = 4, k = 3

59 Oscar Bonilla 59Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Y d Z d i = 3, j = 4, k = 3

60 Oscar Bonilla 60Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Y d Z d

61 Oscar Bonilla 61Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Y d Z d

62 Oscar Bonilla 62Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Y d Z d

63 Oscar Bonilla 63Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Y d Z d

64 Oscar Bonilla 64Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Yyesd Znod

65 Oscar Bonilla 65Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Yyesd Znod i = 1, j = 2, k = 0

66 Oscar Bonilla 66Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Yyesd Znod

67 Oscar Bonilla 67Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Yyesd Znod

68 Oscar Bonilla 68Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Yyesd Znod

69 Oscar Bonilla 69Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Yyesd Znod i = 1, j = 2, k = 1

70 Oscar Bonilla 70Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Yyesd Znod i = 1, j = 2, k = 1

71 Oscar Bonilla 71Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Yyesd Znod i = 1, j = 2, k = 1

72 Oscar Bonilla 72Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Yyescd Znod i = 1, j = 2, k = 1

73 Oscar Bonilla 73Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Yyescd Znod i = 1, j = 2, k = 1

74 Oscar Bonilla 74Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Yyescd Znod i = 1, j = 2, k = 1

75 Oscar Bonilla 75Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Yyescd Znod i = 1, j = 2, k = 1

76 Oscar Bonilla 76Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Yyescd Znod i = 1, j = 2, k = 1

77 Oscar Bonilla 77Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Yyescd Znod

78 Oscar Bonilla 78Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Yyescd Znod

79 Oscar Bonilla 79Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Yyescd Znod

80 Oscar Bonilla 80Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xno Yyescd Znod

81 Oscar Bonilla 81Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xyes Y cd Znod

82 Oscar Bonilla 82Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xyes Y cd Znod i = 1, j = 2, k = 1

83 Oscar Bonilla 83Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xyes Y cd Znod i = 1, j = 2, k = 1

84 Oscar Bonilla 84Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xyes Y cd Znod i = 1, j = 2, k = 1

85 Oscar Bonilla 85Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xyesc Y cd Znod i = 1, j = 2, k = 1

86 Oscar Bonilla 86Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xyesc Y cd Znod i = 1, j = 2, k = 1

87 Oscar Bonilla 87Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xyesc Y cd Znod i = 1, j = 2, k = 1

88 Oscar Bonilla 88Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xyesc Y cd Znod i = 1, j = 2, k = 1

89 Oscar Bonilla 89Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xyesc Y cd Znod i = 1, j = 2, k = 1

90 Oscar Bonilla 90Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xyesc Y cd Znod i = 1, j = 2, k = 1

91 Oscar Bonilla 91Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xyesc Y cd Znod i = 1, j = 2, k = 1

92 Oscar Bonilla 92Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xyesc Y cd Znod

93 Oscar Bonilla 93Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xyesc Y cd Znod

94 Oscar Bonilla 94Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xyesc Y cd Znod

95 Oscar Bonilla 95Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xyesc Y cd Znod i = 1, j = 2, k = 1

96 Oscar Bonilla 96Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xyesc Y cd Znod i = 1, j = 2, k = 1

97 Oscar Bonilla 97Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xyesc Y cd Znod i = 1, j = 2, k = 1

98 Oscar Bonilla 98Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xyesa c Yyescd Znod i = 1, j = 2, k = 1

99 Oscar Bonilla 99Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xyesa c Yyescd Znod i = 1, j = 2, k = 1

100 Oscar Bonilla 100Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xyesa c Yyescd Znod i = 1, j = 2, k = 1

101 Oscar Bonilla 101Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xyesa c Yyescd Znod i = 1, j = 2, k = 1

102 Oscar Bonilla 102Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xyesa c Yyescd Znod i = 1, j = 2, k = 1

103 Oscar Bonilla 103Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xyesa c Yyescd Znod

104 Oscar Bonilla 104Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xyesa c Yyescd Znod

105 Oscar Bonilla 105Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xyesa c Yyescd Znod

106 Oscar Bonilla 106Universidad Galileo Ejemplo Gramática  d     c   a Incializar FIRST y FOLLOW al conjunto vacío y nullable a falso Para cada símbolo terminal Z, FIRST[Z] = {Z} Repetir Para cada producción X  Y 1 Y 2    Y k Si Y 1    Y k son todos nullable (o si k=0) entonces nullable[X] = true Para cada i = 1 to k, j = i +1 to k Si Y 1    Y i-1 son todos nullable (o si i = 1) entonces FIRST[X] = FIRST[X]  FIRST[Y i ] Si Y i+1    Y k son todos nullable (o si i = k ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FOLLOW[X] Si Y i+1    Y j-1 son todos nullable (o si i +1 = j ) entonces FOLLOW[Y i ] = FOLLOW[Y i ]  FIRST[Y j ] Hasta que FIRST, FOLLOW y nullable no cambien en esta iteración nullableFIRSTFOLLOW Xyesa ca c d Yyesca c d Znoa c d

107 Oscar Bonilla 107Universidad 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)

108 Oscar Bonilla 108Universidad Galileo Ejemplo: Tabla de Parser Predictivo nullableFIRSTFOLLOW Xyesa ca c d Yyesca c d Znoa c d Gramática  d     c   a acd 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)

109 Oscar Bonilla 109Universidad Galileo Ejemplo: Tabla de Parser Predictivo nullableFIRSTFOLLOW Xyesa ca c d Yyesca c d Znoa c d Gramática  d     c   a acd 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)

110 Oscar Bonilla 110Universidad Galileo Ejemplo: Tabla de Parser Predictivo nullableFIRSTFOLLOW Xyesa ca c d Yyesca c d Znoa c d Gramática  d     c   a acd 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)

111 Oscar Bonilla 111Universidad Galileo Ejemplo: Tabla de Parser Predictivo nullableFIRSTFOLLOW Xyesa ca c d Yyesca c d Znoa c d Gramática  d     c   a acd 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)

112 Oscar Bonilla 112Universidad Galileo Ejemplo: Tabla de Parser Predictivo nullableFIRSTFOLLOW Xyesa ca c d Yyesca c d Znoa c d Gramática  d     c   a acd X Y 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)

113 Oscar Bonilla 113Universidad Galileo Ejemplo: Tabla de Parser Predictivo nullableFIRSTFOLLOW Xyesa ca c d Yyesca c d Znoa c d Gramática  d     c   a acd X Y 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)

114 Oscar Bonilla 114Universidad Galileo Ejemplo: Tabla de Parser Predictivo nullableFIRSTFOLLOW Xyesa ca c d Yyesca c d Znoa c d Gramática  d     c   a acd X Y 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)

115 Oscar Bonilla 115Universidad Galileo Ejemplo: Tabla de Parser Predictivo nullableFIRSTFOLLOW Xyesa ca c d Yyesca c d Znoa c d Gramática  d     c   a acd X Y 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)

116 Oscar Bonilla 116Universidad Galileo Ejemplo: Tabla de Parser Predictivo nullableFIRSTFOLLOW Xyesa ca c d Yyesca c d Znoa c d Gramática  d     c   a acd X Y 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)

117 Oscar Bonilla 117Universidad Galileo Ejemplo: Tabla de Parser Predictivo nullableFIRSTFOLLOW Xyesa ca c d Yyesca c d Znoa c d Gramática  d     c   a acd X Y 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)

118 Oscar Bonilla 118Universidad Galileo Ejemplo: Tabla de Parser Predictivo nullableFIRSTFOLLOW Xyesa ca c d Yyesca c d Znoa c d Gramática  d     c   a acd X Y 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)

119 Oscar Bonilla 119Universidad Galileo Ejemplo: Tabla de Parser Predictivo nullableFIRSTFOLLOW Xyesa ca c d Yyesca c d Znoa c d Gramática  d     c   a acd X Y   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)

120 Oscar Bonilla 120Universidad Galileo Ejemplo: Tabla de Parser Predictivo nullableFIRSTFOLLOW Xyesa ca c d Yyesca c d Znoa c d Gramática  d     c   a acd X Y   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)

121 Oscar Bonilla 121Universidad Galileo Ejemplo: Tabla de Parser Predictivo nullableFIRSTFOLLOW Xyesa ca c d Yyesca c d Znoa c d Gramática  d     c   a acd X Y    c   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)

122 Oscar Bonilla 122Universidad Galileo Ejemplo: Tabla de Parser Predictivo nullableFIRSTFOLLOW Xyesa ca c d Yyesca c d Znoa c d Gramática  d     c   a acd X Y    c   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)

123 Oscar Bonilla 123Universidad Galileo Ejemplo: Tabla de Parser Predictivo nullableFIRSTFOLLOW Xyesa ca c d Yyesca c d Znoa c d Gramática  d     c   a acd X Y    c   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)

124 Oscar Bonilla 124Universidad Galileo Ejemplo: Tabla de Parser Predictivo nullableFIRSTFOLLOW Xyesa ca c d Yyesca c d Znoa c d Gramática  d     c   a acd X  Y    c   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)

125 Oscar Bonilla 125Universidad Galileo Ejemplo: Tabla de Parser Predictivo nullableFIRSTFOLLOW Xyesa ca c d Yyesca c d Znoa c d Gramática  d     c   a acd X  Y    c   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)

126 Oscar Bonilla 126Universidad Galileo Ejemplo: Tabla de Parser Predictivo nullableFIRSTFOLLOW Xyesa ca c d Yyesca c d Znoa c d Gramática  d     c   a acd X  Y    c   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)

127 Oscar Bonilla 127Universidad Galileo Ejemplo: Tabla de Parser Predictivo nullableFIRSTFOLLOW Xyesa ca c d Yyesca c d Znoa c d Gramática  d     c   a acd X   a  Y    c   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)

128 Oscar Bonilla 128Universidad Galileo Ejemplo: Tabla de Parser Predictivo nullableFIRSTFOLLOW Xyesa ca c d Yyesca c d Znoa c d Gramática  d     c   a acd X   a  Y    c   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)

129 Oscar Bonilla 129Universidad Galileo Ejemplo: Tabla de Parser Predictivo nullableFIRSTFOLLOW Xyesa ca c d Yyesca c d Znoa c d Gramática  d     c   a acd X   a  Y    c   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)

130 Oscar Bonilla 130Universidad Galileo Ejemplo: Tabla de Parser Predictivo nullableFIRSTFOLLOW Xyesa ca c d Yyesca c d Znoa c d Gramática  d     c   a acd X   a  Y    c   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) ¡¡Múltiples Entradas!!

131 Oscar Bonilla 131Universidad 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!

132 Oscar Bonilla 132Universidad 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.

133 Oscar Bonilla 133Universidad Galileo Recursión Izquierda Si una gramática tiene recursión izquierda, no puede ser parseada por un parser predictivo Ejemplo:  +  Las gramáticas con recursión izquierda no son LL(1)

134 Oscar Bonilla 134Universidad Galileo Eliminando Recursión Izquierda Para eliminar la recursión izquierda, podemos reescribir la gramática usando recursión derecha.

135 Oscar Bonilla 135Universidad Galileo Ejemplo: Eliminando Recursión Izquierda  +    +  

136 Oscar Bonilla 136Universidad Galileo Eliminando Recursión Izquierda En general, cuando tenemos producciones de la forma   y   donde  no comienza con, sabemos que esto deriva strings de la forma   *, así que la podemos reescribir usando recursión derecha.

137 Oscar Bonilla 137Universidad Galileo Factorización Izquierda Un problema similar ocurre cuando dos producciones con el mismo no-terminal comienzan con el mismo símbolo. Ejemplo:  if then else  if then En este caso, podemos factorizar la gramática por la izquierda, es decir, tomar las terminaciones posibles y crear un nuevo no terminal que las incluya.

138 Oscar Bonilla 138Universidad Galileo Ejemplo: Factorización Izquierda  if then else  if then    else 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 ”)

139 Oscar Bonilla 139Universidad 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)

140 Oscar Bonilla 140Universidad Galileo Implementando un Parser Técnicas diferentes –Cada una puede manejar distintas CFGs –Categorización de Técnicas

141 Oscar Bonilla 141Universidad Galileo Implementando un Parser Técnicas diferentes –Cada una puede manejar distintas CFGs –Categorización de Técnicas ()

142 Oscar Bonilla 142Universidad Galileo Implementando un Parser Técnicas diferentes –Cada una puede manejar distintas CFGs –Categorización de Técnicas () L – parsear de izquierda a derecha R – parsear de derecha a izquierda

143 Oscar Bonilla 143Universidad Galileo Implementando un Parser Técnicas diferentes –Cada una puede manejar distintas CFGs –Categorización de Técnicas () L - leftmost derivation R - rightmost derivation

144 Oscar Bonilla 144Universidad Galileo Implementando un Parser Técnicas diferentes –Cada una puede manejar distintas CFGs –Categorización de Técnicas () Número de caracteres de lookahead

145 Oscar Bonilla 145Universidad Galileo Implementando un Parser Técnicas diferentes –Cada una puede manejar distintas CFGs –Categorización de Técnicas –Ejemplos: LL(0), LR(1) ()

146 Oscar Bonilla 146Universidad 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) () LRk

147 Oscar Bonilla 147Universidad 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)

148 Oscar Bonilla 148Universidad 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

149 Oscar Bonilla 149Universidad 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

150 Oscar Bonilla 150Universidad Galileo Acciones de un Parser shift-reduce Arbol de Parseo

151 Oscar Bonilla 151Universidad Galileo Acciones de un Parser shift-reduce Parse Tree Arbol de Parseo

152 Oscar Bonilla 152Universidad Galileo Acciones de un Parser shift-reduce Parse Tree Arbol de Parseo

153 Oscar Bonilla 153Universidad Galileo Acciones de un Parser shift-reduce Parse Tree Arbol de Parseo

154 Oscar Bonilla 154Universidad Galileo Acciones de un Parser shift-reduce Parse Tree Arbol de Parseo

155 Oscar Bonilla 155Universidad Galileo Acciones de un Parser shift-reduce Parse Tree Arbol de Parseo

156 Oscar Bonilla 156Universidad Galileo Acciones de un Parser shift-reduce Parse Tree Arbol de Parseo

157 Oscar Bonilla 157Universidad Galileo Acciones de un Parser shift-reduce Parse Tree Arbol de Parseo

158 Oscar Bonilla 158Universidad Galileo Acciones de un Parser shift-reduce Arbol de Parseo

159 Oscar Bonilla 159Universidad Galileo Acciones de un Parser shift-reduce Arbol de Parseo

160 Oscar Bonilla 160Universidad Galileo Acciones de un Parser shift-reduce Arbol de Parseo

161 Oscar Bonilla 161Universidad Galileo Acciones de un Parser shift-reduce Arbol de Parseo

162 Oscar Bonilla 162Universidad 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 Parse Tree

163 Oscar Bonilla 163Universidad Galileo Acciones de un Parser shift-reduce Parse Tree Estado Actual

164 Oscar Bonilla 164Universidad Galileo Acciones de un Parser shift-reduce Stack Símbolo Actual stack Acción del Parser Parser Engine

165 Oscar Bonilla 165Universidad 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

166 Oscar Bonilla 166Universidad Galileo Ejemplo: Parser Shift-Reduce *(+num)

167 Oscar Bonilla 167Universidad Galileo Ejemplo: Parser Shift-Reduce *(+num)

168 Oscar Bonilla 168Universidad Galileo Ejemplo: Parser Shift-Reduce *(+num)   ( )  -  num  +  -  *

169 Oscar Bonilla 169Universidad Galileo Ejemplo: Parser Shift-Reduce *(+num)   ( )  -  num  +  -  *

170 Oscar Bonilla 170Universidad Galileo Ejemplo: Parser Shift-Reduce *(+num)   ( )  -  num  +  -  *

171 Oscar Bonilla 171Universidad Galileo Ejemplo: Parser Shift-Reduce *(+num)   ( )  -  num  +  -  * num

172 Oscar Bonilla 172Universidad Galileo Ejemplo: Parser Shift-Reduce *(+num)   ( )  -  num  +  -  * num SHIFT

173 Oscar Bonilla 173Universidad Galileo Ejemplo: Parser Shift-Reduce *(+num)   ( )  -  num  +  -  * num

174 Oscar Bonilla 174Universidad Galileo Ejemplo: Parser Shift-Reduce *(+num)   ( )  -  num  +  -  * num REDUCE

175 Oscar Bonilla 175Universidad Galileo Ejemplo: Parser Shift-Reduce *(+num) num   ( )  -  num  +  -  * REDUCE

176 Oscar Bonilla 176Universidad Galileo Ejemplo: Parser Shift-Reduce *(+num) num   ( )  -  num  +  -  *

177 Oscar Bonilla 177Universidad Galileo Ejemplo: Parser Shift-Reduce (+num) num*   ( )  -  num  +  -  * * SHIFT

178 Oscar Bonilla 178Universidad Galileo Ejemplo: Parser Shift-Reduce (+num) num*   ( )  -  num  +  -  * *

179 Oscar Bonilla 179Universidad Galileo Ejemplo: Parser Shift-Reduce (+num) num*   ( )  -  num  +  -  * * REDUCE

180 Oscar Bonilla 180Universidad Galileo Ejemplo: Parser Shift-Reduce (+num) num*   ( )  -  num  +  -  * REDUCE

181 Oscar Bonilla 181Universidad Galileo ( Ejemplo: Parser Shift-Reduce +num) num*   ( )  -  num  +  -  *

182 Oscar Bonilla 182Universidad Galileo Ejemplo: Parser Shift-Reduce +num) num*(   ( )  -  num  +  -  * ( SHIFT

183 Oscar Bonilla 183Universidad Galileo Ejemplo: Parser Shift-Reduce +num) num*(   ( )  -  num  +  -  * (

184 Oscar Bonilla 184Universidad Galileo Ejemplo: Parser Shift-Reduce *+num) num(   ( )  -  num  +  -  * ( num SHIFT

185 Oscar Bonilla 185Universidad Galileo Ejemplo: Parser Shift-Reduce *+num) num(   ( )  -  num  +  -  * ( num

186 Oscar Bonilla 186Universidad Galileo Ejemplo: Parser Shift-Reduce *+num) num(   ( )  -  num  +  -  * ( num REDUCE

187 Oscar Bonilla 187Universidad Galileo Ejemplo: Parser Shift-Reduce *+num) num(   ( )  -  num  +  -  * ( REDUCE

188 Oscar Bonilla 188Universidad Galileo + Ejemplo: Parser Shift-Reduce *num) num(   ( )  -  num  +  -  * (

189 Oscar Bonilla 189Universidad Galileo Ejemplo: Parser Shift-Reduce *num) num( +   ( )  -  num  +  -  * ( + SHIFT

190 Oscar Bonilla 190Universidad Galileo Ejemplo: Parser Shift-Reduce *num) num( +   ( )  -  num  +  -  * ( +

191 Oscar Bonilla 191Universidad Galileo Ejemplo: Parser Shift-Reduce *num) num( +   ( )  -  num  +  -  * ( + REDUCE

192 Oscar Bonilla 192Universidad Galileo Ejemplo: Parser Shift-Reduce *num) num( +   ( )  -  num  +  -  * ( REDUCE

193 Oscar Bonilla 193Universidad Galileo num Ejemplo: Parser Shift-Reduce *) num( +   ( )  -  num  +  -  * (

194 Oscar Bonilla 194Universidad Galileo Ejemplo: Parser Shift-Reduce *) num( +   ( )  -  num  +  -  * ( num SHIFT

195 Oscar Bonilla 195Universidad Galileo Ejemplo: Parser Shift-Reduce *) num( +   ( )  -  num  +  -  * ( num

196 Oscar Bonilla 196Universidad Galileo Ejemplo: Parser Shift-Reduce *) num( +   ( )  -  num  +  -  * ( num REDUCE

197 Oscar Bonilla 197Universidad Galileo Ejemplo: Parser Shift-Reduce *) num( +   ( )  -  num  +  -  * ( REDUCE

198 Oscar Bonilla 198Universidad Galileo Ejemplo: Parser Shift-Reduce *) num( +   ( )  -  num  +  -  * (

199 Oscar Bonilla 199Universidad Galileo Ejemplo: Parser Shift-Reduce *) num( +   ( )  -  num  +  -  * ( REDUCE

200 Oscar Bonilla 200Universidad Galileo Ejemplo: Parser Shift-Reduce *) num( +   ( )  -  num  +  -  * ( REDUCE

201 Oscar Bonilla 201Universidad Galileo Ejemplo: Parser Shift-Reduce *) num( +   ( )  -  num  +  -  * (

202 Oscar Bonilla 202Universidad Galileo Ejemplo: Parser Shift-Reduce *) num( +   ( )  -  num  +  -  * ( ) SHIFT

203 Oscar Bonilla 203Universidad Galileo Ejemplo: Parser Shift-Reduce *) num( +   ( )  -  num  +  -  * ( )

204 Oscar Bonilla 204Universidad Galileo Ejemplo: Parser Shift-Reduce *) num( +   ( )  -  num  +  -  * ( ) REDUCE

205 Oscar Bonilla 205Universidad Galileo Ejemplo: Parser Shift-Reduce *) num( +   ( )  -  num  +  -  * REDUCE

206 Oscar Bonilla 206Universidad Galileo Ejemplo: Parser Shift-Reduce *) num( +   ( )  -  num  +  -  *

207 Oscar Bonilla 207Universidad Galileo Ejemplo: Parser Shift-Reduce *) num( +   ( )  -  num  +  -  * REDUCE

208 Oscar Bonilla 208Universidad Galileo Ejemplo: Parser Shift-Reduce *) num( +   ( )  -  num  +  -  * REDUCE

209 Oscar Bonilla 209Universidad Galileo Ejemplo: Parser Shift-Reduce *) num( +   ( )  -  num  +  -  *

210 Oscar Bonilla 210Universidad Galileo Ejemplo: Parser Shift-Reduce *) num( +   ( )  -  num  +  -  * ACCEPT

211 Oscar Bonilla 211Universidad 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 Parser Engine

212 Oscar Bonilla 212Universidad 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)

213 Oscar Bonilla 213Universidad 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 Parser Engine

214 Oscar Bonilla 214Universidad 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

215 Oscar Bonilla 215Universidad Galileo Ejemplo: Parser Shift-Reduce   ( )  -  num  +  -  * Un cambio en la gramática

216 Oscar Bonilla 216Universidad Galileo Ejemplo: Parser Shift-Reduce   ( )  -  num  +  -  * Un cambio en la gramática

217 Oscar Bonilla 217Universidad Galileo Ejemplo: Parser Shift-Reduce   ( )  -  num  +  -  * Un cambio en la gramática

218 Oscar Bonilla 218Universidad Galileo Ejemplo: Parser Shift-Reduce   ( )  -  num  +  -  * Un cambio en la gramática

219 Oscar Bonilla 219Universidad Galileo Ejemplo: Parser Shift-Reduce -num   ( )  -  num  +  -  *

220 Oscar Bonilla 220Universidad Galileo Ejemplo: Parser Shift-Reduce -num   ( )  -  num  +  -  * num

221 Oscar Bonilla 221Universidad Galileo num Ejemplo: Parser Shift-Reduce -num   ( )  -  num  +  -  * num SHIFT

222 Oscar Bonilla 222Universidad Galileo num Ejemplo: Parser Shift-Reduce -num   ( )  -  num  +  -  * num

223 Oscar Bonilla 223Universidad Galileo num Ejemplo: Parser Shift-Reduce -num   ( )  -  num  +  -  * num REDUCE

224 Oscar Bonilla 224Universidad Galileo Ejemplo: Parser Shift-Reduce -num   ( )  -  num  +  -  * num REDUCE

225 Oscar Bonilla 225Universidad Galileo Ejemplo: Parser Shift-Reduce -num   ( )  -  num  +  -  * num

226 Oscar Bonilla 226Universidad Galileo - Ejemplo: Parser Shift-Reduce num   ( )  -  num  +  -  * num - SHIFT

227 Oscar Bonilla 227Universidad Galileo - Ejemplo: Parser Shift-Reduce num   ( )  -  num  +  -  * num -

228 Oscar Bonilla 228Universidad Galileo - Ejemplo: Parser Shift-Reduce num   ( )  -  num  +  -  * num - ¡¡¡Tenemos elección!!! REDUCE

229 Oscar Bonilla 229Universidad Galileo - Ejemplo: Parser Shift-Reduce num   ( )  -  num  +  -  * num - ¡¡Pero esto no es lo correcto!! REDUCE

230 Oscar Bonilla 230Universidad Galileo Ejemplo: Parser Shift-Reduce num   ( )  -  num  +  -  * num - ¡¡Pero esto no es lo correcto!! REDUCE

231 Oscar Bonilla 231Universidad Galileo Ejemplo: Parser Shift-Reduce num   ( )  -  num  +  -  * num - ¡¡Pero esto no es lo correcto!!

232 Oscar Bonilla 232Universidad Galileo num Ejemplo: Parser Shift-Reduce num   ( )  -  num  +  -  * num - ¡¡Pero esto no es lo correcto!! SHIFT

233 Oscar Bonilla 233Universidad Galileo num Ejemplo: Parser Shift-Reduce num   ( )  -  num  +  -  * num - ¡¡Pero esto no es lo correcto!!

234 Oscar Bonilla 234Universidad Galileo num Ejemplo: Parser Shift-Reduce num   ( )  -  num  +  -  * num - ¡¡Pero esto no es lo correcto!! REDUCE

235 Oscar Bonilla 235Universidad Galileo Ejemplo: Parser Shift-Reduce num   ( )  -  num  +  -  * num - ¡¡Pero esto no es lo correcto!! REDUCE

236 Oscar Bonilla 236Universidad Galileo Ejemplo: Parser Shift-Reduce num   ( )  -  num  +  -  * num - ¡¡Pero esto no es lo correcto!!

237 Oscar Bonilla 237Universidad Galileo Ejemplo: Parser Shift-Reduce num   ( )  -  num  +  -  * num - ¡¡Pero esto no es lo correcto!! ¡¡No hay más acciones!! ERROR

238 Oscar Bonilla 238Universidad Galileo Ejemplo: Parser Shift-Reduce num - Pero este input es perfectamente válido para la gramática Elegimos la producción equivocada Veamos cuál es la producción apropiada

239 Oscar Bonilla 239Universidad Galileo - Ejemplo: Parser Shift-Reduce num   ( )  -  num  +  -  * num - Tenemos elección REDUCE El paso anterior a nuestro error

240 Oscar Bonilla 240Universidad Galileo - Ejemplo: Parser Shift-Reduce num   ( )  -  num  +  -  * num - Usamos la otra producción REDUCE

241 Oscar Bonilla 241Universidad Galileo Ejemplo: Parser Shift-Reduce num   ( )  -  num  +  -  * num - REDUCE Usamos la otra producción

242 Oscar Bonilla 242Universidad Galileo Ejemplo: Parser Shift-Reduce num   ( )  -  num  +  -  * num -

243 Oscar Bonilla 243Universidad Galileo num Ejemplo: Parser Shift-Reduce num   ( )  -  num  +  -  * num - SHIFT

244 Oscar Bonilla 244Universidad Galileo num Ejemplo: Parser Shift-Reduce num   ( )  -  num  +  -  * num -

245 Oscar Bonilla 245Universidad Galileo num Ejemplo: Parser Shift-Reduce num   ( )  -  num  +  -  * num - REDUCE

246 Oscar Bonilla 246Universidad Galileo Ejemplo: Parser Shift-Reduce num   ( )  -  num  +  -  * num - REDUCE

247 Oscar Bonilla 247Universidad Galileo Ejemplo: Parser Shift-Reduce num   ( )  -  num  +  -  * num -

248 Oscar Bonilla 248Universidad Galileo Ejemplo: Parser Shift-Reduce num   ( )  -  num  +  -  * num - REDUCE

249 Oscar Bonilla 249Universidad Galileo Ejemplo: Parser Shift-Reduce num   ( )  -  num  +  -  * num - REDUCE

250 Oscar Bonilla 250Universidad Galileo Ejemplo: Parser Shift-Reduce num   ( )  -  num  +  -  * num -

251 Oscar Bonilla 251Universidad Galileo Ejemplo: Parser Shift-Reduce num   ( )  -  num  +  -  * num - ACCEPT

252 Oscar Bonilla 252Universidad 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

253 Oscar Bonilla 253Universidad 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)

254 Oscar Bonilla 254Universidad Galileo Construyendo un Parser LR(k) Vamos a construir unos cuantos parsers LR(k) –LR(0), –SLR (o simple LR) –LR(1)

255 Oscar Bonilla 255Universidad 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

256 Oscar Bonilla 256Universidad Galileo Acciones de un Parser Shift-Reduce Stack Símbolo Actual stack Acción del Parser Parser Engine

257 Oscar Bonilla 257Universidad 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

258 Oscar Bonilla 258Universidad Galileo LR(k) Parser Engine Símbolo Actual Acción del Parser LR(k) Parser Engine Stack de Símbolos Stack de Estados

259 Oscar Bonilla 259Universidad Galileo Tablas de Parseo Buscamos –[top del stack de estados] –[ símbolo de entrada] en la tabla de parseo Ejecutamos la acción descrita

260 Oscar Bonilla 260Universidad Galileo Tablas de Parseo 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

261 Oscar Bonilla 261Universidad Galileo Tablas de Parseo 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

262 Oscar Bonilla 262Universidad Galileo Tablas de Parseo Accept –Dejar de parsear y reportar éxito

263 Oscar Bonilla 263Universidad Galileo Tablas de Parseo Error –Dejar de parsear y reportar Error

264 Oscar Bonilla 264Universidad Galileo Ejemplo LR La gramática  $(1)  ( )(2)  ( )(3)

265 Oscar Bonilla 265Universidad Galileo Pregunta La gramática  $(1)  ( )(2)  ( )(3) ¿Cuál es el lenguaje aceptado por esta CFG?

266 Oscar Bonilla 266Universidad Galileo Tabla de Parseo en Acción La gramática  $(1)  ( )(2)  ( )(3)

267 Oscar Bonilla 267Universidad Galileo Tabla de Parseo en Acción Tabla de Acciones La gramática  $(1)  ( )(2)  ( )(3)

268 Oscar Bonilla 268Universidad Galileo Tabla de Parseo en Acción Tabla de Acciones La gramática  $(1)  ( )(2)  ( )(3) $

269 Oscar Bonilla 269Universidad Galileo Tabla de Parseo en Acción Tabla de Acciones La gramática  $(1)  ( )(2)  ( )(3) s0 $

270 Oscar Bonilla 270Universidad Galileo Tabla de Parseo en Acción Tabla de Acciones La gramática  $(1)  ( )(2)  ( )(3) s0 $ )(()$

271 Oscar Bonilla 271Universidad Galileo Tabla de Parseo en Acción Tabla de Acciones La gramática  $(1)  ( )(2)  ( )(3) s0 $ )()($

272 Oscar Bonilla 272Universidad Galileo Tabla de Parseo en Acción Tabla de Acciones La gramática  $(1)  ( )(2)  ( )(3) s0 $ )()($

273 Oscar Bonilla 273Universidad Galileo Tabla de Parseo en Acción Tabla de Acciones La gramática  $(1)  ( )(2)  ( )(3) s0 $ )()($

274 Oscar Bonilla 274Universidad Galileo ( s2 ( Tabla de Parseo en Acción Tabla de Acciones La gramática  $(1)  ( )(2)  ( )(3) s0 $ ))($

275 Oscar Bonilla 275Universidad Galileo s2 ( Tabla de Parseo en Acción Tabla de Acciones La gramática  $(1)  ( )(2)  ( )(3) s0 $ ))(($

276 Oscar Bonilla 276Universidad Galileo s2 ( Tabla de Parseo en Acción Tabla de Acciones La gramática  $(1)  ( )(2)  ( )(3) s0 $ ))(($

277 Oscar Bonilla 277Universidad Galileo s2 ( Tabla de Parseo en Acción Tabla de Acciones La gramática  $(1)  ( )(2)  ( )(3) s0 $ ))(($

278 Oscar Bonilla 278Universidad Galileo s2 ( ( Tabla de Parseo en Acción Tabla de Acciones La gramática  $(1)  ( )(2)  ( )(3) s0 $ ))(($

279 Oscar Bonilla 279Universidad Galileo s2 ( ( Tabla de Parseo en Acción Tabla de Acciones La gramática  $(1)  ( )(2)  ( )(3) s0 $ )(()$

280 Oscar Bonilla 280Universidad Galileo s2 ( ( Tabla de Parseo en Acción Tabla de Acciones La gramática  $(1)  ( )(2)  ( )(3) s0 $ )(()$

281 Oscar Bonilla 281Universidad Galileo s2 ( ( Tabla de Parseo en Acción Tabla de Acciones La gramática  $(1)  ( )(2)  ( )(3) s0 $ )(()$

282 Oscar Bonilla 282Universidad Galileo s5 ) s2 ( ( Tabla de Parseo en Acción Tabla de Acciones La gramática  $(1)  ( )(2)  ( )(3) s0 $ )(()$

283 Oscar Bonilla 283Universidad Galileo s5 ) s2 ( ( Tabla de Parseo en Acción Tabla de Acciones La gramática  $(1)  ( )(2)  ( )(3) s0 $ )(()$

284 Oscar Bonilla 284Universidad Galileo s5 ) s2 ( ( Tabla de Parseo en Acción Tabla de Acciones La gramática  $(1)  ( )(2)  ( )(3) s0 $ )(()$

285 Oscar Bonilla 285Universidad Galileo s5 ) s2 ( ( Tabla de Parseo en Acción Tabla de Acciones La gramática  $(1)  ( )(2)  ( )(3) s0 $ )(()$

286 Oscar Bonilla 286Universidad Galileo s5 ) s2 ( ( Tabla de Parseo en Acción Tabla de Acciones La gramática  $(1)  ( )(2)  ( )(3) s0 $ )(()$

287 Oscar Bonilla 287Universidad Galileo s5 ) s2 ( ( Tabla de Parseo en Acción Tabla de Acciones La gramática  $(1)  ( )(2)  ( )(3) s0 $ )(() s5 ) s2 ( $

288 Oscar Bonilla 288Universidad Galileo X s2 ( Tabla de Parseo en Acción Tabla de Acciones La gramática  $(1)  ( )(2)  ( )(3) s0 $ )(()$

289 Oscar Bonilla 289Universidad Galileo X s2 ( Tabla de Parseo en Acción Tabla de Acciones La gramática  $(1)  ( )(2)  ( )(3) s0 $ )(()$

290 Oscar Bonilla 290Universidad Galileo X s2 ( Tabla de Parseo en Acción Tabla de Acciones La gramática  $(1)  ( )(2)  ( )(3) s0 $ )(()$

291 Oscar Bonilla 291Universidad Galileo s3 X s2 ( Tabla de Parseo en Acción Tabla de Acciones La gramática  $(1)  ( )(2)  ( )(3) s0 $ )(()$

292 Oscar Bonilla 292Universidad Galileo s3 X s2 ( Tabla de Parseo en Acción Tabla de Acciones La gramática  $(1)  ( )(2)  ( )(3) s0 $ )(()$

293 Oscar Bonilla 293Universidad Galileo s3 X s2 ( Tabla de Parseo en Acción Tabla de Acciones La gramática  $(1)  ( )(2)  ( )(3) s0 $ )(()$

294 Oscar Bonilla 294Universidad Galileo s3 X s2 ( Tabla de Parseo en Acción Tabla de Acciones La gramática  $(1)  ( )(2)  ( )(3) s0 $ )(()$

295 Oscar Bonilla 295Universidad Galileo s4 ) s3 X s2 ( Tabla de Parseo en Acción Tabla de Acciones La gramática  $(1)  ( )(2)  ( )(3) s0 $ )(()$

296 Oscar Bonilla 296Universidad Galileo s4 ) s3 X s2 ( Tabla de Parseo en Acción Tabla de Acciones La gramática  $(1)  ( )(2)  ( )(3) s0 $ )(()$

297 Oscar Bonilla 297Universidad Galileo s4 ) s3 X s2 ( Tabla de Parseo en Acción Tabla de Acciones La gramática  $(1)  ( )(2)  ( )(3) s0 $ )(()$

298 Oscar Bonilla 298Universidad Galileo s4 ) s3 X s2 ( Tabla de Parseo en Acción Tabla de Acciones La gramática  $(1)  ( )(2)  ( )(3) s0 $ )(()$

299 Oscar Bonilla 299Universidad Galileo s4 ) s3 X s2 ( Tabla de Parseo en Acción Tabla de Acciones La gramática  $(1)  ( )(2)  ( )(3) s0 $ )(()$ s4 ) s3 X s2 (

300 Oscar Bonilla 300Universidad Galileo X Tabla de Parseo en Acción Tabla de Acciones La gramática  $(1)  ( )(2)  ( )(3) s0 $ )(()$

301 Oscar Bonilla 301Universidad Galileo X Tabla de Parseo en Acción Tabla de Acciones La gramática  $(1)  ( )(2)  ( )(3) s0 $ )(()$

302 Oscar Bonilla 302Universidad Galileo X Tabla de Parseo en Acción Tabla de Acciones La gramática  $(1)  ( )(2)  ( )(3) s0 $ )(()$

303 Oscar Bonilla 303Universidad Galileo s1 X Tabla de Parseo en Acción Tabla de Acciones La gramática  $(1)  ( )(2)  ( )(3) s0 $ )(()$

304 Oscar Bonilla 304Universidad Galileo s1 X Tabla de Parseo en Acción Tabla de Acciones La gramática  $(1)  ( )(2)  ( )(3) s0 $ )(()$

305 Oscar Bonilla 305Universidad Galileo s1 X Tabla de Parseo en Acción Tabla de Acciones La gramática  $(1)  ( )(2)  ( )(3) s0 $ )(()$

306 Oscar Bonilla 306Universidad Galileo s1 X Tabla de Parseo en Acción Tabla de Acciones La gramática  $(1)  ( )(2)  ( )(3) s0 $ )(()$ Accept

307 Oscar Bonilla 307Universidad 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)

308 Oscar Bonilla 308Universidad Galileo Items LR(0) Tenemos que capturar cuánto de una producción hemos escaneado hasta ahora  ( ) ¿Estamos aquí?¿o aquí?

309 Oscar Bonilla 309Universidad Galileo Items LR(0) Tenemos que capturar cuánto de una producción hemos escaneado hasta ahora Representado por 4 ítems –  ( )  ( )

310 Oscar Bonilla 310Universidad Galileo Ejemplo de Items La gramática  $  ( ) Items  $  ( )

311 Oscar Bonilla 311Universidad Galileo Idea clave de los Items Si el “estado actual” contiene el ítem A   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

312 Oscar Bonilla 312Universidad 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)

313 Oscar Bonilla 313Universidad Galileo Ejemplo de Closure Encontrar closure(  ( ) ) Items  $  ( )

314 Oscar Bonilla 314Universidad Galileo Pregunta: Encuentren Closure Encuentren closure(  $ ) Items  $  ( ) ????

315 Oscar Bonilla 315Universidad Galileo Pregunta: Encuentren Closure Encuentren closure(  $ ) Items  $  ( )  $  ( )

316 Oscar Bonilla 316Universidad 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

317 Oscar Bonilla 317Universidad Galileo Ejemplo de Goto Encontrar goto(  ( ), ) Items  $  ( )

318 Oscar Bonilla 318Universidad Galileo Pregunta: Encuentren goto Encuentren goto(  ( ), ( ) Items  $  ( ) ????

319 Oscar Bonilla 319Universidad Galileo Pregunta: Encuentren goto Encuentren goto(  ( ), ( ) Items  $  ( )

320 Oscar Bonilla 320Universidad Galileo Comenzamos con la producción  $ El primer estado es closure(  $ ) 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

321 Oscar Bonilla 321Universidad Galileo Ejemplo de construcción de los estados del DFA Comenzar con la producción  $ Crear el primer estado como closure(  $) Elegir un estado I Para cada A   X  en I encontrar goto(I, X) si goto(I, X) no es ya un estado, crear uno Agregar una arista X del estado I al estado goto(I, X) Repetir hasta que no sea posible agregar nada más

322 Oscar Bonilla 322Universidad Galileo Ejemplo de construcción de los estados del DFA Comenzar con la producción  $ Crear el primer estado como closure(  $) Elegir un estado I Para cada A   X  en I encontrar goto(I, X) si goto(I, X) no es ya un estado, crear uno Agregar una arista X del estado I al estado goto(I, X) Repetir hasta que no sea posible agregar nada más

323 Oscar Bonilla 323Universidad Galileo  $ Ejemplo de construcción de los estados del DFA Comenzar con la producción  $ Crear el primer estado como closure(  $) Elegir un estado I Para cada A   X  en I encontrar goto(I, X) si goto(I, X) no es ya un estado, crear uno Agregar una arista X del estado I al estado goto(I, X) Repetir hasta que no sea posible agregar nada más

324 Oscar Bonilla 324Universidad Galileo Ejemplo de construcción de los estados del DFA Comenzar con la producción  $ Crear el primer estado como closure(  $) Elegir un estado I Para cada A   X  en I encontrar goto(I, X) si goto(I, X) no es ya un estado, crear uno Agregar una arista X del estado I al estado goto(I, X) Repetir hasta que no sea posible agregar nada más  $

325 Oscar Bonilla 325Universidad Galileo Ejemplo de construcción de los estados del DFA Comenzar con la producción  $ Crear el primer estado como closure(  $) Elegir un estado I Para cada A   X  en I encontrar goto(I, X) si goto(I, X) no es ya un estado, crear uno Agregar una arista X del estado I al estado goto(I, X) Repetir hasta que no sea posible agregar nada más  $  ( )

326 Oscar Bonilla 326Universidad Galileo Ejemplo de construcción de los estados del DFA Comenzar con la producción  $ Crear el primer estado como closure(  $) Elegir un estado I Para cada A   X  en I encontrar goto(I, X) si goto(I, X) no es ya un estado, crear uno Agregar una arista X del estado I al estado goto(I, X) Repetir hasta que no sea posible agregar nada más  $  ( ) s0

327 Oscar Bonilla 327Universidad Galileo Ejemplo de construcción de los estados del DFA Comenzar con la producción  $ Crear el primer estado como closure(  $) Elegir un estado I Para cada A   X  en I encontrar goto(I, X) si goto(I, X) no es ya un estado, crear uno Agregar una arista X del estado I al estado goto(I, X) Repetir hasta que no sea posible agregar nada más  $  ( ) s0

328 Oscar Bonilla 328Universidad Galileo Ejemplo de construcción de los estados del DFA Comenzar con la producción  $ Crear el primer estado como closure(  $) Elegir un estado I Para cada A   X  en I encontrar goto(I, X) si goto(I, X) no es ya un estado, crear uno Agregar una arista X del estado I al estado goto(I, X) Repetir hasta que no sea posible agregar nada más  $  ( ) s0

329 Oscar Bonilla 329Universidad Galileo Ejemplo de construcción de los estados del DFA Comenzar con la producción  $ Crear el primer estado como closure(  $) Elegir un estado I Para cada A   X  en I encontrar goto(I, X) si goto(I, X) no es ya un estado, crear uno Agregar una arista X del estado I al estado goto(I, X) Repetir hasta que no sea posible agregar nada más  $  ( ) s0

330 Oscar Bonilla 330Universidad Galileo Ejemplo de construcción de los estados del DFA Comenzar con la producción  $ Crear el primer estado como closure(  $) Elegir un estado I Para cada A   X  en I encontrar goto(I, X) si goto(I, X) no es ya un estado, crear uno Agregar una arista X del estado I al estado goto(I, X) Repetir hasta que no sea posible agregar nada más  $  ( ) s0

331 Oscar Bonilla 331Universidad Galileo Ejemplo de construcción de los estados del DFA Comenzar con la producción  $ Crear el primer estado como closure(  $) Elegir un estado I Para cada A   X  en I encontrar goto(I, X) si goto(I, X) no es ya un estado, crear uno Agregar una arista X del estado I al estado goto(I, X) Repetir hasta que no sea posible agregar nada más  $  ( ) s0 goto(, )

332 Oscar Bonilla 332Universidad Galileo Ejemplo de construcción de los estados del DFA Comenzar con la producción  $ Crear el primer estado como closure(  $) Elegir un estado I Para cada A   X  en I encontrar goto(I, X) si goto(I, X) no es ya un estado, crear uno Agregar una arista X del estado I al estado goto(I, X) Repetir hasta que no sea posible agregar nada más  $  ( ) s0  $ goto(, )

333 Oscar Bonilla 333Universidad Galileo Ejemplo de construcción de los estados del DFA Comenzar con la producción  $ Crear el primer estado como closure(  $) Elegir un estado I Para cada A   X  en I encontrar goto(I, X) si goto(I, X) no es ya un estado, crear uno Agregar una arista X del estado I al estado goto(I, X) Repetir hasta que no sea posible agregar nada más  $  ( ) s0  $

334 Oscar Bonilla 334Universidad Galileo Ejemplo de construcción de los estados del DFA Comenzar con la producción  $ Crear el primer estado como closure(  $) Elegir un estado I Para cada A   X  en I encontrar goto(I, X) si goto(I, X) no es ya un estado, crear uno Agregar una arista X del estado I al estado goto(I, X) Repetir hasta que no sea posible agregar nada más  $  ( ) s0  $ s1

335 Oscar Bonilla 335Universidad Galileo Ejemplo de construcción de los estados del DFA Comenzar con la producción  $ Crear el primer estado como closure(  $) Elegir un estado I Para cada A   X  en I encontrar goto(I, X) si goto(I, X) no es ya un estado, crear uno Agregar una arista X del estado I al estado goto(I, X) Repetir hasta que no sea posible agregar nada más  $  ( ) s0  $ s1

336 Oscar Bonilla 336Universidad Galileo Ejemplo de construcción de los estados del DFA Comenzar con la producción  $ Crear el primer estado como closure(  $) Elegir un estado I Para cada A   X  en I encontrar goto(I, X) si goto(I, X) no es ya un estado, crear uno Agregar una arista X del estado I al estado goto(I, X) Repetir hasta que no sea posible agregar nada más  $  ( ) s0  $ s1 X

337 Oscar Bonilla 337Universidad Galileo Ejemplo de construcción de los estados del DFA Comenzar con la producción  $ Crear el primer estado como closure(  $) Elegir un estado I Para cada A   X  en I encontrar goto(I, X) si goto(I, X) no es ya un estado, crear uno Agregar una arista X del estado I al estado goto(I, X) Repetir hasta que no sea posible agregar nada más  $  ( ) s0  $ s1 X

338 Oscar Bonilla 338Universidad Galileo Ejemplo de construcción de los estados del DFA Comenzar con la producción  $ Crear el primer estado como closure(  $) Elegir un estado I Para cada A   X  en I encontrar goto(I, X) si goto(I, X) no es ya un estado, crear uno Agregar una arista X del estado I al estado goto(I, X) Repetir hasta que no sea posible agregar nada más  $  ( ) s0  $ s1 X

339 Oscar Bonilla 339Universidad Galileo Ejemplo de construcción de los estados del DFA Comenzar con la producción  $ Crear el primer estado como closure(  $) Elegir un estado I Para cada A   X  en I encontrar goto(I, X) si goto(I, X) no es ya un estado, crear uno Agregar una arista X del estado I al estado goto(I, X) Repetir hasta que no sea posible agregar nada más  $  ( ) s0  $ s1 X goto(, ( )

340 Oscar Bonilla 340Universidad Galileo Ejemplo de construcción de los estados del DFA Comenzar con la producción  $ Crear el primer estado como closure(  $) Elegir un estado I Para cada A   X  en I encontrar goto(I, X) si goto(I, X) no es ya un estado, crear uno Agregar una arista X del estado I al estado goto(I, X) Repetir hasta que no sea posible agregar nada más  $  ( ) s0  $ s1 X  ( ) goto(, ( )

341 Oscar Bonilla 341Universidad Galileo Ejemplo de construcción de los estados del DFA Comenzar con la producción  $ Crear el primer estado como closure(  $) Elegir un estado I Para cada A   X  en I encontrar goto(I, X) si goto(I, X) no es ya un estado, crear uno Agregar una arista X del estado I al estado goto(I, X) Repetir hasta que no sea posible agregar nada más  $  ( ) s0  $ s1 X  ( ) goto(, ( )

342 Oscar Bonilla 342Universidad Galileo Ejemplo de construcción de los estados del DFA Comenzar con la producción  $ Crear el primer estado como closure(  $) Elegir un estado I Para cada A   X  en I encontrar goto(I, X) si goto(I, X) no es ya un estado, crear uno Agregar una arista X del estado I al estado goto(I, X) Repetir hasta que no sea posible agregar nada más  $  ( ) s0  $ s1 X  ( ) goto(, ( )

343 Oscar Bonilla 343Universidad Galileo Ejemplo de construcción de los estados del DFA Comenzar con la producción  $ Crear el primer estado como closure(  $) Elegir un estado I Para cada A   X  en I encontrar goto(I, X) si goto(I, X) no es ya un estado, crear uno Agregar una arista X del estado I al estado goto(I, X) Repetir hasta que no sea posible agregar nada más  $  ( ) s0  $ s1 X  ( )

344 Oscar Bonilla 344Universidad Galileo Ejemplo de construcción de los estados del DFA Comenzar con la producción  $ Crear el primer estado como closure(  $) Elegir un estado I Para cada A   X  en I encontrar goto(I, X) si goto(I, X) no es ya un estado, crear uno Agregar una arista X del estado I al estado goto(I, X) Repetir hasta que no sea posible agregar nada más  $  ( ) s0  $ s1 X  ( ) s2

345 Oscar Bonilla 345Universidad Galileo Ejemplo de construcción de los estados del DFA Comenzar con la producción  $ Crear el primer estado como closure(  $) Elegir un estado I Para cada A   X  en I encontrar goto(I, X) si goto(I, X) no es ya un estado, crear uno Agregar una arista X del estado I al estado goto(I, X) Repetir hasta que no sea posible agregar nada más  $  ( ) s0  $ s1 X  ( ) s2

346 Oscar Bonilla 346Universidad Galileo Ejemplo de construcción de los estados del DFA Comenzar con la producción  $ Crear el primer estado como closure(  $) Elegir un estado I Para cada A   X  en I encontrar goto(I, X) si goto(I, X) no es ya un estado, crear uno Agregar una arista X del estado I al estado goto(I, X) Repetir hasta que no sea posible agregar nada más  $  ( ) s0  $ s1 X  ( ) s2 (

347 Oscar Bonilla 347Universidad Galileo Ejemplo de construcción de los estados del DFA Comenzar con la producción  $ Crear el primer estado como closure(  $) Elegir un estado I Para cada A   X  en I encontrar goto(I, X) si goto(I, X) no es ya un estado, crear uno Agregar una arista X del estado I al estado goto(I, X) Repetir hasta que no sea posible agregar nada más  $  ( ) s0  $ s1 X  ( ) s2 (

348 Oscar Bonilla 348Universidad Galileo Ejemplo de construcción de los estados del DFA Comenzar con la producción  $ Crear el primer estado como closure(  $) Elegir un estado I Para cada A   X  en I encontrar goto(I, X) si goto(I, X) no es ya un estado, crear uno Agregar una arista X del estado I al estado goto(I, X) Repetir hasta que no sea posible agregar nada más  $  ( ) s0  $ s1 X  ( ) s2 (

349 Oscar Bonilla 349Universidad Galileo Ejemplo de construcción de los estados del DFA Comenzar con la producción  $ Crear el primer estado como closure(  $) Elegir un estado I Para cada A   X  en I encontrar goto(I, X) si goto(I, X) no es ya un estado, crear uno Agregar una arista X del estado I al estado goto(I, X) Repetir hasta que no sea posible agregar nada más  $  ( ) s0  $ s1 X  ( ) s2 ( goto(, ( )

350 Oscar Bonilla 350Universidad Galileo Ejemplo de construcción de los estados del DFA Comenzar con la producción  $ Crear el primer estado como closure(  $) Elegir un estado I Para cada A   X  en I encontrar goto(I, X) si goto(I, X) no es ya un estado, crear uno Agregar una arista X del estado I al estado goto(I, X) Repetir hasta que no sea posible agregar nada más  $  ( ) s0  $ s1 X  ( ) s2 ( goto(, ( ) El mismo de la vez pasada

351 Oscar Bonilla 351Universidad Galileo Ejemplo de construcción de los estados del DFA Comenzar con la producción  $ Crear el primer estado como closure(  $) Elegir un estado I Para cada A   X  en I encontrar goto(I, X) si goto(I, X) no es ya un estado, crear uno Agregar una arista X del estado I al estado goto(I, X) Repetir hasta que no sea posible agregar nada más  $  ( ) s0  $ s1 X  ( ) s2 (

352 Oscar Bonilla 352Universidad Galileo Ejemplo de construcción de los estados del DFA Comenzar con la producción  $ Crear el primer estado como closure(  $) Elegir un estado I Para cada A   X  en I encontrar goto(I, X) si goto(I, X) no es ya un estado, crear uno Agregar una arista X del estado I al estado goto(I, X) Repetir hasta que no sea posible agregar nada más  $  ( ) s0  $ s1 X  ( ) s2 (

353 Oscar Bonilla 353Universidad Galileo Ejemplo de construcción de los estados del DFA Comenzar con la producción  $ Crear el primer estado como closure(  $) Elegir un estado I Para cada A   X  en I encontrar goto(I, X) si goto(I, X) no es ya un estado, crear uno Agregar una arista X del estado I al estado goto(I, X) Repetir hasta que no sea posible agregar nada más  $  ( ) s0  $ s1 X  ( ) s2 (

354 Oscar Bonilla 354Universidad Galileo Ejemplo de construcción de los estados del DFA Comenzar con la producción  $ Crear el primer estado como closure(  $) Elegir un estado I Para cada A   X  en I encontrar goto(I, X) si goto(I, X) no es ya un estado, crear uno Agregar una arista X del estado I al estado goto(I, X) Repetir hasta que no sea posible agregar nada más  $  ( ) s0  $ s1 X  ( ) s2 (

355 Oscar Bonilla 355Universidad Galileo Ejemplo de construcción de los estados del DFA Comenzar con la producción  $ Crear el primer estado como closure(  $) Elegir un estado I Para cada A   X  en I encontrar goto(I, X) si goto(I, X) no es ya un estado, crear uno Agregar una arista X del estado I al estado goto(I, X) Repetir hasta que no sea posible agregar nada más  $  ( ) s0  $ s1 X  ( ) s2 (

356 Oscar Bonilla 356Universidad Galileo Ejemplo de construcción de los estados del DFA  $  ( ) s0  $ s1 X  ( ) s2 (

357 Oscar Bonilla 357Universidad Galileo Ejemplo de construcción de los estados del DFA  $  ( ) s0  $ s1 X  ( ) s2 (  ( ) X s3

358 Oscar Bonilla 358Universidad Galileo Ejemplo de construcción de los estados del DFA  $  ( ) s0  $ s1 X  ( ) s2 (  ( ) X s3 (

359 Oscar Bonilla 359Universidad Galileo Ejemplo de construcción de los estados del DFA  $  ( ) s0  $ s1 X  ( ) s2 (  ( ) X s3 (  ( ) ) s5

360 Oscar Bonilla 360Universidad Galileo Ejemplo de construcción de los estados del DFA  $  ( ) s0  $ s1 X  ( ) s2 (  ( ) X s3 (  ( ) ) s5

361 Oscar Bonilla 361Universidad Galileo Ejemplo de construcción de los estados del DFA  $  ( ) s0  $ s1 X  ( ) s2 (  ( ) X s3 (  ( ) ) s5

362 Oscar Bonilla 362Universidad Galileo Ejemplo de construcción de los estados del DFA  $  ( ) s0  $ s1 X  ( ) s2 (  ( ) X s3 (  ( ) ) s5  ( ) ) s4

363 Oscar Bonilla 363Universidad Galileo Ejemplo de construcción de los estados del DFA  $  ( ) s0  $ s1 X  ( ) s2 (  ( ) X s3 (  ( ) ) s5  ( ) ) s4

364 Oscar Bonilla 364Universidad Galileo Ejemplo de construcción de los estados del DFA  $  ( ) s0  $ s1 X  ( ) s2 (  ( ) X s3 (  ( ) ) s5  ( ) ) s4

365 Oscar Bonilla 365Universidad Galileo Construyendo un Parser Engine LR(0) Construir un DFA –HECHO Construir una tabla de parseo usando el DFA

366 Oscar Bonilla 366Universidad 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)

367 Oscar Bonilla 367Universidad Galileo Ejemplo de Construcción de Parse Table  $  ( ) s0  $ s1 X  ( ) s2 (  ( ) X s3 (  ( ) ) s5  ( ) ) s4

368 Oscar Bonilla 368Universidad Galileo Ejemplo de Construcción de Parse Table  $  ( ) s0  $ s1 X  ( ) s2 (  ( ) X s3 (  ( ) ) s5  ( ) ) s4

369 Oscar Bonilla 369Universidad Galileo Ejemplo de Construcción de Parse Table  $  ( ) s0  $ s1 X  ( ) s2 (  ( ) X s3 (  ( ) ) s5  ( ) ) s4

370 Oscar Bonilla 370Universidad Galileo Ejemplo de Construcción de Parse Table  $  ( ) s0  $ s1 X  ( ) s2 (  ( ) X s3 (  ( ) ) s5  ( ) ) s4

371 Oscar Bonilla 371Universidad Galileo Ejemplo de Construcción de Parse Table s0  $ s1 X  ( ) s2 (  ( ) X s3 (  ( ) ) s5  ( ) ) s4  $  ( )

372 Oscar Bonilla 372Universidad Galileo Ejemplo de Construcción de Parse Table s0  $ s1 X  ( ) s2 (  ( ) X s3 (  ( ) ) s5  ( ) ) s4  $  ( )

373 Oscar Bonilla 373Universidad Galileo Ejemplo de Construcción de Parse Table s0  $ s1 X  ( ) s2 (  ( ) X s3 (  ( ) ) s5  ( ) ) s4  $  ( )

374 Oscar Bonilla 374Universidad Galileo Ejemplo de Construcción de Parse Table s0  $ s1 X  ( ) s2 (  ( ) X s3 (  ( ) ) s5  ( ) ) s4  $  ( )

375 Oscar Bonilla 375Universidad Galileo Ejemplo de Construcción de Parse Table  $  ( ) s0 s1 X  ( ) s2 (  ( ) X s3 (  ( ) ) s5  ( ) ) s4  $

376 Oscar Bonilla 376Universidad Galileo Ejemplo de Construcción de Parse Table  $  ( ) s0 s1 X  ( ) s2 (  ( ) X s3 (  ( ) ) s5  ( ) ) s4  $

377 Oscar Bonilla 377Universidad Galileo Ejemplo de Construcción de Parse Table  $  ( ) s0 s1 X  ( ) s2 (  ( ) X s3 (  ( ) ) s5  ( ) ) s4  $

378 Oscar Bonilla 378Universidad Galileo Ejemplo de Construcción de Parse Table  $  ( ) s0 s1 X s2 (  ( ) X s3 (  ( ) ) s5  ( ) ) s4  $  ( )

379 Oscar Bonilla 379Universidad Galileo Ejemplo de Construcción de Parse Table  $  ( ) s0 s1 X s2 (  ( ) X s3 (  ( ) ) s5  ( ) ) s4  $  ( )

380 Oscar Bonilla 380Universidad Galileo Ejemplo de Construcción de Parse Table  $  ( ) s0 s1 X s2 (  ( ) X s3 (  ( ) ) s5  ( ) ) s4  $  ( )

381 Oscar Bonilla 381Universidad Galileo Ejemplo de Construcción de Parse Table  $  ( ) s0 s1 X s2 (  ( ) X s3 (  ( ) ) s5  ( ) ) s4  $  ( )

382 Oscar Bonilla 382Universidad Galileo Ejemplo de Construcción de Parse Table  $  ( ) s0 s1 X s2 (  ( ) X s3 (  ( ) ) s5  ( ) ) s4  $  ( )

383 Oscar Bonilla 383Universidad Galileo Ejemplo de Construcción de Parse Table  $  ( ) s0 s1 X s2 ( X s3 (  ( ) ) s5  ( ) ) s4  $  ( )

384 Oscar Bonilla 384Universidad Galileo Ejemplo de Construcción de Parse Table  $  ( ) s0 s1 X s2 ( X s3 (  ( ) ) s5  ( ) ) s4  $  ( )

385 Oscar Bonilla 385Universidad Galileo Ejemplo de Construcción de Parse Table  $  ( ) s0 s1 X s2 ( X s3 (  ( ) ) s5  ( ) ) s4  $  ( )

386 Oscar Bonilla 386Universidad Galileo Ejemplo de Construcción de Parse Table  $  ( ) s0 s1 X s2 ( X s3 (  ( ) ) s5  ( ) ) s4  $  ( )

387 Oscar Bonilla 387Universidad Galileo Ejemplo de Construcción de Parse Table  $  ( ) s0  $ s1 X  ( ) s2 (  ( ) X s3 (  ( ) ) s5  ( ) ) s4

388 Oscar Bonilla 388Universidad Galileo Ejemplo de Construcción de Parse Table  $  ( ) s0  $ s1 X  ( ) s2 (  ( ) X s3 (  ( ) ) s5  ( ) ) s4

389 Oscar Bonilla 389Universidad Galileo Ejemplo de Construcción de Parse Table  $  ( ) s0  $ s1 X  ( ) s2 (  ( ) X s3 (  ( ) ) s5  ( ) ) s4

390 Oscar Bonilla 390Universidad 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) Parser Engine

391 Oscar Bonilla 391Universidad Galileo Lecturas El Tigre –Secciones 3.0 a 3.3 El Dragón –Secciones 4.2 a 4.5 y 4.7


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

Presentaciones similares


Anuncios Google