dept. de lenguajes y sistemas informáticos universidad de ... · la primera acción de un...

Post on 08-May-2020

16 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Tema 3: Análisis sintáctico descendente

Procesamiento de Lenguajes

Dept. de Lenguajes y Sistemas InformáticosUniversidad de Alicante

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 1 / 41

¿Cómo funciona el analizador sintáctico?

La primera acción de un analizador sintáctico es obtener un tokende la entrada, llamando al analizador léxico (que trabaja como unsubprograma)

El analizador va leyendo tokens del analizador léxico a la vez queva generando la traducción, comprobando que la sintaxis escorrecta y comprobando las restricciones semánticas.IMPORTANTE: Las tres tareas (traducción, sintaxis, semántica)se realizan de forma simultánea, aunque a veces es necesarioacumular varios tokens para realizar alguna comprobación ogenerar la traducción

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 2 / 41

¿Cómo funciona el analizador sintáctico?

La primera acción de un analizador sintáctico es obtener un tokende la entrada, llamando al analizador léxico (que trabaja como unsubprograma)El analizador va leyendo tokens del analizador léxico a la vez queva generando la traducción, comprobando que la sintaxis escorrecta y comprobando las restricciones semánticas.

IMPORTANTE: Las tres tareas (traducción, sintaxis, semántica)se realizan de forma simultánea, aunque a veces es necesarioacumular varios tokens para realizar alguna comprobación ogenerar la traducción

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 2 / 41

¿Cómo funciona el analizador sintáctico?

La primera acción de un analizador sintáctico es obtener un tokende la entrada, llamando al analizador léxico (que trabaja como unsubprograma)El analizador va leyendo tokens del analizador léxico a la vez queva generando la traducción, comprobando que la sintaxis escorrecta y comprobando las restricciones semánticas.IMPORTANTE: Las tres tareas (traducción, sintaxis, semántica)se realizan de forma simultánea, aunque a veces es necesarioacumular varios tokens para realizar alguna comprobación ogenerar la traducción

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 2 / 41

Ejemplo: gramática de expresiones simples

E → E opsuma TE → TT → T opmul FT → FF → idF → numF → pari E pard

2+3*4 suma(2,prod(3,4))2+3-4 resta(suma(2,3),4)2+3*(4-5) suma(2,prod(3,resta(4,5)))

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 3 / 41

Algoritmos de análisis sintáctico

Para cualquier GIC: Cocke-Younger-Kasami (CYK), Earley,Tomita, ...

≈ O(n3)

Si se desea un coste temporal lineal, O(n), es necesario ponerrestricciones a las GIC, es decir, usar subconjuntos del conjuntode las GIC. Hay dos estrategias:

I Análisis sintáctico descendente (ASD)I Análisis sintáctico ascendente (ASA)

Implementación de analizadores sintácticos:I A mano (para gramáticas simples)I Usando generadores automáticos: yacc/bison, ANTLR, PCCTS, ...

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 4 / 41

Algoritmos de análisis sintáctico

Para cualquier GIC: Cocke-Younger-Kasami (CYK), Earley,Tomita, ... ≈ O(n3)

Si se desea un coste temporal lineal, O(n), es necesario ponerrestricciones a las GIC, es decir, usar subconjuntos del conjuntode las GIC. Hay dos estrategias:

I Análisis sintáctico descendente (ASD)I Análisis sintáctico ascendente (ASA)

Implementación de analizadores sintácticos:I A mano (para gramáticas simples)I Usando generadores automáticos: yacc/bison, ANTLR, PCCTS, ...

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 4 / 41

Algoritmos de análisis sintáctico

Para cualquier GIC: Cocke-Younger-Kasami (CYK), Earley,Tomita, ... ≈ O(n3)

Si se desea un coste temporal lineal, O(n), es necesario ponerrestricciones a las GIC, es decir, usar subconjuntos del conjuntode las GIC. Hay dos estrategias:

I Análisis sintáctico descendente (ASD)I Análisis sintáctico ascendente (ASA)

Implementación de analizadores sintácticos:I A mano (para gramáticas simples)I Usando generadores automáticos: yacc/bison, ANTLR, PCCTS, ...

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 4 / 41

Algoritmos de análisis sintáctico

Para cualquier GIC: Cocke-Younger-Kasami (CYK), Earley,Tomita, ... ≈ O(n3)

Si se desea un coste temporal lineal, O(n), es necesario ponerrestricciones a las GIC, es decir, usar subconjuntos del conjuntode las GIC. Hay dos estrategias:

I Análisis sintáctico descendente (ASD)I Análisis sintáctico ascendente (ASA)

Implementación de analizadores sintácticos:I A mano (para gramáticas simples)I Usando generadores automáticos: yacc/bison, ANTLR, PCCTS, ...

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 4 / 41

Análisis sintáctico descendente: un ejemplo

El análisis sintáctico descendente trata de reproducir la derivación porla izquierda de la cadena de entrada (solo puede haber una)Ejemplo: int a,b,c;

D → Tipo id LTipo → intTipo → floatL → coma id LL → pyc

D ⇒ Tipo id(a) L⇒ int id(a) L⇒ int id(a) coma id(b) L⇒ int id(a) coma id(b) coma id(c) L⇒ int id(a) coma id(b) coma id(c) pyc

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 5 / 41

Análisis sintáctico ascendente: un ejemplo

El análisis sintáctico ascendente trata de reconstruir la inversa de unaderivación por la derecha de la cadena de entradaEjemplo:

int id(a) coma id(b) coma id(c) pyc ⇐Tipo id(a) coma id(b) coma id(c) pyc ⇐Tipo id(a) coma id(b) coma id(c) L ⇐Tipo id(a) coma id(b) L ⇐Tipo id(a) L ⇐D

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 6 / 41

Características no deseables para el análisis lineal

Análisis sintáctico descendenteI Recursividad por la izquierdaI Factores comunes por la izquierdaI Ambigüedad

Análisis sintáctico ascendenteI Ambigüedad

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 7 / 41

Condiciones para el ASD en tiempo linealPara realizar un análisis sintáctico lineal, el analizador debe saberen todo momento qué regla ha de aplicar, no puede hacerbacktracking. Por tanto, debe ser un ASD predictivo

Siempre se tiene que tratar de derivar el no terminal más a laizquierda en la cadena de símbolos. Inicialmente la cadena desímbolos sólo contiene el símbolo inicial, pero según se vanaplicando reglas contiene terminales y no terminales.Ejemplo:

A −→ a B CB −→ b basB −→ big C bossC −→ εC −→ c

A ⇒ a B C ⇒ a b bas C . . .

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 8 / 41

Condiciones para el ASD en tiempo linealPara realizar un análisis sintáctico lineal, el analizador debe saberen todo momento qué regla ha de aplicar, no puede hacerbacktracking. Por tanto, debe ser un ASD predictivoSiempre se tiene que tratar de derivar el no terminal más a laizquierda en la cadena de símbolos. Inicialmente la cadena desímbolos sólo contiene el símbolo inicial, pero según se vanaplicando reglas contiene terminales y no terminales.Ejemplo:

A −→ a B CB −→ b basB −→ big C bossC −→ εC −→ c

A ⇒ a B C ⇒ a b bas C . . .

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 8 / 41

Condiciones para el ASD predictivoA la vez que se van aplicando reglas, hay que comprobar que losterminales que aparecen (por la izquierda) coinciden (match) conlos que aparecen en la cadena de entrada.

Pero, dado un no terminal B , ... ¿cómo se puede predecir quéregla hay que aplicar? Mirando los primeros símbolos de laspartes derechas de BEjemplo:

Gramática Entrada DerivaciónA −→ a B C a b bas c AB −→ b bas a b bas c a B CB −→ big C boss b bas c B CC −→ ε b bas c b bas CC −→ c bas c bas C

c Cc c

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 9 / 41

Condiciones para el ASD predictivoA la vez que se van aplicando reglas, hay que comprobar que losterminales que aparecen (por la izquierda) coinciden (match) conlos que aparecen en la cadena de entrada.Pero, dado un no terminal B , ... ¿cómo se puede predecir quéregla hay que aplicar?

Mirando los primeros símbolos de laspartes derechas de BEjemplo:

Gramática Entrada DerivaciónA −→ a B C a b bas c AB −→ b bas a b bas c a B CB −→ big C boss b bas c B CC −→ ε b bas c b bas CC −→ c bas c bas C

c Cc c

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 9 / 41

Condiciones para el ASD predictivoA la vez que se van aplicando reglas, hay que comprobar que losterminales que aparecen (por la izquierda) coinciden (match) conlos que aparecen en la cadena de entrada.Pero, dado un no terminal B , ... ¿cómo se puede predecir quéregla hay que aplicar? Mirando los primeros símbolos de laspartes derechas de B

Ejemplo:

Gramática Entrada DerivaciónA −→ a B C a b bas c AB −→ b bas a b bas c a B CB −→ big C boss b bas c B CC −→ ε b bas c b bas CC −→ c bas c bas C

c Cc c

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 9 / 41

Condiciones para el ASD predictivoA la vez que se van aplicando reglas, hay que comprobar que losterminales que aparecen (por la izquierda) coinciden (match) conlos que aparecen en la cadena de entrada.Pero, dado un no terminal B , ... ¿cómo se puede predecir quéregla hay que aplicar? Mirando los primeros símbolos de laspartes derechas de BEjemplo:

Gramática Entrada DerivaciónA −→ a B C a b bas c AB −→ b bas a b bas c a B CB −→ big C boss b bas c B CC −→ ε b bas c b bas CC −→ c bas c bas C

c Cc c?? ??

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 9 / 41

Condiciones para el ASD predictivoA la vez que se van aplicando reglas, hay que comprobar que losterminales que aparecen (por la izquierda) coinciden (match) conlos que aparecen en la cadena de entrada.Pero, dado un no terminal B , ... ¿cómo se puede predecir quéregla hay que aplicar? Mirando los primeros símbolos de laspartes derechas de BEjemplo:

Gramática Entrada DerivaciónA −→ a B C a b bas c AB −→ b bas a b bas c a B CB −→ big C boss b bas c B CC −→ ε b bas c b bas CC −→ c bas c bas C

c Cc cEOF EOF

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 9 / 41

Condiciones para el ASD predictivoA la vez que se van aplicando reglas, hay que comprobar que losterminales que aparecen (por la izquierda) coinciden (match) conlos que aparecen en la cadena de entrada.Pero, dado un no terminal B , ... ¿cómo se puede predecir quéregla hay que aplicar? Mirando los primeros símbolos de laspartes derechas de BEjemplo:

Gramática Entrada DerivaciónA −→ a B C a b bas c AB −→ b bas a b bas c a B CB −→ big C boss b bas c B CC −→ ε b bas c b bas CC −→ c bas c bas C

c Cc c$ $

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 9 / 41

Algoritmo de análisis sintáctico descendente predictivo

1 Inicialmente se tiene la cadena de entrada y el símbolo inicial dela gramática en la derivación

2 Repetir hasta llegar al final de la cadena de entrada ($):I Si el símbolo más a la izquierda en la derivación es un no terminal,

predecir qué regla aplicar en función del símbolo que hay en laentrada, y aplicar la regla

I Si ese símbolo es un terminal, hay que compararlo con el símbolode la entrada y avanzar

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 10 / 41

Algoritmo de análisis sintáctico descendente predictivo

1 Inicialmente se tiene la cadena de entrada y el símbolo inicial dela gramática en la derivación

2 Repetir hasta llegar al final de la cadena de entrada ($):I Si el símbolo más a la izquierda en la derivación es un no terminal,

predecir qué regla aplicar en función del símbolo que hay en laentrada, y aplicar la regla

I Si ese símbolo es un terminal, hay que compararlo con el símbolode la entrada y avanzar

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 10 / 41

Algoritmo de análisis sintáctico descendente predictivo

1 Inicialmente se tiene la cadena de entrada y el símbolo inicial dela gramática en la derivación

2 Repetir hasta llegar al final de la cadena de entrada ($):I Si el símbolo más a la izquierda en la derivación es un no terminal,

predecir qué regla aplicar en función del símbolo que hay en laentrada, y aplicar la regla

I Si ese símbolo es un terminal, hay que compararlo con el símbolode la entrada y avanzar

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 10 / 41

Algoritmo de análisis sintáctico descendente predictivo

1 Inicialmente se tiene la cadena de entrada y el símbolo inicial dela gramática en la derivación

2 Repetir hasta llegar al final de la cadena de entrada ($):I Si el símbolo más a la izquierda en la derivación es un no terminal,

predecir qué regla aplicar en función del símbolo que hay en laentrada, y aplicar la regla

I Si ese símbolo es un terminal, hay que compararlo con el símbolode la entrada y avanzar ¿Y si no coinciden?

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 10 / 41

Algoritmo de análisis sintáctico descendente predictivo

1 Inicialmente se tiene la cadena de entrada y el símbolo inicial dela gramática en la derivación

2 Repetir hasta llegar al final de la cadena de entrada ($):I Si el símbolo más a la izquierda en la derivación es un no terminal,

predecir qué regla aplicar en función del símbolo que hay en laentrada, y aplicar la regla ¿Y si no hay ninguna regla aplicable?

I Si ese símbolo es un terminal, hay que compararlo con el símbolode la entrada y avanzar ¿Y si no coinciden?

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 10 / 41

Predicción de la regla a aplicar (1)

Para elegir (predecir) qué regla aplicar para un no terminal A, hay queconsultar la parte derecha de las reglas de A:

A −→ all B CA −→ badB −→ big C bossB −→ betC −→ catC −→ cow

En este caso, está chupao, basta con mirar el terminal de la entrada yel no terminal a derivar, y se elige la regla a aplicar

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 11 / 41

Predicción de la regla a aplicar (2)

... pero ¿y si al principio de la parte derecha hay un no terminal?

A −→ B CA −→ badB −→ big C bossB −→ betC −→ catC −→ cow

En este caso, es necesario tener calculados el conjunto de terminales queaparecen al principio de la parte derecha de las reglas de un no terminal o,mejor dicho, el conjunto de terminales que aparecerían al principio de lascadenas generadas por el no terminal

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 12 / 41

Predicción de la regla a aplicar (2)

... pero ¿y si al principio de la parte derecha hay un no terminal?

A −→ B CA −→ badB −→ big C bossB −→ betC −→ catC −→ cow

En este caso, es necesario tener calculados el conjunto de terminales queaparecen al principio de la parte derecha de las reglas de un no terminal

o,mejor dicho, el conjunto de terminales que aparecerían al principio de lascadenas generadas por el no terminal

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 12 / 41

Predicción de la regla a aplicar (2)

... pero ¿y si al principio de la parte derecha hay un no terminal?

A −→ B CA −→ badB −→ big C bossB −→ betC −→ catC −→ cow

En este caso, es necesario tener calculados el conjunto de terminales queaparecen al principio de la parte derecha de las reglas de un no terminal o,mejor dicho, el conjunto de terminales que aparecerían al principio de lascadenas generadas por el no terminal

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 12 / 41

Predicción de la regla a aplicar (2)

... pero ¿y si al principio de la parte derecha hay un no terminal?

A −→ B CA −→ bad { bad }B −→ big C boss { big }B −→ bet { bet }C −→ cat { cat }C −→ cow { cow }

En este caso, es necesario tener calculados el conjunto de terminales queaparecen al principio de la parte derecha de las reglas de un no terminal o,mejor dicho, el conjunto de terminales que aparecerían al principio de lascadenas generadas por el no terminal

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 12 / 41

Predicción de la regla a aplicar (2)

... pero ¿y si al principio de la parte derecha hay un no terminal?

A −→ B C { big ,bet }A −→ bad { bad }B −→ big C boss { big }B −→ bet { bet }C −→ cat { cat }C −→ cow { cow }

En este caso, es necesario tener calculados el conjunto de terminales queaparecen al principio de la parte derecha de las reglas de un no terminal o,mejor dicho, el conjunto de terminales que aparecerían al principio de lascadenas generadas por el no terminal

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 12 / 41

Predicción de la regla a aplicar (3)

IMPORTANTE: el conjunto de símbolos que aparecen al principio delas cadenas generadas por un no terminal se conoce con el nombrede conjunto de PRIMEROS (FIRST), y más adelante veremos cómocalcularlo formalmente.

A −→ B CA −→ badB −→ big C bossB −→ betC −→ catC −→ cow

PRIMEROS(A) = ??PRIMEROS(B) = { big ,bet }PRIMEROS(C) = { cat ,cow }

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 13 / 41

Predicción de la regla a aplicar (3)

IMPORTANTE: el conjunto de símbolos que aparecen al principio delas cadenas generadas por un no terminal se conoce con el nombrede conjunto de PRIMEROS (FIRST), y más adelante veremos cómocalcularlo formalmente.

A −→ B CA −→ badB −→ big C bossB −→ betC −→ catC −→ cow

PRIMEROS(A) = { bad , }PRIMEROS(B) = { big ,bet }PRIMEROS(C) = { cat ,cow }

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 13 / 41

Predicción de la regla a aplicar (3)

IMPORTANTE: el conjunto de símbolos que aparecen al principio delas cadenas generadas por un no terminal se conoce con el nombrede conjunto de PRIMEROS (FIRST), y más adelante veremos cómocalcularlo formalmente.

A −→ B CA −→ badB −→ big C bossB −→ betC −→ catC −→ cow

PRIMEROS(A) = { bad , big ,bet }PRIMEROS(B) = { big ,bet }PRIMEROS(C) = { cat ,cow }

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 13 / 41

Predicción de la regla a aplicar (4)

¿Y si un no terminal genera la cadena vacía ε ?

A −→ B CA −→ badB −→ big C bossB −→ εC −→ catC −→ cow

PRIMEROS(A) = ??PRIMEROS(B) = { big , ε}PRIMEROS(C) = { cat ,cow }

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 14 / 41

Predicción de la regla a aplicar (4)

¿Y si un no terminal genera la cadena vacía ε ?

A −→ B CA −→ badB −→ big C bossB −→ εC −→ catC −→ cow

PRIMEROS(A) = { bad , }PRIMEROS(B) = { big , ε}PRIMEROS(C) = { cat ,cow }

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 14 / 41

Predicción de la regla a aplicar (4)

¿Y si un no terminal genera la cadena vacía ε ?

A −→ B CA −→ badB −→ big C bossB −→ εC −→ catC −→ cow

PRIMEROS(A) = { bad , big , ??}PRIMEROS(B) = { big , ε}PRIMEROS(C) = { cat ,cow }

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 14 / 41

Predicción de la regla a aplicar (4)

¿Y si un no terminal genera la cadena vacía ε ?

A −→ B CA −→ badB −→ big C bossB −→ εC −→ catC −→ cow

PRIMEROS(A) = { bad , big , cat , cow }PRIMEROS(B) = { big , ε}PRIMEROS(C) = { cat ,cow }

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 14 / 41

Predicción de la regla a aplicar (5)

Resumen:En un momento dado del análisis, se tiene que derivar un noterminal A. Además, se conoce el símbolo que aparece en laentrada

Dado el símbolo de la entrada y el no terminal A, se debe elegirqué regla de A hay que aplicar para llegar a un análisis correctosin backtracking. Para elegir la regla a aplicar, hay que consultarlas partes derechas de las reglas de A:

I Si la parte derecha de una regla empieza por un terminal y eseterminal coincide con el símbolo de la entrada, ésa es la regla quehay que aplicar

I Si la parte derecha de una regla empieza por un no terminal B, hayque consultar los símbolos que pueden ser generados por B; si elsímbolo de la entrada está entre esos símbolos, ésa es la reglaque hay que aplicar ¿Y si B genera ε? Hay que mirar los símbolosque aparecen después de B en la regla de A

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 15 / 41

Predicción de la regla a aplicar (5)

Resumen:En un momento dado del análisis, se tiene que derivar un noterminal A. Además, se conoce el símbolo que aparece en laentradaDado el símbolo de la entrada y el no terminal A, se debe elegirqué regla de A hay que aplicar para llegar a un análisis correctosin backtracking. Para elegir la regla a aplicar, hay que consultarlas partes derechas de las reglas de A:

I Si la parte derecha de una regla empieza por un terminal y eseterminal coincide con el símbolo de la entrada, ésa es la regla quehay que aplicar

I Si la parte derecha de una regla empieza por un no terminal B, hayque consultar los símbolos que pueden ser generados por B; si elsímbolo de la entrada está entre esos símbolos, ésa es la reglaque hay que aplicar ¿Y si B genera ε? Hay que mirar los símbolosque aparecen después de B en la regla de A

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 15 / 41

Predicción de la regla a aplicar (5)

Resumen:En un momento dado del análisis, se tiene que derivar un noterminal A. Además, se conoce el símbolo que aparece en laentradaDado el símbolo de la entrada y el no terminal A, se debe elegirqué regla de A hay que aplicar para llegar a un análisis correctosin backtracking. Para elegir la regla a aplicar, hay que consultarlas partes derechas de las reglas de A:

I Si la parte derecha de una regla empieza por un terminal y eseterminal coincide con el símbolo de la entrada, ésa es la regla quehay que aplicar

I Si la parte derecha de una regla empieza por un no terminal B, hayque consultar los símbolos que pueden ser generados por B; si elsímbolo de la entrada está entre esos símbolos, ésa es la reglaque hay que aplicar ¿Y si B genera ε? Hay que mirar los símbolosque aparecen después de B en la regla de A

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 15 / 41

Predicción de la regla a aplicar (5)

Resumen:En un momento dado del análisis, se tiene que derivar un noterminal A. Además, se conoce el símbolo que aparece en laentradaDado el símbolo de la entrada y el no terminal A, se debe elegirqué regla de A hay que aplicar para llegar a un análisis correctosin backtracking. Para elegir la regla a aplicar, hay que consultarlas partes derechas de las reglas de A:

I Si la parte derecha de una regla empieza por un terminal y eseterminal coincide con el símbolo de la entrada, ésa es la regla quehay que aplicar

I Si la parte derecha de una regla empieza por un no terminal B, hayque consultar los símbolos que pueden ser generados por B; si elsímbolo de la entrada está entre esos símbolos, ésa es la reglaque hay que aplicar

¿Y si B genera ε? Hay que mirar los símbolosque aparecen después de B en la regla de A

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 15 / 41

Predicción de la regla a aplicar (5)

Resumen:En un momento dado del análisis, se tiene que derivar un noterminal A. Además, se conoce el símbolo que aparece en laentradaDado el símbolo de la entrada y el no terminal A, se debe elegirqué regla de A hay que aplicar para llegar a un análisis correctosin backtracking. Para elegir la regla a aplicar, hay que consultarlas partes derechas de las reglas de A:

I Si la parte derecha de una regla empieza por un terminal y eseterminal coincide con el símbolo de la entrada, ésa es la regla quehay que aplicar

I Si la parte derecha de una regla empieza por un no terminal B, hayque consultar los símbolos que pueden ser generados por B; si elsímbolo de la entrada está entre esos símbolos, ésa es la reglaque hay que aplicar ¿Y si B genera ε?

Hay que mirar los símbolosque aparecen después de B en la regla de A

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 15 / 41

Predicción de la regla a aplicar (5)

Resumen:En un momento dado del análisis, se tiene que derivar un noterminal A. Además, se conoce el símbolo que aparece en laentradaDado el símbolo de la entrada y el no terminal A, se debe elegirqué regla de A hay que aplicar para llegar a un análisis correctosin backtracking. Para elegir la regla a aplicar, hay que consultarlas partes derechas de las reglas de A:

I Si la parte derecha de una regla empieza por un terminal y eseterminal coincide con el símbolo de la entrada, ésa es la regla quehay que aplicar

I Si la parte derecha de una regla empieza por un no terminal B, hayque consultar los símbolos que pueden ser generados por B; si elsímbolo de la entrada está entre esos símbolos, ésa es la reglaque hay que aplicar ¿Y si B genera ε? Hay que mirar los símbolosque aparecen después de B en la regla de A

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 15 / 41

Predicción de la regla a aplicar (6)

¿Y si ...

... todos los símbolos de la parte derecha de la regla de A son noterminales y todos generan ε ?

A −→ B CA −→ . . .B −→ εB −→ . . .C −→ εC −→ . . .

... o bien la parte derecha de A es directamente ε ?

En esos casos, parece que mirando solamente los PRIMEROS no essuficiente para decidir qué regla aplicar

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 16 / 41

Predicción de la regla a aplicar (6)

¿Y si ...

... todos los símbolos de la parte derecha de la regla de A son noterminales y todos generan ε ?

A −→ B CA −→ . . .B −→ εB −→ . . .C −→ εC −→ . . .

... o bien la parte derecha de A es directamente ε ?

En esos casos, parece que mirando solamente los PRIMEROS no essuficiente para decidir qué regla aplicar

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 16 / 41

Predicción de la regla a aplicar (6)

¿Y si ...

... todos los símbolos de la parte derecha de la regla de A son noterminales y todos generan ε ?

A −→ B CA −→ . . .B −→ εB −→ . . .C −→ εC −→ . . .

... o bien la parte derecha de A es directamente ε ?

En esos casos, parece que mirando solamente los PRIMEROS no essuficiente para decidir qué regla aplicar

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 16 / 41

Predicción de la regla a aplicar (7)Hay dos soluciones al problema de las reglas que generan ε :

1 Cuando no se puede aplicar ninguna otra regla, se aplica la regla quegenera ε (algunos compiladores lo hacen, porque si hay un error en laentrada se detectará más adelante, al emparejar terminales)

2 Mirar, antes de decidir si aplicar la regla que genera ε , los símbolos quepueden aparecer después de A en una derivación válidaEjemplo:

A −→ B CA −→ ant A allB −→ big C badB −→ bus A bossB −→ εC −→ catC −→ ε

El conjunto de símbolos que pueden aparecer después de un noterminal A en una derivación válida se denomina el conjunto deSIGUIENTES de A: SIGUIENTES(A) = {all , boss }

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 17 / 41

Predicción de la regla a aplicar (7)Hay dos soluciones al problema de las reglas que generan ε :

1 Cuando no se puede aplicar ninguna otra regla, se aplica la regla quegenera ε (algunos compiladores lo hacen, porque si hay un error en laentrada se detectará más adelante, al emparejar terminales)

2 Mirar, antes de decidir si aplicar la regla que genera ε , los símbolos quepueden aparecer después de A en una derivación válida

Ejemplo:A −→ B CA −→ ant A allB −→ big C badB −→ bus A bossB −→ εC −→ catC −→ ε

El conjunto de símbolos que pueden aparecer después de un noterminal A en una derivación válida se denomina el conjunto deSIGUIENTES de A: SIGUIENTES(A) = {all , boss }

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 17 / 41

Predicción de la regla a aplicar (7)Hay dos soluciones al problema de las reglas que generan ε :

1 Cuando no se puede aplicar ninguna otra regla, se aplica la regla quegenera ε (algunos compiladores lo hacen, porque si hay un error en laentrada se detectará más adelante, al emparejar terminales)

2 Mirar, antes de decidir si aplicar la regla que genera ε , los símbolos quepueden aparecer después de A en una derivación válidaEjemplo:

A −→ B CA −→ ant A allB −→ big C badB −→ bus A bossB −→ εC −→ catC −→ ε

El conjunto de símbolos que pueden aparecer después de un noterminal A en una derivación válida se denomina el conjunto deSIGUIENTES de A: SIGUIENTES(A) = {all , boss }

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 17 / 41

Predicción de la regla a aplicar (7)Hay dos soluciones al problema de las reglas que generan ε :

1 Cuando no se puede aplicar ninguna otra regla, se aplica la regla quegenera ε (algunos compiladores lo hacen, porque si hay un error en laentrada se detectará más adelante, al emparejar terminales)

2 Mirar, antes de decidir si aplicar la regla que genera ε , los símbolos quepueden aparecer después de A en una derivación válidaEjemplo:

A −→ B CA −→ ant A allB −→ big C badB −→ bus A bossB −→ εC −→ catC −→ ε

El conjunto de símbolos que pueden aparecer después de un noterminal A en una derivación válida se denomina el conjunto deSIGUIENTES de A:

SIGUIENTES(A) = {all , boss }

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 17 / 41

Predicción de la regla a aplicar (7)Hay dos soluciones al problema de las reglas que generan ε :

1 Cuando no se puede aplicar ninguna otra regla, se aplica la regla quegenera ε (algunos compiladores lo hacen, porque si hay un error en laentrada se detectará más adelante, al emparejar terminales)

2 Mirar, antes de decidir si aplicar la regla que genera ε , los símbolos quepueden aparecer después de A en una derivación válidaEjemplo:

A −→ B CA −→ ant A allB −→ big C badB −→ bus A bossB −→ εC −→ catC −→ ε

El conjunto de símbolos que pueden aparecer después de un noterminal A en una derivación válida se denomina el conjunto deSIGUIENTES de A: SIGUIENTES(A) = {all , boss }

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 17 / 41

Predicción de la regla a aplicar (7)Hay dos soluciones al problema de las reglas que generan ε :

1 Cuando no se puede aplicar ninguna otra regla, se aplica la regla quegenera ε (algunos compiladores lo hacen, porque si hay un error en laentrada se detectará más adelante, al emparejar terminales)

2 Mirar, antes de decidir si aplicar la regla que genera ε , los símbolos quepueden aparecer después de A en una derivación válidaEjemplo:

A −→ B CA −→ ant A allB −→ big C badB −→ bus A bossB −→ εC −→ catC −→ ε

El conjunto de símbolos que pueden aparecer después de un noterminal A en una derivación válida se denomina el conjunto deSIGUIENTES de A: SIGUIENTES(A) = {all , boss , $ }

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 17 / 41

Cálculo formal de la regla a predecir: conjunto depredicción

Dado una gramática G y un no terminal de la gramática A, para poderpredecir en cualquier derivación qué regla de A se debe aplicar esnecesario calcular el conjunto de predicción de cada regla de A,PRED(A −→ α):

PRED(A −→ α) =si ε ∈ PRIMEROS(α) entonces

(PRIMEROS(α)− {ε }) ∪ SIGUIENTES(A)si no

PRIMEROS(α)

Dado un no terminal A y un terminal de la entrada t , se aplicará laregla de A que tenga a t en su conjunto de predicción ¿Y si hay másde una regla de A que tenga a t?

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 18 / 41

Cálculo formal de la regla a predecir: conjunto depredicción

Dado una gramática G y un no terminal de la gramática A, para poderpredecir en cualquier derivación qué regla de A se debe aplicar esnecesario calcular el conjunto de predicción de cada regla de A,PRED(A −→ α):

PRED(A −→ α) =si ε ∈ PRIMEROS(α) entonces

(PRIMEROS(α)− {ε }) ∪ SIGUIENTES(A)si no

PRIMEROS(α)

Dado un no terminal A y un terminal de la entrada t , se aplicará laregla de A que tenga a t en su conjunto de predicción

¿Y si hay másde una regla de A que tenga a t?

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 18 / 41

Cálculo formal de la regla a predecir: conjunto depredicción

Dado una gramática G y un no terminal de la gramática A, para poderpredecir en cualquier derivación qué regla de A se debe aplicar esnecesario calcular el conjunto de predicción de cada regla de A,PRED(A −→ α):

PRED(A −→ α) =si ε ∈ PRIMEROS(α) entonces

(PRIMEROS(α)− {ε }) ∪ SIGUIENTES(A)si no

PRIMEROS(α)

Dado un no terminal A y un terminal de la entrada t , se aplicará laregla de A que tenga a t en su conjunto de predicción ¿Y si hay másde una regla de A que tenga a t?

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 18 / 41

Cálculo formal de la regla a predecir: PRIMEROS

El cálculo del conjunto de PRIMEROS se define formalmente de lasiguiente manera:· PRIMEROS(a) = { a } , si a es un terminal

· PRIMEROS(A) = ∪A→αi PRIMEROS(αi), si A es un no terminal· Para calcular PRIMEROS de una cadena α de terminales y no terminales:

si α es ε , entonces PRIMEROS(α) = {ε }

si α = a1a2 . . . an donde cada ai puede ser un terminal o un no terminalde la gramática:

I Si a1 es un terminal, PRIMEROS(α) = { a1 }I Si a1 es un no terminal, hay que añadir PRIMEROS(a1)− {ε } a

PRIMEROS(α), y si ε ∈ PRIMEROS(a1):F Si n = 1, es decir, α = a1, entonces hay que añadir ε a

PRIMEROS(α)F Si n > 1 entonces hay que añadir PRIMEROS(a2 . . . an) a

PRIMEROS(α)

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 19 / 41

Cálculo formal de la regla a predecir: PRIMEROS

El cálculo del conjunto de PRIMEROS se define formalmente de lasiguiente manera:· PRIMEROS(a) = { a } , si a es un terminal· PRIMEROS(A) = ∪A→αi PRIMEROS(αi), si A es un no terminal

· Para calcular PRIMEROS de una cadena α de terminales y no terminales:

si α es ε , entonces PRIMEROS(α) = {ε }

si α = a1a2 . . . an donde cada ai puede ser un terminal o un no terminalde la gramática:

I Si a1 es un terminal, PRIMEROS(α) = { a1 }I Si a1 es un no terminal, hay que añadir PRIMEROS(a1)− {ε } a

PRIMEROS(α), y si ε ∈ PRIMEROS(a1):F Si n = 1, es decir, α = a1, entonces hay que añadir ε a

PRIMEROS(α)F Si n > 1 entonces hay que añadir PRIMEROS(a2 . . . an) a

PRIMEROS(α)

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 19 / 41

Cálculo formal de la regla a predecir: PRIMEROS

El cálculo del conjunto de PRIMEROS se define formalmente de lasiguiente manera:· PRIMEROS(a) = { a } , si a es un terminal· PRIMEROS(A) = ∪A→αi PRIMEROS(αi), si A es un no terminal· Para calcular PRIMEROS de una cadena α de terminales y no terminales:

si α es ε , entonces PRIMEROS(α) = {ε }

si α = a1a2 . . . an donde cada ai puede ser un terminal o un no terminalde la gramática:

I Si a1 es un terminal, PRIMEROS(α) = { a1 }I Si a1 es un no terminal, hay que añadir PRIMEROS(a1)− {ε } a

PRIMEROS(α), y si ε ∈ PRIMEROS(a1):F Si n = 1, es decir, α = a1, entonces hay que añadir ε a

PRIMEROS(α)F Si n > 1 entonces hay que añadir PRIMEROS(a2 . . . an) a

PRIMEROS(α)

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 19 / 41

Cálculo formal de la regla a predecir: PRIMEROS

El cálculo del conjunto de PRIMEROS se define formalmente de lasiguiente manera:· PRIMEROS(a) = { a } , si a es un terminal· PRIMEROS(A) = ∪A→αi PRIMEROS(αi), si A es un no terminal· Para calcular PRIMEROS de una cadena α de terminales y no terminales:

si α es ε , entonces PRIMEROS(α) = {ε }

si α = a1a2 . . . an donde cada ai puede ser un terminal o un no terminalde la gramática:

I Si a1 es un terminal, PRIMEROS(α) = { a1 }I Si a1 es un no terminal, hay que añadir PRIMEROS(a1)− {ε } a

PRIMEROS(α), y si ε ∈ PRIMEROS(a1):F Si n = 1, es decir, α = a1, entonces hay que añadir ε a

PRIMEROS(α)F Si n > 1 entonces hay que añadir PRIMEROS(a2 . . . an) a

PRIMEROS(α)

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 19 / 41

Cálculo formal de la regla a predecir: PRIMEROS

El cálculo del conjunto de PRIMEROS se define formalmente de lasiguiente manera:· PRIMEROS(a) = { a } , si a es un terminal· PRIMEROS(A) = ∪A→αi PRIMEROS(αi), si A es un no terminal· Para calcular PRIMEROS de una cadena α de terminales y no terminales:

si α es ε , entonces PRIMEROS(α) = {ε }

si α = a1a2 . . . an donde cada ai puede ser un terminal o un no terminalde la gramática:

I Si a1 es un terminal, PRIMEROS(α) = { a1 }I Si a1 es un no terminal, hay que añadir PRIMEROS(a1)− {ε } a

PRIMEROS(α), y si ε ∈ PRIMEROS(a1):

F Si n = 1, es decir, α = a1, entonces hay que añadir ε aPRIMEROS(α)

F Si n > 1 entonces hay que añadir PRIMEROS(a2 . . . an) aPRIMEROS(α)

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 19 / 41

Cálculo formal de la regla a predecir: PRIMEROS

El cálculo del conjunto de PRIMEROS se define formalmente de lasiguiente manera:· PRIMEROS(a) = { a } , si a es un terminal· PRIMEROS(A) = ∪A→αi PRIMEROS(αi), si A es un no terminal· Para calcular PRIMEROS de una cadena α de terminales y no terminales:

si α es ε , entonces PRIMEROS(α) = {ε }

si α = a1a2 . . . an donde cada ai puede ser un terminal o un no terminalde la gramática:

I Si a1 es un terminal, PRIMEROS(α) = { a1 }I Si a1 es un no terminal, hay que añadir PRIMEROS(a1)− {ε } a

PRIMEROS(α), y si ε ∈ PRIMEROS(a1):F Si n = 1, es decir, α = a1, entonces hay que añadir ε a

PRIMEROS(α)

F Si n > 1 entonces hay que añadir PRIMEROS(a2 . . . an) aPRIMEROS(α)

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 19 / 41

Cálculo formal de la regla a predecir: PRIMEROS

El cálculo del conjunto de PRIMEROS se define formalmente de lasiguiente manera:· PRIMEROS(a) = { a } , si a es un terminal· PRIMEROS(A) = ∪A→αi PRIMEROS(αi), si A es un no terminal· Para calcular PRIMEROS de una cadena α de terminales y no terminales:

si α es ε , entonces PRIMEROS(α) = {ε }

si α = a1a2 . . . an donde cada ai puede ser un terminal o un no terminalde la gramática:

I Si a1 es un terminal, PRIMEROS(α) = { a1 }I Si a1 es un no terminal, hay que añadir PRIMEROS(a1)− {ε } a

PRIMEROS(α), y si ε ∈ PRIMEROS(a1):F Si n = 1, es decir, α = a1, entonces hay que añadir ε a

PRIMEROS(α)F Si n > 1 entonces hay que añadir PRIMEROS(a2 . . . an) a

PRIMEROS(α)

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 19 / 41

Cálculo formal de la regla a predecir: SIGUIENTES

El cálculo del conjunto de SIGUIENTES de un no terminal A se definede la siguiente manera:

1 Si A es el símbolo inicial de la gramática, añadir $ aSIGUIENTES(A)

2 Sea una regla de la gramática que contiene en su parte derechael no terminal A, B −→ αAβ, donde B es otro no terminal (quepodría ser también A), y α y β son cadenas de terminales y noterminales de la gramática (ambas pueden ser ε ):

1 Añadir PRIMEROS(β)− {ε } a SIGUIENTES(A)2 Si ε ∈ PRIMEROS(β) (o bien β = ε ), entonces hay que añadir los

SIGUIENTES(B) a los SIGUIENTES(A)

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 20 / 41

Cálculo formal de la regla a predecir: SIGUIENTES

El cálculo del conjunto de SIGUIENTES de un no terminal A se definede la siguiente manera:

1 Si A es el símbolo inicial de la gramática, añadir $ aSIGUIENTES(A)

2 Sea una regla de la gramática que contiene en su parte derechael no terminal A, B −→ αAβ, donde B es otro no terminal (quepodría ser también A), y α y β son cadenas de terminales y noterminales de la gramática (ambas pueden ser ε ):

1 Añadir PRIMEROS(β)− {ε } a SIGUIENTES(A)2 Si ε ∈ PRIMEROS(β) (o bien β = ε ), entonces hay que añadir los

SIGUIENTES(B) a los SIGUIENTES(A)

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 20 / 41

Cálculo formal de la regla a predecir: SIGUIENTES

El cálculo del conjunto de SIGUIENTES de un no terminal A se definede la siguiente manera:

1 Si A es el símbolo inicial de la gramática, añadir $ aSIGUIENTES(A)

2 Sea una regla de la gramática que contiene en su parte derechael no terminal A, B −→ αAβ, donde B es otro no terminal (quepodría ser también A), y α y β son cadenas de terminales y noterminales de la gramática (ambas pueden ser ε ):

1 Añadir PRIMEROS(β)− {ε } a SIGUIENTES(A)

2 Si ε ∈ PRIMEROS(β) (o bien β = ε ), entonces hay que añadir losSIGUIENTES(B) a los SIGUIENTES(A)

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 20 / 41

Cálculo formal de la regla a predecir: SIGUIENTES

El cálculo del conjunto de SIGUIENTES de un no terminal A se definede la siguiente manera:

1 Si A es el símbolo inicial de la gramática, añadir $ aSIGUIENTES(A)

2 Sea una regla de la gramática que contiene en su parte derechael no terminal A, B −→ αAβ, donde B es otro no terminal (quepodría ser también A), y α y β son cadenas de terminales y noterminales de la gramática (ambas pueden ser ε ):

1 Añadir PRIMEROS(β)− {ε } a SIGUIENTES(A)2 Si ε ∈ PRIMEROS(β) (o bien β = ε ), entonces hay que añadir los

SIGUIENTES(B) a los SIGUIENTES(A)

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 20 / 41

Ejemplo del cálculo de conjuntos de predicción

A −→ B CA −→ ant A allB −→ big CB −→ bus A bossB −→ εC −→ catC −→ cow

Para poder calcular el conjunto de PRIMEROS de las partes derechasde las reglas, primero se calculan los PRIMEROS de los noterminales:

PRIMEROS(A) = {ant , }PRIMEROS(B) = {big ,bus , ε }PRIMEROS(C) = {cat ,cow }

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 21 / 41

Ejemplo del cálculo de conjuntos de predicción

A −→ B CA −→ ant A allB −→ big CB −→ bus A bossB −→ εC −→ catC −→ cow

Para poder calcular el conjunto de PRIMEROS de las partes derechasde las reglas, primero se calculan los PRIMEROS de los noterminales:

PRIMEROS(A) = {ant , }PRIMEROS(B) = {big ,bus , ε }PRIMEROS(C) = {cat ,cow }

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 21 / 41

Ejemplo del cálculo de conjuntos de predicción

A −→ B CA −→ ant A allB −→ big CB −→ bus A bossB −→ εC −→ catC −→ cow

Para poder calcular el conjunto de PRIMEROS de las partes derechasde las reglas, primero se calculan los PRIMEROS de los noterminales:

PRIMEROS(A) = {ant ,big ,bus , }PRIMEROS(B) = {big ,bus , ε }PRIMEROS(C) = {cat ,cow }

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 21 / 41

Ejemplo del cálculo de conjuntos de predicción

A −→ B CA −→ ant A allB −→ big CB −→ bus A bossB −→ εC −→ catC −→ cow

Para poder calcular el conjunto de PRIMEROS de las partes derechasde las reglas, primero se calculan los PRIMEROS de los noterminales:

PRIMEROS(A) = {ant ,big ,bus ,cat ,cow }PRIMEROS(B) = {big ,bus , ε }PRIMEROS(C) = {cat ,cow }

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 21 / 41

Ejemplo del cálculo de conjuntos de predicción (2)

A −→ B CA −→ ant A allB −→ big CB −→ bus A bossB −→ εC −→ catC −→ cow

Como hay una producción que genera ε , tenemos que calcular losSIGUIENTES de cada no terminal:

SIGUIENTES(A) = {all ,boss ,$ }SIGUIENTES(B) = {cat ,cow }SIGUIENTES(C) = {cat ,cow ,all ,boss ,$ }

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 22 / 41

Ejemplo del cálculo de conjuntos de predicción (2)

A −→ B CA −→ ant A allB −→ big CB −→ bus A bossB −→ εC −→ catC −→ cow

Como hay una producción que genera ε , tenemos que calcular losSIGUIENTES de cada no terminal:

SIGUIENTES(A) = {all ,boss ,$ }SIGUIENTES(B) = {cat ,cow }SIGUIENTES(C) = {cat ,cow ,all ,boss ,$ }

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 22 / 41

Ejemplo del cálculo de conjuntos de predicción (3)Los conjuntos de predicción de cada regla son:

A −→ B C {}A −→ ant A all {ant }B −→ big C {big }B −→ bus A boss {bus }B −→ ε {}C −→ cat {cat }C −→ cow {cow }

Derivación Entrada Regla/acciónA

$

ant cat all $

A −→ ant A allant A all $ ant cat all $ emparejar antA all $ cat all $ A −→ B CB C all $ cat all $ B −→ εC all $ cat all $ C −→ catcat all $ cat all $ emparejar catall $ all $ emparejar all$ $ ??OK!!

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 23 / 41

Ejemplo del cálculo de conjuntos de predicción (3)Los conjuntos de predicción de cada regla son:

A −→ B C {}A −→ ant A all {ant }B −→ big C {big }B −→ bus A boss {bus }B −→ ε {cat , cow } (PRIM(ε )− {ε }) ∪ SIG(B)C −→ cat {cat }C −→ cow {cow }

Derivación Entrada Regla/acciónA

$

ant cat all $

A −→ ant A allant A all $ ant cat all $ emparejar antA all $ cat all $ A −→ B CB C all $ cat all $ B −→ εC all $ cat all $ C −→ catcat all $ cat all $ emparejar catall $ all $ emparejar all$ $ ??OK!!

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 23 / 41

Ejemplo del cálculo de conjuntos de predicción (3)Los conjuntos de predicción de cada regla son:

A −→ B C {big ,bus , }A −→ ant A all {ant }B −→ big C {big }B −→ bus A boss {bus }B −→ ε {cat , cow } (PRIM(ε )− {ε }) ∪ SIG(B)C −→ cat {cat }C −→ cow {cow }

Derivación Entrada Regla/acciónA

$

ant cat all $

A −→ ant A allant A all $ ant cat all $ emparejar antA all $ cat all $ A −→ B CB C all $ cat all $ B −→ εC all $ cat all $ C −→ catcat all $ cat all $ emparejar catall $ all $ emparejar all$ $ ??OK!!

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 23 / 41

Ejemplo del cálculo de conjuntos de predicción (3)Los conjuntos de predicción de cada regla son:

A −→ B C {big ,bus , cat , cow } PRIM(BC)A −→ ant A all {ant }B −→ big C {big }B −→ bus A boss {bus }B −→ ε {cat , cow } (PRIM(ε )− {ε }) ∪ SIG(B)C −→ cat {cat }C −→ cow {cow }

Derivación Entrada Regla/acciónA

$

ant cat all $

A −→ ant A allant A all $ ant cat all $ emparejar antA all $ cat all $ A −→ B CB C all $ cat all $ B −→ εC all $ cat all $ C −→ catcat all $ cat all $ emparejar catall $ all $ emparejar all$ $ ??OK!!

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 23 / 41

Ejemplo del cálculo de conjuntos de predicción (3)Los conjuntos de predicción de cada regla son:

A −→ B C {big ,bus , cat , cow } PRIM(BC)A −→ ant A all {ant }B −→ big C {big }B −→ bus A boss {bus }B −→ ε {cat , cow } (PRIM(ε )− {ε }) ∪ SIG(B)C −→ cat {cat }C −→ cow {cow }

Derivación Entrada Regla/acciónA

$

ant cat all $

A −→ ant A allant A all $ ant cat all $ emparejar antA all $ cat all $ A −→ B CB C all $ cat all $ B −→ εC all $ cat all $ C −→ catcat all $ cat all $ emparejar catall $ all $ emparejar all$ $ ??OK!!

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 23 / 41

Ejemplo del cálculo de conjuntos de predicción (3)Los conjuntos de predicción de cada regla son:

A −→ B C {big ,bus , cat , cow } PRIM(BC)A −→ ant A all {ant }B −→ big C {big }B −→ bus A boss {bus }B −→ ε {cat , cow } (PRIM(ε )− {ε }) ∪ SIG(B)C −→ cat {cat }C −→ cow {cow }

Derivación Entrada Regla/acciónA

$

ant cat all $ A −→ ant A all

ant A all $ ant cat all $ emparejar antA all $ cat all $ A −→ B CB C all $ cat all $ B −→ εC all $ cat all $ C −→ catcat all $ cat all $ emparejar catall $ all $ emparejar all$ $ ??OK!!

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 23 / 41

Ejemplo del cálculo de conjuntos de predicción (3)Los conjuntos de predicción de cada regla son:

A −→ B C {big ,bus , cat , cow } PRIM(BC)A −→ ant A all {ant }B −→ big C {big }B −→ bus A boss {bus }B −→ ε {cat , cow } (PRIM(ε )− {ε }) ∪ SIG(B)C −→ cat {cat }C −→ cow {cow }

Derivación Entrada Regla/acciónA

$

ant cat all $ A −→ ant A allant A all

$ ant cat all $ emparejar antA all $ cat all $ A −→ B CB C all $ cat all $ B −→ εC all $ cat all $ C −→ catcat all $ cat all $ emparejar catall $ all $ emparejar all$ $ ??OK!!

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 23 / 41

Ejemplo del cálculo de conjuntos de predicción (3)Los conjuntos de predicción de cada regla son:

A −→ B C {big ,bus , cat , cow } PRIM(BC)A −→ ant A all {ant }B −→ big C {big }B −→ bus A boss {bus }B −→ ε {cat , cow } (PRIM(ε )− {ε }) ∪ SIG(B)C −→ cat {cat }C −→ cow {cow }

Derivación Entrada Regla/acciónA

$

ant cat all $ A −→ ant A allant A all

$

ant cat all $

emparejar antA all $ cat all $ A −→ B CB C all $ cat all $ B −→ εC all $ cat all $ C −→ catcat all $ cat all $ emparejar catall $ all $ emparejar all$ $ ??OK!!

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 23 / 41

Ejemplo del cálculo de conjuntos de predicción (3)Los conjuntos de predicción de cada regla son:

A −→ B C {big ,bus , cat , cow } PRIM(BC)A −→ ant A all {ant }B −→ big C {big }B −→ bus A boss {bus }B −→ ε {cat , cow } (PRIM(ε )− {ε }) ∪ SIG(B)C −→ cat {cat }C −→ cow {cow }

Derivación Entrada Regla/acciónA

$

ant cat all $ A −→ ant A allant A all

$

ant cat all $ emparejar ant

A all $ cat all $ A −→ B CB C all $ cat all $ B −→ εC all $ cat all $ C −→ catcat all $ cat all $ emparejar catall $ all $ emparejar all$ $ ??OK!!

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 23 / 41

Ejemplo del cálculo de conjuntos de predicción (3)Los conjuntos de predicción de cada regla son:

A −→ B C {big ,bus , cat , cow } PRIM(BC)A −→ ant A all {ant }B −→ big C {big }B −→ bus A boss {bus }B −→ ε {cat , cow } (PRIM(ε )− {ε }) ∪ SIG(B)C −→ cat {cat }C −→ cow {cow }

Derivación Entrada Regla/acciónA

$

ant cat all $ A −→ ant A allant A all

$

ant cat all $ emparejar antA all

$ cat all $ A −→ B CB C all $ cat all $ B −→ εC all $ cat all $ C −→ catcat all $ cat all $ emparejar catall $ all $ emparejar all$ $ ??OK!!

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 23 / 41

Ejemplo del cálculo de conjuntos de predicción (3)Los conjuntos de predicción de cada regla son:

A −→ B C {big ,bus , cat , cow } PRIM(BC)A −→ ant A all {ant }B −→ big C {big }B −→ bus A boss {bus }B −→ ε {cat , cow } (PRIM(ε )− {ε }) ∪ SIG(B)C −→ cat {cat }C −→ cow {cow }

Derivación Entrada Regla/acciónA

$

ant cat all $ A −→ ant A allant A all

$

ant cat all $ emparejar antA all

$

cat all $

A −→ B CB C all $ cat all $ B −→ εC all $ cat all $ C −→ catcat all $ cat all $ emparejar catall $ all $ emparejar all$ $ ??OK!!

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 23 / 41

Ejemplo del cálculo de conjuntos de predicción (3)Los conjuntos de predicción de cada regla son:

A −→ B C {big ,bus , cat , cow } PRIM(BC)A −→ ant A all {ant }B −→ big C {big }B −→ bus A boss {bus }B −→ ε {cat , cow } (PRIM(ε )− {ε }) ∪ SIG(B)C −→ cat {cat }C −→ cow {cow }

Derivación Entrada Regla/acciónA

$

ant cat all $ A −→ ant A allant A all

$

ant cat all $ emparejar antA all

$

cat all $ A −→ B C

B C all $ cat all $ B −→ εC all $ cat all $ C −→ catcat all $ cat all $ emparejar catall $ all $ emparejar all$ $ ??OK!!

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 23 / 41

Ejemplo del cálculo de conjuntos de predicción (3)Los conjuntos de predicción de cada regla son:

A −→ B C {big ,bus , cat , cow } PRIM(BC)A −→ ant A all {ant }B −→ big C {big }B −→ bus A boss {bus }B −→ ε {cat , cow } (PRIM(ε )− {ε }) ∪ SIG(B)C −→ cat {cat }C −→ cow {cow }

Derivación Entrada Regla/acciónA

$

ant cat all $ A −→ ant A allant A all

$

ant cat all $ emparejar antA all

$

cat all $ A −→ B CB C all

$ cat all $ B −→ εC all $ cat all $ C −→ catcat all $ cat all $ emparejar catall $ all $ emparejar all$ $ ??OK!!

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 23 / 41

Ejemplo del cálculo de conjuntos de predicción (3)Los conjuntos de predicción de cada regla son:

A −→ B C {big ,bus , cat , cow } PRIM(BC)A −→ ant A all {ant }B −→ big C {big }B −→ bus A boss {bus }B −→ ε {cat , cow } (PRIM(ε )− {ε }) ∪ SIG(B)C −→ cat {cat }C −→ cow {cow }

Derivación Entrada Regla/acciónA

$

ant cat all $ A −→ ant A allant A all

$

ant cat all $ emparejar antA all

$

cat all $ A −→ B CB C all

$

cat all $

B −→ εC all $ cat all $ C −→ catcat all $ cat all $ emparejar catall $ all $ emparejar all$ $ ??OK!!

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 23 / 41

Ejemplo del cálculo de conjuntos de predicción (3)Los conjuntos de predicción de cada regla son:

A −→ B C {big ,bus , cat , cow } PRIM(BC)A −→ ant A all {ant }B −→ big C {big }B −→ bus A boss {bus }B −→ ε {cat , cow } (PRIM(ε )− {ε }) ∪ SIG(B)C −→ cat {cat }C −→ cow {cow }

Derivación Entrada Regla/acciónA

$

ant cat all $ A −→ ant A allant A all

$

ant cat all $ emparejar antA all

$

cat all $ A −→ B CB C all

$

cat all $ B −→ ε

C all $ cat all $ C −→ catcat all $ cat all $ emparejar catall $ all $ emparejar all$ $ ??OK!!

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 23 / 41

Ejemplo del cálculo de conjuntos de predicción (3)Los conjuntos de predicción de cada regla son:

A −→ B C {big ,bus , cat , cow } PRIM(BC)A −→ ant A all {ant }B −→ big C {big }B −→ bus A boss {bus }B −→ ε {cat , cow } (PRIM(ε )− {ε }) ∪ SIG(B)C −→ cat {cat }C −→ cow {cow }

Derivación Entrada Regla/acciónA

$

ant cat all $ A −→ ant A allant A all

$

ant cat all $ emparejar antA all

$

cat all $ A −→ B CB C all

$

cat all $ B −→ εC all

$ cat all $ C −→ catcat all $ cat all $ emparejar catall $ all $ emparejar all$ $ ??OK!!

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 23 / 41

Ejemplo del cálculo de conjuntos de predicción (3)Los conjuntos de predicción de cada regla son:

A −→ B C {big ,bus , cat , cow } PRIM(BC)A −→ ant A all {ant }B −→ big C {big }B −→ bus A boss {bus }B −→ ε {cat , cow } (PRIM(ε )− {ε }) ∪ SIG(B)C −→ cat {cat }C −→ cow {cow }

Derivación Entrada Regla/acciónA

$

ant cat all $ A −→ ant A allant A all

$

ant cat all $ emparejar antA all

$

cat all $ A −→ B CB C all

$

cat all $ B −→ εC all

$

cat all $

C −→ catcat all $ cat all $ emparejar catall $ all $ emparejar all$ $ ??OK!!

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 23 / 41

Ejemplo del cálculo de conjuntos de predicción (3)Los conjuntos de predicción de cada regla son:

A −→ B C {big ,bus , cat , cow } PRIM(BC)A −→ ant A all {ant }B −→ big C {big }B −→ bus A boss {bus }B −→ ε {cat , cow } (PRIM(ε )− {ε }) ∪ SIG(B)C −→ cat {cat }C −→ cow {cow }

Derivación Entrada Regla/acciónA

$

ant cat all $ A −→ ant A allant A all

$

ant cat all $ emparejar antA all

$

cat all $ A −→ B CB C all

$

cat all $ B −→ εC all

$

cat all $ C −→ cat

cat all $ cat all $ emparejar catall $ all $ emparejar all$ $ ??OK!!

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 23 / 41

Ejemplo del cálculo de conjuntos de predicción (3)Los conjuntos de predicción de cada regla son:

A −→ B C {big ,bus , cat , cow } PRIM(BC)A −→ ant A all {ant }B −→ big C {big }B −→ bus A boss {bus }B −→ ε {cat , cow } (PRIM(ε )− {ε }) ∪ SIG(B)C −→ cat {cat }C −→ cow {cow }

Derivación Entrada Regla/acciónA

$

ant cat all $ A −→ ant A allant A all

$

ant cat all $ emparejar antA all

$

cat all $ A −→ B CB C all

$

cat all $ B −→ εC all

$

cat all $ C −→ catcat all

$ cat all $ emparejar catall $ all $ emparejar all$ $ ??OK!!

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 23 / 41

Ejemplo del cálculo de conjuntos de predicción (3)Los conjuntos de predicción de cada regla son:

A −→ B C {big ,bus , cat , cow } PRIM(BC)A −→ ant A all {ant }B −→ big C {big }B −→ bus A boss {bus }B −→ ε {cat , cow } (PRIM(ε )− {ε }) ∪ SIG(B)C −→ cat {cat }C −→ cow {cow }

Derivación Entrada Regla/acciónA

$

ant cat all $ A −→ ant A allant A all

$

ant cat all $ emparejar antA all

$

cat all $ A −→ B CB C all

$

cat all $ B −→ εC all

$

cat all $ C −→ catcat all

$

cat all $

emparejar catall $ all $ emparejar all$ $ ??OK!!

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 23 / 41

Ejemplo del cálculo de conjuntos de predicción (3)Los conjuntos de predicción de cada regla son:

A −→ B C {big ,bus , cat , cow } PRIM(BC)A −→ ant A all {ant }B −→ big C {big }B −→ bus A boss {bus }B −→ ε {cat , cow } (PRIM(ε )− {ε }) ∪ SIG(B)C −→ cat {cat }C −→ cow {cow }

Derivación Entrada Regla/acciónA

$

ant cat all $ A −→ ant A allant A all

$

ant cat all $ emparejar antA all

$

cat all $ A −→ B CB C all

$

cat all $ B −→ εC all

$

cat all $ C −→ catcat all

$

cat all $ emparejar cat

all $ all $ emparejar all$ $ ??OK!!

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 23 / 41

Ejemplo del cálculo de conjuntos de predicción (3)Los conjuntos de predicción de cada regla son:

A −→ B C {big ,bus , cat , cow } PRIM(BC)A −→ ant A all {ant }B −→ big C {big }B −→ bus A boss {bus }B −→ ε {cat , cow } (PRIM(ε )− {ε }) ∪ SIG(B)C −→ cat {cat }C −→ cow {cow }

Derivación Entrada Regla/acciónA

$

ant cat all $ A −→ ant A allant A all

$

ant cat all $ emparejar antA all

$

cat all $ A −→ B CB C all

$

cat all $ B −→ εC all

$

cat all $ C −→ catcat all

$

cat all $ emparejar catall

$ all $ emparejar all$ $ ??OK!!

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 23 / 41

Ejemplo del cálculo de conjuntos de predicción (3)Los conjuntos de predicción de cada regla son:

A −→ B C {big ,bus , cat , cow } PRIM(BC)A −→ ant A all {ant }B −→ big C {big }B −→ bus A boss {bus }B −→ ε {cat , cow } (PRIM(ε )− {ε }) ∪ SIG(B)C −→ cat {cat }C −→ cow {cow }

Derivación Entrada Regla/acciónA

$

ant cat all $ A −→ ant A allant A all

$

ant cat all $ emparejar antA all

$

cat all $ A −→ B CB C all

$

cat all $ B −→ εC all

$

cat all $ C −→ catcat all

$

cat all $ emparejar catall

$

all $

emparejar all$ $ ??OK!!

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 23 / 41

Ejemplo del cálculo de conjuntos de predicción (3)Los conjuntos de predicción de cada regla son:

A −→ B C {big ,bus , cat , cow } PRIM(BC)A −→ ant A all {ant }B −→ big C {big }B −→ bus A boss {bus }B −→ ε {cat , cow } (PRIM(ε )− {ε }) ∪ SIG(B)C −→ cat {cat }C −→ cow {cow }

Derivación Entrada Regla/acciónA

$

ant cat all $ A −→ ant A allant A all

$

ant cat all $ emparejar antA all

$

cat all $ A −→ B CB C all

$

cat all $ B −→ εC all

$

cat all $ C −→ catcat all

$

cat all $ emparejar catall

$

all $ emparejar all

$ $ ??OK!!

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 23 / 41

Ejemplo del cálculo de conjuntos de predicción (3)Los conjuntos de predicción de cada regla son:

A −→ B C {big ,bus , cat , cow } PRIM(BC)A −→ ant A all {ant }B −→ big C {big }B −→ bus A boss {bus }B −→ ε {cat , cow } (PRIM(ε )− {ε }) ∪ SIG(B)C −→ cat {cat }C −→ cow {cow }

Derivación Entrada Regla/acciónA

$

ant cat all $ A −→ ant A allant A all

$

ant cat all $ emparejar antA all

$

cat all $ A −→ B CB C all

$

cat all $ B −→ εC all

$

cat all $ C −→ catcat all

$

cat all $ emparejar catall

$

all $ emparejar all

$

$

??OK!!

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 23 / 41

Ejemplo del cálculo de conjuntos de predicción (3)Los conjuntos de predicción de cada regla son:

A −→ B C {big ,bus , cat , cow } PRIM(BC)A −→ ant A all {ant }B −→ big C {big }B −→ bus A boss {bus }B −→ ε {cat , cow } (PRIM(ε )− {ε }) ∪ SIG(B)C −→ cat {cat }C −→ cow {cow }

Derivación Entrada Regla/acciónA

$

ant cat all $ A −→ ant A allant A all

$

ant cat all $ emparejar antA all

$

cat all $ A −→ B CB C all

$

cat all $ B −→ εC all

$

cat all $ C −→ catcat all

$

cat all $ emparejar catall

$

all $ emparejar all

$

$ ??

OK!!

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 23 / 41

Ejemplo del cálculo de conjuntos de predicción (3)Los conjuntos de predicción de cada regla son:

A −→ B C {big ,bus , cat , cow } PRIM(BC)A −→ ant A all {ant }B −→ big C {big }B −→ bus A boss {bus }B −→ ε {cat , cow } (PRIM(ε )− {ε }) ∪ SIG(B)C −→ cat {cat }C −→ cow {cow }

Derivación Entrada Regla/acciónA $ ant cat all $ A −→ ant A allant A all $ ant cat all $ emparejar antA all $ cat all $ A −→ B CB C all $ cat all $ B −→ εC all $ cat all $ C −→ catcat all $ cat all $ emparejar catall $ all $ emparejar all$ $ ??

OK!!

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 23 / 41

Ejemplo del cálculo de conjuntos de predicción (3)Los conjuntos de predicción de cada regla son:

A −→ B C {big ,bus , cat , cow } PRIM(BC)A −→ ant A all {ant }B −→ big C {big }B −→ bus A boss {bus }B −→ ε {cat , cow } (PRIM(ε )− {ε }) ∪ SIG(B)C −→ cat {cat }C −→ cow {cow }

Derivación Entrada Regla/acciónA $ ant cat all $ A −→ ant A allant A all $ ant cat all $ emparejar antA all $ cat all $ A −→ B CB C all $ cat all $ B −→ εC all $ cat all $ C −→ catcat all $ cat all $ emparejar catall $ all $ emparejar all$ $

??

OK!!

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 23 / 41

Ejemplo: cálculo de PRIMEROSS −→ A B CA −→ D E f C | a | εB −→ E G C | b | εC −→ c | εD −→ d | εE −→ e | εG −→ g

PRIM(G) = {g }PRIM(E) = {e , ε }PRIM(D) = {d , ε }PRIM(C) = {c , ε }PRIM(B) = {PRIM(A) =

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 24 / 41

Ejemplo: cálculo de PRIMEROSS −→ A B CA −→ D E f C | a | εB −→ E G C | b | εC −→ c | εD −→ d | εE −→ e | εG −→ g

PRIM(G) = {g }PRIM(E) = {e , ε }PRIM(D) = {d , ε }PRIM(C) = {c , ε }PRIM(B) = {PRIM(A) =

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 24 / 41

Ejemplo: cálculo de PRIMEROSS −→ A B CA −→ D E f C | a | εB −→ E G C | b | εC −→ c | εD −→ d | εE −→ e | εG −→ g

PRIM(G) = {g }PRIM(E) = {e , ε }PRIM(D) = {d , ε }PRIM(C) = {c , ε }PRIM(B) = {b , εPRIM(A) =

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 24 / 41

Ejemplo: cálculo de PRIMEROSS −→ A B CA −→ D E f C | a | εB −→ E G C | b | εC −→ c | εD −→ d | εE −→ e | εG −→ g

PRIM(G) = {g }PRIM(E) = {e , ε }PRIM(D) = {d , ε }PRIM(C) = {c , ε }PRIM(B) = {b , ε } ∪ PRIM(EGC)PRIM(A) =

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 24 / 41

Ejemplo: cálculo de PRIMEROSS −→ A B CA −→ D E f C | a | εB −→ E G C | b | εC −→ c | εD −→ d | εE −→ e | εG −→ g

PRIM(G) = {g }PRIM(E) = {e , ε }PRIM(D) = {d , ε }PRIM(C) = {c , ε }PRIM(B) = {b , ε } ∪ PRIM(E)− {ε} ∪ PRIM(GC)PRIM(A) =

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 24 / 41

Ejemplo: cálculo de PRIMEROSS −→ A B CA −→ D E f C | a | εB −→ E G C | b | εC −→ c | εD −→ d | εE −→ e | εG −→ g

PRIM(G) = {g }PRIM(E) = {e , ε }PRIM(D) = {d , ε }PRIM(C) = {c , ε }PRIM(B) = {b , ε } ∪ {e ,g }PRIM(A) =

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 24 / 41

Ejemplo: cálculo de PRIMEROSS −→ A B CA −→ D E f C | a | εB −→ E G C | b | εC −→ c | εD −→ d | εE −→ e | εG −→ g

PRIM(G) = {g }PRIM(E) = {e , ε }PRIM(D) = {d , ε }PRIM(C) = {c , ε }PRIM(B) = {b , ε ,e ,g }PRIM(A) = {a , ε

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 24 / 41

Ejemplo: cálculo de PRIMEROSS −→ A B CA −→ D E f C | a | εB −→ E G C | b | εC −→ c | εD −→ d | εE −→ e | εG −→ g

PRIM(G) = {g }PRIM(E) = {e , ε }PRIM(D) = {d , ε }PRIM(C) = {c , ε }PRIM(B) = {b , ε ,e ,g }PRIM(A) = {a , ε } ∪ PRIM(DEfG)

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 24 / 41

Ejemplo: cálculo de PRIMEROSS −→ A B CA −→ D E f C | a | εB −→ E G C | b | εC −→ c | εD −→ d | εE −→ e | εG −→ g

PRIM(G) = {g }PRIM(E) = {e , ε }PRIM(D) = {d , ε }PRIM(C) = {c , ε }PRIM(B) = {b , ε ,e ,g }PRIM(A) = {a , ε } ∪ PRIM(D)− {ε} ∪ PRIM(EfC)

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 24 / 41

Ejemplo: cálculo de PRIMEROSS −→ A B CA −→ D E f C | a | εB −→ E G C | b | εC −→ c | εD −→ d | εE −→ e | εG −→ g

PRIM(G) = {g }PRIM(E) = {e , ε }PRIM(D) = {d , ε }PRIM(C) = {c , ε }PRIM(B) = {b , ε ,e ,g }PRIM(A) = {a , ε } ∪ {d } ∪ PRIM(E)− {ε} ∪ PRIM(fC)

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 24 / 41

Ejemplo: cálculo de PRIMEROSS −→ A B CA −→ D E f C | a | εB −→ E G C | b | εC −→ c | εD −→ d | εE −→ e | εG −→ g

PRIM(G) = {g }PRIM(E) = {e , ε }PRIM(D) = {d , ε }PRIM(C) = {c , ε }PRIM(B) = {b , ε ,e ,g }PRIM(A) = {a , ε } ∪ {d } ∪ {e} ∪ PRIM(fC)

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 24 / 41

Ejemplo: cálculo de PRIMEROSS −→ A B CA −→ D E f C | a | εB −→ E G C | b | εC −→ c | εD −→ d | εE −→ e | εG −→ g

PRIM(G) = {g }PRIM(E) = {e , ε }PRIM(D) = {d , ε }PRIM(C) = {c , ε }PRIM(B) = {b , ε ,e ,g }PRIM(A) = {a , ε } ∪ {d } ∪ {e} ∪ {f}

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 24 / 41

Ejemplo: cálculo de PRIMEROSS −→ A B CA −→ D E f C | a | εB −→ E G C | b | εC −→ c | εD −→ d | εE −→ e | εG −→ g

PRIM(G) = {g }PRIM(E) = {e , ε }PRIM(D) = {d , ε }PRIM(C) = {c , ε }PRIM(B) = {b , ε ,e ,g }PRIM(A) = {a , ε } ∪ {d ,e , f }

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 24 / 41

Ejemplo: cálculo de PRIMEROSS −→ A B CA −→ D E f C | a | εB −→ E G C | b | εC −→ c | εD −→ d | εE −→ e | εG −→ g

PRIM(G) = {g }PRIM(E) = {e , ε }PRIM(D) = {d , ε }PRIM(C) = {c , ε }PRIM(B) = {b , ε , e ,g }PRIM(A) = {a , ε ,d ,e , f }PRIM(S) = PRIM(ABC)

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 24 / 41

Ejemplo: cálculo de PRIMEROSS −→ A B CA −→ D E f C | a | εB −→ E G C | b | εC −→ c | εD −→ d | εE −→ e | εG −→ g

PRIM(G) = {g }PRIM(E) = {e , ε }PRIM(D) = {d , ε }PRIM(C) = {c , ε }PRIM(B) = {b , ε , e ,g }PRIM(A) = {a , ε ,d ,e , f }PRIM(S) = PRIM(A)− {ε} ∪ PRIM(BC)

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 24 / 41

Ejemplo: cálculo de PRIMEROSS −→ A B CA −→ D E f C | a | εB −→ E G C | b | εC −→ c | εD −→ d | εE −→ e | εG −→ g

PRIM(G) = {g }PRIM(E) = {e , ε }PRIM(D) = {d , ε }PRIM(C) = {c , ε }PRIM(B) = {b , ε , e ,g }PRIM(A) = {a , ε ,d ,e , f }PRIM(S) = {a ,d ,e , f } ∪ PRIM(BC)

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 24 / 41

Ejemplo: cálculo de PRIMEROSS −→ A B CA −→ D E f C | a | εB −→ E G C | b | εC −→ c | εD −→ d | εE −→ e | εG −→ g

PRIM(G) = {g }PRIM(E) = {e , ε }PRIM(D) = {d , ε }PRIM(C) = {c , ε }PRIM(B) = {b , ε , e ,g }PRIM(A) = {a , ε ,d ,e , f }PRIM(S) = {a ,d ,e , f } ∪ PRIM(B)− {ε} ∪ PRIM(C)

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 24 / 41

Ejemplo: cálculo de PRIMEROSS −→ A B CA −→ D E f C | a | εB −→ E G C | b | εC −→ c | εD −→ d | εE −→ e | εG −→ g

PRIM(G) = {g }PRIM(E) = {e , ε }PRIM(D) = {d , ε }PRIM(C) = {c , ε }PRIM(B) = {b , ε , e ,g }PRIM(A) = {a , ε ,d ,e , f }PRIM(S) = {a ,d ,e , f ,b ,g } ∪ PRIM(C)

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 24 / 41

Ejemplo: cálculo de PRIMEROSS −→ A B CA −→ D E f C | a | εB −→ E G C | b | εC −→ c | εD −→ d | εE −→ e | εG −→ g

PRIM(G) = {g }PRIM(E) = {e , ε }PRIM(D) = {d , ε }PRIM(C) = {c , ε }PRIM(B) = {b , ε , e ,g }PRIM(A) = {a , ε ,d ,e , f }PRIM(S) = {a ,d ,e , f ,b ,g ,c , ε }

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 24 / 41

Ejemplo: cálculo de SIGUIENTESS −→ A B CA −→ D E f C | a | εB −→ E G C | b | εC −→ c | εD −→ d | εE −→ e | εG −→ g

SIG(S) = {$}SIG(A) =SIG(B) =SIG(C) =SIG(D) =SIG(E) =SIG(G) =

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 25 / 41

Ejemplo: cálculo de SIGUIENTESS −→ A B CA −→ D E f C | a | εB −→ E G C | b | εC −→ c | εD −→ d | εE −→ e | εG −→ g

SIG(S) = {$}SIG(A) =SIG(B) =SIG(C) =SIG(D) =SIG(E) =SIG(G) =

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 25 / 41

Ejemplo: cálculo de SIGUIENTESS −→ A B CA −→ D E f C | a | εB −→ E G C | b | εC −→ c | εD −→ d | εE −→ e | εG −→ g

SIG(S) = {$}SIG(A) = PRIM(BC)− {ε} ∪ SIG(S)SIG(B) =SIG(C) =SIG(D) =SIG(E) =SIG(G) =

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 25 / 41

Ejemplo: cálculo de SIGUIENTESS −→ A B CA −→ D E f C | a | εB −→ E G C | b | εC −→ c | εD −→ d | εE −→ e | εG −→ g

SIG(S) = {$}SIG(A) = {b ,e ,g } ∪ PRIM(C)− {ε} ∪ {$}SIG(B) =SIG(C) =SIG(D) =SIG(E) =SIG(G) =

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 25 / 41

Ejemplo: cálculo de SIGUIENTESS −→ A B CA −→ D E f C | a | εB −→ E G C | b | εC −→ c | εD −→ d | εE −→ e | εG −→ g

SIG(S) = {$}SIG(A) = {b ,e ,g ,c , $}SIG(B) =SIG(C) =SIG(D) =SIG(E) =SIG(G) =

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 25 / 41

Ejemplo: cálculo de SIGUIENTESS −→ A B CA −→ D E f C | a | εB −→ E G C | b | εC −→ c | εD −→ d | εE −→ e | εG −→ g

SIG(S) = {$}SIG(A) = {b ,e ,g ,c , $}SIG(B) = PRIM(C)− {ε} ∪ SIG(S)SIG(C) =SIG(D) =SIG(E) =SIG(G) =

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 25 / 41

Ejemplo: cálculo de SIGUIENTESS −→ A B CA −→ D E f C | a | εB −→ E G C | b | εC −→ c | εD −→ d | εE −→ e | εG −→ g

SIG(S) = {$}SIG(A) = {b ,e ,g ,c , $}SIG(B) = {c , $}SIG(C) =SIG(D) =SIG(E) =SIG(G) =

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 25 / 41

Ejemplo: cálculo de SIGUIENTESS −→ A B CA −→ D E f C | a | εB −→ E G C | b | εC −→ c | εD −→ d | εE −→ e | εG −→ g

SIG(S) = {$}SIG(A) = {b ,e ,g ,c , $}SIG(B) = {c , $}SIG(C) = SIG(S) ∪ SIG(A) ∪ SIG(B)SIG(D) =SIG(E) =SIG(G) =

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 25 / 41

Ejemplo: cálculo de SIGUIENTESS −→ A B CA −→ D E f C | a | εB −→ E G C | b | εC −→ c | εD −→ d | εE −→ e | εG −→ g

SIG(S) = {$}SIG(A) = {b ,e ,g ,c , $}SIG(B) = {c , $}SIG(C) = {$} ∪ {b ,e ,g ,c , $} ∪ {c , $}SIG(D) =SIG(E) =SIG(G) =

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 25 / 41

Ejemplo: cálculo de SIGUIENTESS −→ A B CA −→ D E f C | a | εB −→ E G C | b | εC −→ c | εD −→ d | εE −→ e | εG −→ g

SIG(S) = {$}SIG(A) = {b ,e ,g ,c , $}SIG(B) = {c , $}SIG(C) = {$ ,b ,e ,g ,c }SIG(D) =SIG(E) =SIG(G) =

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 25 / 41

Ejemplo: cálculo de SIGUIENTESS −→ A B CA −→ D E f C | a | εB −→ E G C | b | εC −→ c | εD −→ d | εE −→ e | εG −→ g

SIG(S) = {$}SIG(A) = {b ,e ,g ,c , $}SIG(B) = {c , $}SIG(C) = {$ ,b ,e ,g ,c }SIG(D) = PRIM(EfC)SIG(E) =SIG(G) =

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 25 / 41

Ejemplo: cálculo de SIGUIENTESS −→ A B CA −→ D E f C | a | εB −→ E G C | b | εC −→ c | εD −→ d | εE −→ e | εG −→ g

SIG(S) = {$}SIG(A) = {b ,e ,g ,c , $}SIG(B) = {c , $}SIG(C) = {$ ,b ,e ,g ,c }SIG(D) = PRIM(E)− {ε} ∪ PRIM(fC)SIG(E) =SIG(G) =

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 25 / 41

Ejemplo: cálculo de SIGUIENTESS −→ A B CA −→ D E f C | a | εB −→ E G C | b | εC −→ c | εD −→ d | εE −→ e | εG −→ g

SIG(S) = {$}SIG(A) = {b ,e ,g ,c , $}SIG(B) = {c , $}SIG(C) = {$ ,b ,e ,g ,c }SIG(D) = {e } ∪ {f }SIG(E) =SIG(G) =

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 25 / 41

Ejemplo: cálculo de SIGUIENTESS −→ A B CA −→ D E f C | a | εB −→ E G C | b | εC −→ c | εD −→ d | εE −→ e | εG −→ g

SIG(S) = {$}SIG(A) = {b ,e ,g ,c , $}SIG(B) = {c , $}SIG(C) = {$ ,b ,e ,g ,c }SIG(D) = {e , f }SIG(E) =SIG(G) =

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 25 / 41

Ejemplo: cálculo de SIGUIENTESS −→ A B CA −→ D E f C | a | εB −→ E G C | b | εC −→ c | εD −→ d | εE −→ e | εG −→ g

SIG(S) = {$}SIG(A) = {b ,e ,g ,c , $}SIG(B) = {c , $}SIG(C) = {$ ,b ,e ,g ,c }SIG(D) = {e , f }SIG(E) = PRIM(fC) ∪ PRIM(GC)SIG(G) =

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 25 / 41

Ejemplo: cálculo de SIGUIENTESS −→ A B CA −→ D E f C | a | εB −→ E G C | b | εC −→ c | εD −→ d | εE −→ e | εG −→ g

SIG(S) = {$}SIG(A) = {b ,e ,g ,c , $}SIG(B) = {c , $}SIG(C) = {$ ,b ,e ,g ,c }SIG(D) = {e , f }SIG(E) = {f } ∪ {g }SIG(G) =

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 25 / 41

Ejemplo: cálculo de SIGUIENTESS −→ A B CA −→ D E f C | a | εB −→ E G C | b | εC −→ c | εD −→ d | εE −→ e | εG −→ g

SIG(S) = {$}SIG(A) = {b ,e ,g ,c , $}SIG(B) = {c , $}SIG(C) = {$ ,b ,e ,g ,c }SIG(D) = {e , f }SIG(E) = {f ,g }SIG(G) =

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 25 / 41

Ejemplo: cálculo de SIGUIENTESS −→ A B CA −→ D E f C | a | εB −→ E G C | b | εC −→ c | εD −→ d | εE −→ e | εG −→ g

SIG(S) = {$}SIG(A) = {b ,e ,g ,c , $}SIG(B) = {c , $}SIG(C) = {$ ,b ,e ,g ,c }SIG(D) = {e , f }SIG(E) = {f ,g }SIG(G) = PRIM(C)− {ε} ∪ SIG(B)

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 25 / 41

Ejemplo: cálculo de SIGUIENTESS −→ A B CA −→ D E f C | a | εB −→ E G C | b | εC −→ c | εD −→ d | εE −→ e | εG −→ g

SIG(S) = {$}SIG(A) = {b ,e ,g ,c , $}SIG(B) = {c , $}SIG(C) = {$ ,b ,e ,g ,c }SIG(D) = {e , f }SIG(E) = {f ,g }SIG(G) = {c } ∪ {c , $ }

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 25 / 41

Ejemplo: cálculo de SIGUIENTESS −→ A B CA −→ D E f C | a | εB −→ E G C | b | εC −→ c | εD −→ d | εE −→ e | εG −→ g

SIG(S) = {$}SIG(A) = {b ,e ,g ,c , $}SIG(B) = {c , $}SIG(C) = {$ ,b ,e ,g ,c }SIG(D) = {e , f }SIG(E) = {f ,g }SIG(G) = {c , $ }

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 25 / 41

Ejemplo: cálculo de conjuntos de predicción

S −→ A B CA −→ D E f CA −→ aA −→ εB −→ E G CB −→ bB −→ εC −→ cC −→ εD −→ dD −→ εE −→ eE −→ εG −→ g

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 26 / 41

Ejemplo: cálculo de conjuntos de predicción

S −→ A B CA −→ D E f CA −→ a {a }A −→ εB −→ E G CB −→ b {b }B −→ εC −→ c {c }C −→ εD −→ d {d }D −→ εE −→ e {e }E −→ εG −→ g {g }

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 26 / 41

Ejemplo: cálculo de conjuntos de predicción

S −→ A B CA −→ D E f CA −→ a {a }A −→ ε SIG(A)B −→ E G CB −→ b {b }B −→ ε SIG(B)C −→ c {c }C −→ ε SIG(C)D −→ d {d }D −→ ε SIG(D)E −→ e {e }E −→ ε SIG(E)G −→ g {g }

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 26 / 41

Ejemplo: cálculo de conjuntos de predicción

S −→ A B CA −→ D E f CA −→ a {a }A −→ ε {b , e ,g , c , $}B −→ E G CB −→ b {b }B −→ ε {c , $}C −→ c {c }C −→ ε {$ ,b , e ,g , c }D −→ d {d }D −→ ε {e , f }E −→ e {e }E −→ ε {f ,g }G −→ g {g }

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 26 / 41

Ejemplo: cálculo de conjuntos de predicción

S −→ A B CA −→ D E f CA −→ a {a }A −→ ε {b , e ,g , c , $}B −→ E G C PRIM(EGC)B −→ b {b }B −→ ε {c , $}C −→ c {c }C −→ ε {$ ,b , e ,g , c }D −→ d {d }D −→ ε {e , f }E −→ e {e }E −→ ε {f ,g }G −→ g {g }

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 26 / 41

Ejemplo: cálculo de conjuntos de predicción

S −→ A B CA −→ D E f CA −→ a {a }A −→ ε {b , e ,g , c , $}B −→ E G C {e ,g }B −→ b {b }B −→ ε {c , $}C −→ c {c }C −→ ε {$ ,b , e ,g , c }D −→ d {d }D −→ ε {e , f }E −→ e {e }E −→ ε {f ,g }G −→ g {g }

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 26 / 41

Ejemplo: cálculo de conjuntos de predicción

S −→ A B CA −→ D E f C PRIM(DEfC)A −→ a {a }A −→ ε {b , e ,g , c , $}B −→ E G C {e ,g }B −→ b {b }B −→ ε {c , $}C −→ c {c }C −→ ε {$ ,b , e ,g , c }D −→ d {d }D −→ ε {e , f }E −→ e {e }E −→ ε {f ,g }G −→ g {g }

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 26 / 41

Ejemplo: cálculo de conjuntos de predicción

S −→ A B CA −→ D E f C {d , e , f }A −→ a {a }A −→ ε {b , e ,g , c , $}B −→ E G C {e ,g }B −→ b {b }B −→ ε {c , $}C −→ c {c }C −→ ε {$ ,b , e ,g , c }D −→ d {d }D −→ ε {e , f }E −→ e {e }E −→ ε {f ,g }G −→ g {g }

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 26 / 41

Ejemplo: cálculo de conjuntos de predicción

S −→ A B C PRIM(ABC)− {ε} ∪ SIG(S)A −→ D E f C {d , e , f }A −→ a {a }A −→ ε {b , e ,g , c , $}B −→ E G C {e ,g }B −→ b {b }B −→ ε {c , $}C −→ c {c }C −→ ε {$ ,b , e ,g , c }D −→ d {d }D −→ ε {e , f }E −→ e {e }E −→ ε {f ,g }G −→ g {g }

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 26 / 41

Ejemplo: cálculo de conjuntos de predicción

S −→ A B C {a ,d , e , f ,b ,g , c } ∪ {$}A −→ D E f C {d , e , f }A −→ a {a }A −→ ε {b , e ,g , c , $}B −→ E G C {e ,g }B −→ b {b }B −→ ε {c , $}C −→ c {c }C −→ ε {$ ,b , e ,g , c }D −→ d {d }D −→ ε {e , f }E −→ e {e }E −→ ε {f ,g }G −→ g {g }

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 26 / 41

Ejemplo: cálculo de conjuntos de predicción

S −→ A B C {a ,d , e , f ,b ,g , c , $}A −→ D E f C {d , e , f }A −→ a {a }A −→ ε {b , e ,g , c , $}B −→ E G C {e ,g }B −→ b {b }B −→ ε {c , $}C −→ c {c }C −→ ε {$ ,b , e ,g , c }D −→ d {d }D −→ ε {e , f }E −→ e {e }E −→ ε {f ,g }G −→ g {g }

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 26 / 41

Ejercicio 1

Calcula los conjuntos de PRIMEROS y SIGUIENTES de los noterminales de la siguiente gramática, y los conjuntos de predicción delas reglas:

S −→ A uno B CS −→ S dosA −→ B C DA −→ A tresA −→ εB −→ D cuatro C tresB −→ εC −→ cinco D BC −→ εD −→ seisD −→ ε

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 27 / 41

Ejercicio 2

Calcula los conjuntos de PRIMEROS y SIGUIENTES de los noterminales de la siguiente gramática, y los conjuntos de predicción delas reglas:

S −→ A B unoA −→ dos BA −→ εB −→ C DB −→ tresB −→ εC −→ cuatro A BC −→ cincoD −→ seisD −→ ε

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 28 / 41

Condición LL(1)¿Qué ocurriría si ...

A −→ α1 {. . . ,a , . . .}A −→ α2 {. . . ,a , . . .}

... aparece el mismo símbolo en dos o más conjuntos de predicción delmismo no terminal?

Evidentemente, cuando en la entrada aparezca elsímbolo a y el analizador tuviera que derivar el no terminal A, no sabríaelegir qué regla aplicar.

Condición LL(1): una gramática G se dice cumple lacondición LL(1), si para todos los no terminales,no existen símbolos comunes en los conjuntosde predicción de sus reglas.

Dicho de otro modo: si existe un símbolo común en los conjuntos de dosreglas del mismo no terminal, se puede decir que la gramática no es LL(1)IMPORTANTE: para poder hacer un análisis sintáctico descendente entiempo lineal es necesario que la gramática sea LL(1)

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 29 / 41

Condición LL(1)¿Qué ocurriría si ...

A −→ α1 {. . . ,a , . . .}A −→ α2 {. . . ,a , . . .}

... aparece el mismo símbolo en dos o más conjuntos de predicción delmismo no terminal? Evidentemente, cuando en la entrada aparezca elsímbolo a y el analizador tuviera que derivar el no terminal A, no sabríaelegir qué regla aplicar.

Condición LL(1): una gramática G se dice cumple lacondición LL(1), si para todos los no terminales,no existen símbolos comunes en los conjuntosde predicción de sus reglas.

Dicho de otro modo: si existe un símbolo común en los conjuntos de dosreglas del mismo no terminal, se puede decir que la gramática no es LL(1)IMPORTANTE: para poder hacer un análisis sintáctico descendente entiempo lineal es necesario que la gramática sea LL(1)

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 29 / 41

Condición LL(1)¿Qué ocurriría si ...

A −→ α1 {. . . ,a , . . .}A −→ α2 {. . . ,a , . . .}

... aparece el mismo símbolo en dos o más conjuntos de predicción delmismo no terminal? Evidentemente, cuando en la entrada aparezca elsímbolo a y el analizador tuviera que derivar el no terminal A, no sabríaelegir qué regla aplicar.

Condición LL(1): una gramática G se dice cumple lacondición LL(1), si para todos los no terminales,no existen símbolos comunes en los conjuntosde predicción de sus reglas.

Dicho de otro modo: si existe un símbolo común en los conjuntos de dosreglas del mismo no terminal, se puede decir que la gramática no es LL(1)IMPORTANTE: para poder hacer un análisis sintáctico descendente entiempo lineal es necesario que la gramática sea LL(1)

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 29 / 41

Condición LL(1)¿Qué ocurriría si ...

A −→ α1 {. . . ,a , . . .}A −→ α2 {. . . ,a , . . .}

... aparece el mismo símbolo en dos o más conjuntos de predicción delmismo no terminal? Evidentemente, cuando en la entrada aparezca elsímbolo a y el analizador tuviera que derivar el no terminal A, no sabríaelegir qué regla aplicar.

Condición LL(1): una gramática G se dice cumple lacondición LL(1), si para todos los no terminales,no existen símbolos comunes en los conjuntosde predicción de sus reglas.

Dicho de otro modo: si existe un símbolo común en los conjuntos de dosreglas del mismo no terminal, se puede decir que la gramática no es LL(1)

IMPORTANTE: para poder hacer un análisis sintáctico descendente entiempo lineal es necesario que la gramática sea LL(1)

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 29 / 41

Condición LL(1)¿Qué ocurriría si ...

A −→ α1 {. . . ,a , . . .}A −→ α2 {. . . ,a , . . .}

... aparece el mismo símbolo en dos o más conjuntos de predicción delmismo no terminal? Evidentemente, cuando en la entrada aparezca elsímbolo a y el analizador tuviera que derivar el no terminal A, no sabríaelegir qué regla aplicar.

Condición LL(1): una gramática G se dice cumple lacondición LL(1), si para todos los no terminales,no existen símbolos comunes en los conjuntosde predicción de sus reglas.

Dicho de otro modo: si existe un símbolo común en los conjuntos de dosreglas del mismo no terminal, se puede decir que la gramática no es LL(1)IMPORTANTE: para poder hacer un análisis sintáctico descendente entiempo lineal es necesario que la gramática sea LL(1)

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 29 / 41

Características no LL(1)

Realmente, para asegurar que una gramática no es LL(1) se debecomprobar que no cumpla la condición LL(1).

Sin embargo, hayalgunas características que hacen que una gramática no sea LL(1):

1 Recursividad por la izquierda

A −→ A . . .A −→ . . .

2 Factores comunes por la izquierda

A −→ α β1

. . .A −→ α βm

3 Ambigüedad

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 30 / 41

Características no LL(1)

Realmente, para asegurar que una gramática no es LL(1) se debecomprobar que no cumpla la condición LL(1). Sin embargo, hayalgunas características que hacen que una gramática no sea LL(1):

1 Recursividad por la izquierda

A −→ A . . .A −→ . . .

2 Factores comunes por la izquierda

A −→ α β1

. . .A −→ α βm

3 Ambigüedad

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 30 / 41

Características no LL(1)

Realmente, para asegurar que una gramática no es LL(1) se debecomprobar que no cumpla la condición LL(1). Sin embargo, hayalgunas características que hacen que una gramática no sea LL(1):

1 Recursividad por la izquierda

A −→ A . . .A −→ . . .

2 Factores comunes por la izquierda

A −→ α β1

. . .A −→ α βm

3 Ambigüedad

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 30 / 41

Características no LL(1)

Realmente, para asegurar que una gramática no es LL(1) se debecomprobar que no cumpla la condición LL(1). Sin embargo, hayalgunas características que hacen que una gramática no sea LL(1):

1 Recursividad por la izquierda

A −→ A . . .A −→ . . .

2 Factores comunes por la izquierda

A −→ α β1

. . .A −→ α βm

3 Ambigüedad

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 30 / 41

Características no LL(1)

Realmente, para asegurar que una gramática no es LL(1) se debecomprobar que no cumpla la condición LL(1). Sin embargo, hayalgunas características que hacen que una gramática no sea LL(1):

1 Recursividad por la izquierda

A −→ A . . .A −→ . . .

2 Factores comunes por la izquierda

A −→ α β1

. . .A −→ α βm

3 Ambigüedad

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 30 / 41

Condición LL(1) y ambigüedad

MUY IMPORTANTE:si una gramática no es LL(1), NO SIEMPRE va a ser ambigua.

La única forma de determinar que una gramática es ambigua esencontrando dos o más árboles de derivación para una cadena.Si una gramática es LL(1), podemos afirmar que no es ambigua.Si no es LL(1), puede que sea ambigua, o puede que no lo sea

A −→ B unoA −→ dosB −→ dos

No es LL(1), y no es ambigua

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 31 / 41

Condición LL(1) y ambigüedad

MUY IMPORTANTE:si una gramática no es LL(1), NO SIEMPRE va a ser ambigua.La única forma de determinar que una gramática es ambigua esencontrando dos o más árboles de derivación para una cadena.

Si una gramática es LL(1), podemos afirmar que no es ambigua.Si no es LL(1), puede que sea ambigua, o puede que no lo sea

A −→ B unoA −→ dosB −→ dos

No es LL(1), y no es ambigua

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 31 / 41

Condición LL(1) y ambigüedad

MUY IMPORTANTE:si una gramática no es LL(1), NO SIEMPRE va a ser ambigua.La única forma de determinar que una gramática es ambigua esencontrando dos o más árboles de derivación para una cadena.Si una gramática es LL(1), podemos afirmar que no es ambigua.Si no es LL(1), puede que sea ambigua, o puede que no lo sea

A −→ B unoA −→ dosB −→ dos

No es LL(1), y no es ambigua

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 31 / 41

Condición LL(1) y ambigüedad

MUY IMPORTANTE:si una gramática no es LL(1), NO SIEMPRE va a ser ambigua.La única forma de determinar que una gramática es ambigua esencontrando dos o más árboles de derivación para una cadena.Si una gramática es LL(1), podemos afirmar que no es ambigua.Si no es LL(1), puede que sea ambigua, o puede que no lo sea

A −→ B unoA −→ dosB −→ dos

No es LL(1), y no es ambigua

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 31 / 41

Condiciones LL(k) y LL(*)La condición LL(1) es la condición que deben cumplir lasgramáticas para las que se quiera hacer un análisis lineal deizquierda a derecha (Left-to-right), usando la derivación por laizquierda (Leftmost derivation) y mirando solamente 1 símbolo dela entrada.

Si en lugar de mirar un símbolo de la entrada se miraran ksímbolos (k > 1), sería posible realizar el análisis en tiempo linealpara un conjunto más amplio de gramáticas. Por ejemplo:

A −→ B unoA −→ dosB −→ dos

No es LL(1), pero sí es LL(2).Existe una condición, LL(*), que es más general que la condiciónLL(k), y que permite realizar el análisis lineal con un conjuntotodavía mayor de gramáticas

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 32 / 41

Condiciones LL(k) y LL(*)La condición LL(1) es la condición que deben cumplir lasgramáticas para las que se quiera hacer un análisis lineal deizquierda a derecha (Left-to-right), usando la derivación por laizquierda (Leftmost derivation) y mirando solamente 1 símbolo dela entrada.Si en lugar de mirar un símbolo de la entrada se miraran ksímbolos (k > 1), sería posible realizar el análisis en tiempo linealpara un conjunto más amplio de gramáticas.

Por ejemplo:

A −→ B unoA −→ dosB −→ dos

No es LL(1), pero sí es LL(2).Existe una condición, LL(*), que es más general que la condiciónLL(k), y que permite realizar el análisis lineal con un conjuntotodavía mayor de gramáticas

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 32 / 41

Condiciones LL(k) y LL(*)La condición LL(1) es la condición que deben cumplir lasgramáticas para las que se quiera hacer un análisis lineal deizquierda a derecha (Left-to-right), usando la derivación por laizquierda (Leftmost derivation) y mirando solamente 1 símbolo dela entrada.Si en lugar de mirar un símbolo de la entrada se miraran ksímbolos (k > 1), sería posible realizar el análisis en tiempo linealpara un conjunto más amplio de gramáticas. Por ejemplo:

A −→ B unoA −→ dosB −→ dos

No es LL(1), pero sí es LL(2).

Existe una condición, LL(*), que es más general que la condiciónLL(k), y que permite realizar el análisis lineal con un conjuntotodavía mayor de gramáticas

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 32 / 41

Condiciones LL(k) y LL(*)La condición LL(1) es la condición que deben cumplir lasgramáticas para las que se quiera hacer un análisis lineal deizquierda a derecha (Left-to-right), usando la derivación por laizquierda (Leftmost derivation) y mirando solamente 1 símbolo dela entrada.Si en lugar de mirar un símbolo de la entrada se miraran ksímbolos (k > 1), sería posible realizar el análisis en tiempo linealpara un conjunto más amplio de gramáticas. Por ejemplo:

A −→ B unoA −→ dosB −→ dos

No es LL(1), pero sí es LL(2).Existe una condición, LL(*), que es más general que la condiciónLL(k), y que permite realizar el análisis lineal con un conjuntotodavía mayor de gramáticas

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 32 / 41

Transformaciones para conseguir la condición LL(1)La recursividad por la izquierda y los factores comunes por laizquierda se pueden eliminar de una gramática sin mucha dificultad.

Sin embargo, la ambigüedad (si se ha detectado) no es fácil deeliminar y requiere un rediseño manual de la gramática. Además, nosiempre que la gramática no es LL(1) es porque es ambigua.

Eliminación de la recursividad por la izquierda:

A −→ A α1. . .A −→ A αnA −→ β1. . .A −→ βm

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 33 / 41

Transformaciones para conseguir la condición LL(1)La recursividad por la izquierda y los factores comunes por laizquierda se pueden eliminar de una gramática sin mucha dificultad.Sin embargo, la ambigüedad (si se ha detectado) no es fácil deeliminar y requiere un rediseño manual de la gramática.

Además, nosiempre que la gramática no es LL(1) es porque es ambigua.

Eliminación de la recursividad por la izquierda:

A −→ A α1. . .A −→ A αnA −→ β1. . .A −→ βm

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 33 / 41

Transformaciones para conseguir la condición LL(1)La recursividad por la izquierda y los factores comunes por laizquierda se pueden eliminar de una gramática sin mucha dificultad.Sin embargo, la ambigüedad (si se ha detectado) no es fácil deeliminar y requiere un rediseño manual de la gramática. Además, nosiempre que la gramática no es LL(1) es porque es ambigua.

Eliminación de la recursividad por la izquierda:

A −→ A α1. . .A −→ A αnA −→ β1. . .A −→ βm

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 33 / 41

Transformaciones para conseguir la condición LL(1)La recursividad por la izquierda y los factores comunes por laizquierda se pueden eliminar de una gramática sin mucha dificultad.Sin embargo, la ambigüedad (si se ha detectado) no es fácil deeliminar y requiere un rediseño manual de la gramática. Además, nosiempre que la gramática no es LL(1) es porque es ambigua.

Eliminación de la recursividad por la izquierda:

A −→ A α1. . .A −→ A αnA −→ β1. . .A −→ βm

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 33 / 41

Transformaciones para conseguir la condición LL(1)La recursividad por la izquierda y los factores comunes por laizquierda se pueden eliminar de una gramática sin mucha dificultad.Sin embargo, la ambigüedad (si se ha detectado) no es fácil deeliminar y requiere un rediseño manual de la gramática. Además, nosiempre que la gramática no es LL(1) es porque es ambigua.

Eliminación de la recursividad por la izquierda:

A −→ A α1 A −→ β1A’. . . . . .A −→ A αn A −→ βmA’A −→ β1 A’ −→ α1A’. . . . . .A −→ βm A’ −→ αnA’

A’ −→ ε

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 33 / 41

Transformaciones para conseguir la condición LL(1)(2)

Ejemplo de eliminación de la recursividad por la izquierda:

E −→ E opsuma TE −→ T

α1 ≡ opsuma Tβ1 ≡ T

E −→ T E’E’ −→ opsuma T E’E’ −→ ε

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 34 / 41

Transformaciones para conseguir la condición LL(1)(2)

Ejemplo de eliminación de la recursividad por la izquierda:

E −→ E opsuma TE −→ T

α1 ≡ opsuma Tβ1 ≡ T

E −→ T E’E’ −→ opsuma T E’E’ −→ ε

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 34 / 41

Transformaciones para conseguir la condición LL(1)(2)

Ejemplo de eliminación de la recursividad por la izquierda:

E −→ E opsuma TE −→ T

α1 ≡ opsuma Tβ1 ≡ T

E −→ T E’E’ −→ opsuma T E’E’ −→ ε

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 34 / 41

Transformaciones para conseguir la condición LL(1)(3)

Eliminación de los factores comunes por la izquierda:

A −→ αβ1. . .A −→ αβm

Ejemplo:

Inst −→ if E then Inst endifInst −→ if E then Inst else Inst endif

Inst −→ if E then Inst Inst’Inst’ −→ endifInst’ −→ else Inst endif

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 35 / 41

Transformaciones para conseguir la condición LL(1)(3)

Eliminación de los factores comunes por la izquierda:

A −→ αβ1 A −→ αA’. . . A’ −→ β1A −→ αβm . . .

A’ −→ βm

Ejemplo:

Inst −→ if E then Inst endifInst −→ if E then Inst else Inst endif

Inst −→ if E then Inst Inst’Inst’ −→ endifInst’ −→ else Inst endif

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 35 / 41

Transformaciones para conseguir la condición LL(1)(3)

Eliminación de los factores comunes por la izquierda:

A −→ αβ1 A −→ αA’. . . A’ −→ β1A −→ αβm . . .

A’ −→ βm

Ejemplo:

Inst −→ if E then Inst endifInst −→ if E then Inst else Inst endif

Inst −→ if E then Inst Inst’Inst’ −→ endifInst’ −→ else Inst endif

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 35 / 41

Transformaciones para conseguir la condición LL(1)(3)

Eliminación de los factores comunes por la izquierda:

A −→ αβ1 A −→ αA’. . . A’ −→ β1A −→ αβm . . .

A’ −→ βm

Ejemplo:

Inst −→ if E then Inst endifInst −→ if E then Inst else Inst endif

Inst −→ if E then Inst Inst’Inst’ −→ endifInst’ −→ else Inst endif

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 35 / 41

Analizador sintáctico descendente recursivo

Una forma muy común de realizar un análisis lineal con unagramática LL(1) es utilizando un analizador sintático descendenterecursivo (ASDR)

Antes de programar el ASDR, es necesario calcular los conjuntosde predicción de todas las reglas y comprobar que la gramáticaes LL(1)En un ASDR, se debe diseñar una función para cada no terminalde la gramáticaSe utiliza una función auxiliar para emparejar terminalesCuando se tiene que derivar un no terminal, se llama a la funciónasociada a ese no terminal, y es la función la que se encarga deanalizar el sublenguaje generado por dicho no terminal

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 36 / 41

Analizador sintáctico descendente recursivo

Una forma muy común de realizar un análisis lineal con unagramática LL(1) es utilizando un analizador sintático descendenterecursivo (ASDR)Antes de programar el ASDR, es necesario calcular los conjuntosde predicción de todas las reglas y comprobar que la gramáticaes LL(1)

En un ASDR, se debe diseñar una función para cada no terminalde la gramáticaSe utiliza una función auxiliar para emparejar terminalesCuando se tiene que derivar un no terminal, se llama a la funciónasociada a ese no terminal, y es la función la que se encarga deanalizar el sublenguaje generado por dicho no terminal

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 36 / 41

Analizador sintáctico descendente recursivo

Una forma muy común de realizar un análisis lineal con unagramática LL(1) es utilizando un analizador sintático descendenterecursivo (ASDR)Antes de programar el ASDR, es necesario calcular los conjuntosde predicción de todas las reglas y comprobar que la gramáticaes LL(1)En un ASDR, se debe diseñar una función para cada no terminalde la gramática

Se utiliza una función auxiliar para emparejar terminalesCuando se tiene que derivar un no terminal, se llama a la funciónasociada a ese no terminal, y es la función la que se encarga deanalizar el sublenguaje generado por dicho no terminal

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 36 / 41

Analizador sintáctico descendente recursivo

Una forma muy común de realizar un análisis lineal con unagramática LL(1) es utilizando un analizador sintático descendenterecursivo (ASDR)Antes de programar el ASDR, es necesario calcular los conjuntosde predicción de todas las reglas y comprobar que la gramáticaes LL(1)En un ASDR, se debe diseñar una función para cada no terminalde la gramáticaSe utiliza una función auxiliar para emparejar terminales

Cuando se tiene que derivar un no terminal, se llama a la funciónasociada a ese no terminal, y es la función la que se encarga deanalizar el sublenguaje generado por dicho no terminal

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 36 / 41

Analizador sintáctico descendente recursivo

Una forma muy común de realizar un análisis lineal con unagramática LL(1) es utilizando un analizador sintático descendenterecursivo (ASDR)Antes de programar el ASDR, es necesario calcular los conjuntosde predicción de todas las reglas y comprobar que la gramáticaes LL(1)En un ASDR, se debe diseñar una función para cada no terminalde la gramáticaSe utiliza una función auxiliar para emparejar terminalesCuando se tiene que derivar un no terminal, se llama a la funciónasociada a ese no terminal, y es la función la que se encarga deanalizar el sublenguaje generado por dicho no terminal

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 36 / 41

Analizador sintáctico descendente recursivo (2)

Ejemplo:

A −→ B unoA −→ dosB −→ tresB −→ cuatro A

public final void A(){if (token.tipo == Token.TRES || token.tipo == Token.CUATRO) {

B();emparejar(Token.UNO);

}else if (token.tipo == Token.DOS) {

emparejar(Token.DOS);}else errorSintaxis(Token.TRES,Token.CUATRO,Token.DOS);

}

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 37 / 41

Analizador sintáctico descendente recursivo (3)class AnalizadorSintactico {...public final void emparejar(int tokEsperado){if (token.tipo == tokEsperado)

token = lexico.getNextToken();else

errorSintaxis(tokEsperado);}

}class Compilador {public void Main(...) {

...AnalizadorLexico al = new AnalizadorLexico(ficheroentrada)AnalizadorSintactico asdr = new AnalizadorSintactico(al);

asdr.A(); // símbolo inicial de la gramáticaasdr.comprobarFinFichero();// if (token.tipo != Token.FINFICHERO)// errorSintaxis(Token.FINFICHERO);

}} Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 38 / 41

Ejercicio 3Dada la siguiente gramática:

S −→ A B CS −→ D EA −→ dos B tresA −→ εB −→ B cuatro C cincoB −→ εC −→ seis A BC −→ εD −→ uno A ED −→ BE −→ tres

1 Calcula los conjuntos de PRIMEROS de cada no terminal.2 Calcula los conjuntos de SIGUIENTES de cada no terminal.3 Calcula los conjuntos de predicción de cada regla.4 Di si la gramática es LL(1) o no y por qué.5 Escribe la función del no terminal A en un ASDR.Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 39 / 41

Ejercicio 4Dada la siguiente gramática:

S −→ B unoS −→ dos CS −→ εA −→ S tres B CA −→ cuatroA −→ εB −→ A cinco C seisB −→ εC −→ siete BC −→ ε

1 Calcula los conjuntos de PRIMEROS de cada no terminal.2 Calcula los conjuntos de SIGUIENTES de cada no terminal.3 Calcula los conjuntos de predicción de cada regla.4 Di si la gramática es LL(1) o no y por qué.5 Escribe la función del no terminal B en un ASDR.

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 40 / 41

Ejercicio 5Dada la siguiente gramática:

S −→ A B CS −→ S unoA −→ dos B CA −→ εB −→ C tresB −→ εC −→ cuatro BC −→ ε

1 Calcula los conjuntos de PRIMEROS de cada no terminal.

2 Calcula los conjuntos de SIGUIENTES de cada no terminal.

3 Calcula los conjuntos de predicción de cada regla.

4 Di si la gramática es LL(1) o no y por qué.

5 Escribe la función del no terminal C en un ASDR.

Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 41 / 41

top related