dept. de lenguajes y sistemas informáticos ... - dlsi.ua.es€¦ · la primera acción de un...

41
Tema 3: Análisis sintáctico descendente Procesamiento de Lenguajes Dept. de Lenguajes y Sistemas Informáticos Universidad de Alicante Procesamiento de Lenguajes Tema 3: Análisis sintáctico descendente 1 / 41

Upload: others

Post on 08-May-2020

4 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Dept. de Lenguajes y Sistemas Informáticos ... - dlsi.ua.es€¦ · La primera acción de un analizador sintáctico es obtener un token de la entrada, llamando al analizador léxico

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

Page 2: Dept. de Lenguajes y Sistemas Informáticos ... - dlsi.ua.es€¦ · La primera acción de un analizador sintáctico es obtener un token de la entrada, llamando al analizador léxico

¿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

Page 3: Dept. de Lenguajes y Sistemas Informáticos ... - dlsi.ua.es€¦ · La primera acción de un analizador sintáctico es obtener un token de la entrada, llamando al analizador léxico

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

Page 4: Dept. de Lenguajes y Sistemas Informáticos ... - dlsi.ua.es€¦ · La primera acción de un analizador sintáctico es obtener un token de la entrada, llamando al analizador léxico

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

Page 5: Dept. de Lenguajes y Sistemas Informáticos ... - dlsi.ua.es€¦ · La primera acción de un analizador sintáctico es obtener un token de la entrada, llamando al analizador léxico

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

Page 6: Dept. de Lenguajes y Sistemas Informáticos ... - dlsi.ua.es€¦ · La primera acción de un analizador sintáctico es obtener un token de la entrada, llamando al analizador léxico

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

Page 7: Dept. de Lenguajes y Sistemas Informáticos ... - dlsi.ua.es€¦ · La primera acción de un analizador sintáctico es obtener un token de la entrada, llamando al analizador léxico

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

Page 8: Dept. de Lenguajes y Sistemas Informáticos ... - dlsi.ua.es€¦ · La primera acción de un analizador sintáctico es obtener un token de la entrada, llamando al analizador léxico

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

Page 9: Dept. de Lenguajes y Sistemas Informáticos ... - dlsi.ua.es€¦ · La primera acción de un analizador sintáctico es obtener un token de la entrada, llamando al analizador léxico

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

Page 10: Dept. de Lenguajes y Sistemas Informáticos ... - dlsi.ua.es€¦ · La primera acción de un analizador sintáctico es obtener un token de la entrada, llamando al analizador léxico

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

Page 11: Dept. de Lenguajes y Sistemas Informáticos ... - dlsi.ua.es€¦ · La primera acción de un analizador sintáctico es obtener un token de la entrada, llamando al analizador léxico

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

Page 12: Dept. de Lenguajes y Sistemas Informáticos ... - dlsi.ua.es€¦ · La primera acción de un analizador sintáctico es obtener un token de la entrada, llamando al analizador léxico

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

Page 13: Dept. de Lenguajes y Sistemas Informáticos ... - dlsi.ua.es€¦ · La primera acción de un analizador sintáctico es obtener un token de la entrada, llamando al analizador léxico

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

Page 14: Dept. de Lenguajes y Sistemas Informáticos ... - dlsi.ua.es€¦ · La primera acción de un analizador sintáctico es obtener un token de la entrada, llamando al analizador léxico

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

Page 15: Dept. de Lenguajes y Sistemas Informáticos ... - dlsi.ua.es€¦ · La primera acción de un analizador sintáctico es obtener un token de la entrada, llamando al analizador léxico

Predicción de la regla a aplicar (5)

¿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 15 / 41

Page 16: Dept. de Lenguajes y Sistemas Informáticos ... - dlsi.ua.es€¦ · La primera acción de un analizador sintáctico es obtener un token de la entrada, llamando al analizador léxico

Predicción de la regla a aplicar (6)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 16 / 41

Page 17: Dept. de Lenguajes y Sistemas Informáticos ... - dlsi.ua.es€¦ · La primera acción de un analizador sintáctico es obtener un token de la entrada, llamando al analizador léxico

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 17 / 41

Page 18: Dept. de Lenguajes y Sistemas Informáticos ... - dlsi.ua.es€¦ · La primera acción de un analizador sintáctico es obtener un token de la entrada, llamando al analizador léxico

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 18 / 41

Page 19: Dept. de Lenguajes y Sistemas Informáticos ... - dlsi.ua.es€¦ · La primera acción de un analizador sintáctico es obtener un token de la entrada, llamando al analizador léxico

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 19 / 41

Page 20: Dept. de Lenguajes y Sistemas Informáticos ... - dlsi.ua.es€¦ · La primera acción de un analizador sintáctico es obtener un token de la entrada, llamando al analizador léxico

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 20 / 41

Page 21: Dept. de Lenguajes y Sistemas Informáticos ... - dlsi.ua.es€¦ · La primera acción de un analizador sintáctico es obtener un token de la entrada, llamando al analizador léxico

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 21 / 41

Page 22: Dept. de Lenguajes y Sistemas Informáticos ... - dlsi.ua.es€¦ · La primera acción de un analizador sintáctico es obtener un token de la entrada, llamando al analizador léxico

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 22 / 41

Page 23: Dept. de Lenguajes y Sistemas Informáticos ... - dlsi.ua.es€¦ · La primera acción de un analizador sintáctico es obtener un token de la entrada, llamando al analizador léxico

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 23 / 41

Page 24: Dept. de Lenguajes y Sistemas Informáticos ... - dlsi.ua.es€¦ · La primera acción de un analizador sintáctico es obtener un token de la entrada, llamando al analizador léxico

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 24 / 41

Page 25: Dept. de Lenguajes y Sistemas Informáticos ... - dlsi.ua.es€¦ · La primera acción de un analizador sintáctico es obtener un token de la entrada, llamando al analizador léxico

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 25 / 41

Page 26: Dept. de Lenguajes y Sistemas Informáticos ... - dlsi.ua.es€¦ · La primera acción de un analizador sintáctico es obtener un token de la entrada, llamando al analizador léxico

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 26 / 41

Page 27: Dept. de Lenguajes y Sistemas Informáticos ... - dlsi.ua.es€¦ · La primera acción de un analizador sintáctico es obtener un token de la entrada, llamando al analizador léxico

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 27 / 41

Page 28: Dept. de Lenguajes y Sistemas Informáticos ... - dlsi.ua.es€¦ · La primera acción de un analizador sintáctico es obtener un token de la entrada, llamando al analizador léxico

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 28 / 41

Page 29: Dept. de Lenguajes y Sistemas Informáticos ... - dlsi.ua.es€¦ · La primera acción de un analizador sintáctico es obtener un token de la entrada, llamando al analizador léxico

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 29 / 41

Page 30: Dept. de Lenguajes y Sistemas Informáticos ... - dlsi.ua.es€¦ · La primera acción de un analizador sintáctico es obtener un token de la entrada, llamando al analizador léxico

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 30 / 41

Page 31: Dept. de Lenguajes y Sistemas Informáticos ... - dlsi.ua.es€¦ · La primera acción de un analizador sintáctico es obtener un token de la entrada, llamando al analizador léxico

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 31 / 41

Page 32: Dept. de Lenguajes y Sistemas Informáticos ... - dlsi.ua.es€¦ · La primera acción de un analizador sintáctico es obtener un token de la entrada, llamando al analizador léxico

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 32 / 41

Page 33: Dept. de Lenguajes y Sistemas Informáticos ... - dlsi.ua.es€¦ · La primera acción de un analizador sintáctico es obtener un token de la entrada, llamando al analizador léxico

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 33 / 41

Page 34: Dept. de Lenguajes y Sistemas Informáticos ... - dlsi.ua.es€¦ · La primera acción de un analizador sintáctico es obtener un token de la entrada, llamando al analizador léxico

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 34 / 41

Page 35: Dept. de Lenguajes y Sistemas Informáticos ... - dlsi.ua.es€¦ · La primera acción de un analizador sintáctico es obtener un token de la entrada, llamando al analizador léxico

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 35 / 41

Page 36: Dept. de Lenguajes y Sistemas Informáticos ... - dlsi.ua.es€¦ · La primera acción de un analizador sintáctico es obtener un token de la entrada, llamando al analizador léxico

Analizador sintáctico descendente recursivo (2)

Ejemplo:

A −→ B uno {tres, cuatro}A −→ dos {dos}B −→ tres {tres}B −→ cuatro A {cuatro}

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 36 / 41

Page 37: Dept. de Lenguajes y Sistemas Informáticos ... - dlsi.ua.es€¦ · La primera acción de un analizador sintáctico es obtener un token de la entrada, llamando al analizador léxico

Analizador sintáctico descendente recursivo (3)

Ejemplo:

A −→ B uno {tres, cuatro}A −→ dos {dos}B −→ tres {tres}B −→ cuatro A {cuatro}

public final void B(){if (token.tipo == Token.TRES) {

emparejar(Token.TRES);}else if (token.tipo == Token.CUATRO) {

emparejar(Token.DOS);A();

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

}

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

Page 38: Dept. de Lenguajes y Sistemas Informáticos ... - dlsi.ua.es€¦ · La primera acción de un analizador sintáctico es obtener un token de la entrada, llamando al analizador léxico

Analizador sintáctico descendente recursivo (4)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

Page 39: Dept. de Lenguajes y Sistemas Informáticos ... - dlsi.ua.es€¦ · La primera acción de un analizador sintáctico es obtener un token de la entrada, llamando al analizador léxico

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

Page 40: Dept. de Lenguajes y Sistemas Informáticos ... - dlsi.ua.es€¦ · La primera acción de un analizador sintáctico es obtener un token de la entrada, llamando al analizador léxico

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

Page 41: Dept. de Lenguajes y Sistemas Informáticos ... - dlsi.ua.es€¦ · La primera acción de un analizador sintáctico es obtener un token de la entrada, llamando al analizador léxico

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