Descargar la presentación
La descarga está en progreso. Por favor, espere
Publicada porSancha Rolan Modificado hace 9 años
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
Presentaciones similares
© 2024 SlidePlayer.es Inc.
All rights reserved.