You are on page 1of 33

Teora de lenguajes y compiladores

Unidad II

Analizador Sintctico

Semana 8

Anlisis Sintctico Descendente Predictivo

Objetivo General
El alumno al finalizar el curso desarrollar
aplicaciones que le permitan determinar si
una sentencia corresponde a la estructura
gramatical
de
un
lenguaje
de
programacin.
As
mismo
estar
capacitado para proponer nuevas formas
estructurales en la definicin de lenguajes
de programacin.

Objetivo Especfico

Desarrollar un analizador sintctico

Objetivo Instruccional
Analizar gramticas tipo LL(1) para
implementar analizadores descendentes
predictivos

Contenidos

Generalidades

Gramticas LL

Anlisis Sintctico Predictivo

ANALIZADOR SINTCTICO

Generalidades

Sentencias
Sentencia

Sentencias

Sentencia

Asignacin

Variable
x

:=

Expresin

Variable
b

Variable
c

Asignacin

Expresin
*

Variable

Expresin
Variable
d

:=

Expresin
Variable
e

ANALISIS SINTACTICO
Funcin:

Generalidades

Comprobar que la secuencia de tokens cumple con las


reglas de la gramtica
Generar el rbol sintctico

Ventajas de utilizar gramticas:

Las gramticas son especificaciones sintcticas y precisas


de lenguajes de programacin
A partir de una gramtica se puede generar
automticamente un analizador
El proceso de construccin puede llevar a descubrir
ambigedades
Una gramtica imparte estructura a un lenguaje de
programacin, siendo mas fcil generar cdigo y detectar
errores
Es mas fcil de ampliar/modificar el lenguaje si esta descrito
con una gramtica

Generalidades

TIPOS DE ANALIZADORES
SINTACTICOS
Descendentes (Top-Down): Parten del axioma y
aplican las reglas de la gramtica hasta llegar a
secuencia de smbolos terminales (tokens):
Analizadores LL(1)
Analizadores recursivos

Ascendentes (Bottom-Up): Parten de las hojas


(conjunto de tokens) para llegar a la raz (axioma de la
gramtica):

Analizadores de Precedencia de Operador


Analizadores LR(1)

Generalidades

ANALISIS SINTCTICO
DESCENDENTE
Se basa en gramticas LL, que
construyen
rboles
de
anlisis
sintctico de arriba (raz) hacia abajo
(hojas).

La primera L significa que la


entrada ser leda de izquierda a
derecha y la segunda L indica
derivaciones por la izquierda.

ANALISIS SINTCTICO
DESCENDENTE
Generalidades

Algoritmo:

Poner el axioma como raz del rbol de derivacin


Hasta que solo haya smbolos terminales, derivar mas a la
izquierda

Ejemplo:

Entrada: Id * Id + id
Gramtica: Expresion::= Expresion * Termino |
Expresion + Termino |
Termino
Termino ::= id | Numero
Derivacin: Expresion Expresion + Termino

Expresion * Termino + Termino


Termino * Termino + Termino
Id * Termino + Termino
Id * Id + Termino
Id * Id + id

PROBLEMAS DE LOS ANALIZADORES


SINTCTICO DESCENDENTE
Generalidades

Mas de una opcin: A ::= a|


Retroceso
Analizar los siguientes elementos de entrada
Recursividad izquierda
Eliminacin de la recursividad

Ambigedad
Factorizacin por la izquierda

Para cada produccin de la forma:

Gramticas LL

A 1 | 2 | 3 | | n

Siempre debemos ser capaces de elegir la


alternativa correcta para la generacin de un rbol
de anlisis sintctico.
Para cumplir esta regla necesitamos informacin adicional, a
saber:
El conjunto de todos los smbolos terminales que pueden
aparecer al principio de una frase que puede derivarse
de una secuencia arbitraria de smbolos (CONJUNTO
PRIMERO).
El conjunto de todos los smbolos terminales que pueden
aparecer despus de uno no terminal (CONJUNTO
SIGUIENTE).

CONJUNTO PRIMERO(1/3)
Sea G(N,T,P,S) una gramtica y secuencia arbitraria de smbolos, es
decir (NUT)*, entonces;

Gramticas LL

Primero() = { t / t T ^ t } , donde T = T U { }

Para calcular Primero(X) para todos los smbolos gramaticales X,


aplquense las reglas siguientes hasta que no se puedan aadir mas
terminales o a ningn conjunto Primero.
1. Si X es terminal, entonces primero(X) es {X}
2. Si X es una produccin, entonces adase a Primero(X)
3. a. Si X es no terminal y X Y1 Y2 Yk , es una produccin, entonces
pngase a en Primero(X) si para alguna i, a esta en Primero(Yi)
y esta en todos los Primero(Y1)Primero(Yi-1) ; es decir Y1..Yi-1
b. Si esta en primero(Yi) para toda i = 1,2,,k, entonces adase
a primero(X).
Por ejemplo, todo lo que esta en Primero(Y1) sin duda esta en
Primero(X). Si Y1 no deriva a , entonces no se aade nada ms a
Primero(X). Pero si Y1 , entonces se le aade Primero(Y2), y as
sucesivamente.

CONJUNTO PRIMERO(2/3)

Gramticas LL

Ahora se puede calcular el conjunto Primero para


cualquier cadena X1X2Xn de la siguiente forma:
adase a Primero(X1X2Xn) todos los smbolos
distintos de de Primero(X1). Si esta en
Primero(X1), adase tambin los smbolos distintos
de de Primero(X2); si esta tanto en Primero(X1)
y Primero(X2) adanse tambin los smbolos
distintos de de Primero(X3) y as sucesivamente.
Por ultimo adase a Primero (X1X2Xn) si para
todo i=1..n, Primero(Xi) contiene al .

CONJUNTO PRIMERO(3/3)
Ejemplo:

Gramticas LL

Considrese la gramtica siguiente:


E TE
E +TE |
T F T
T *F T |
F ( E ) | id
Entonces :

Primero(E) =
Primero(E) =
Primero(T) =
Primero(T) =
Primero(F) =

{ ( , id }
{+,}
{ ( , id }
{*,}
{ ( , id }

CONJUNTO SIGUIENTE(1/2)
Sea G(N,T,P,S) una gramtica y secuencia arbitraria de
smbolos, es decir (NUT)*, entonces;

Gramticas LL

Siguiente(X) = { t / t T ^ S X t }
Para calcular Siguiente(A) para todos los no terminales A,
aplquense las reglas siguientes hasta que no se pueda aadir
nada mas a ningn conjunto siguiente:
1. Pngase $ en Siguiente(S) , donde S es el smbolo inicial y $ es
el delimitador derecho de la entrada.

2. Si hay una produccin A B , entonces todo lo que este


en Primero() excepto se pone en Siguiente(B).
3. Si hay una produccin A B o una produccin A B
donde Primero() contenga ( es decir ), entonces todo
lo que este en Siguiente(A) se pone en Siguiente(B).

Gramticas LL

CONJUNTO SIGUIENTE(2/2)
Ejemplo:
Considerando la gramtica anterior:
E TE
Se determin que:
E +TE |
Primero(E) = { ( , id }
T F T
Primero(E) = { + , }
T *F T |
Primero(T) = { ( , id }
F ( E ) | id
Primero(T) = { * , }
Primero(F) = { ( , id }
Entonces:
Siguiente(E) = { $ , ) }

Regla 1
Regla 2 aplicada a F ( E )

Siguiente(E) = { ) , $ }

Regla 3 aplicada a E T E

Siguiente(T) = { + , ) , $ }

Regla 2 aplicada a E TE
Regla 3 aplicada a E +TE

Siguiente(T) = { + , ) , $ }

Regla 3 aplicada a T F T

Siguiente(F) = { * , + , ) , $ } Regla 2 aplicada a T FT


Regla 3 aplicada a T *FT

GRAMTICAS LL(1)

Gramticas LL

Una gramtica independiente del contexto G(N,T,P,S) se


denomina gramtica LL(1) si tiene las siguientes caractersticas:

C1) Para las producciones de la forma:


A 1 | 2 | 3 | | n
se requiere: Primero(i) Primero(j) = Para todo i <> j
C2) si puede derivarse la cadena vaca () de un smbolo no
terminal X, se requiere que: Primero(X) Siguiente(X) =

Una gramtica cuya tabla de anlisis sintctico no tiene


entradas con definiciones mltiples se define como LL(1).
Queda la cuestin de lo que se debe hacer cuando la tabla de
anlisis sintctico tiene entradas con mltiples definiciones. Un
recurso es transformar la gramtica eliminando la recursin por la
izquierda y factorizando por la izquierda siempre que sea posible,
con la esperanza de producir una gramtica para la cual la
tabla de anlisis sintctico no tenga entradas con mltiples
definiciones.

Gramticas LL

Ejemplo:

GRAMTICAS LL(1)

Considerar una gramtica que permita la generacin de frases


como:
program
declaracion;
declaracion;
begin
proposicion;
p = programa
proposicion;
d = declaracion
b = begin
proposicion;
s = proposicion
end.
e = end

La gramtica G viene dada por:


T={b,d,e,p,s,;,.}
N={A,X,Y}
P = { A pX
X d ; X | bsYe
Y ; sY |
S = {A}
Es

una gramtica de tipo LL(1)?

Gramticas LL

GRAMTICAS LL(1)
Solucin:
Primero(A) = { p }
Siguiente(A) = { $ }
Primero(X) = { d , b }
Siguiente(X) = { $ }
Primero(Y) = { , ; }
Siguiente(Y) = { e , $ }
Luego:
Por C1) Primero(d;X) Primero(bsYe) = { d } { b } =
Primero() Primero(;sY) = { } { ; } =
Por C2)

Primero(Y) Siguiente(Y) = { , ; } { } =

Entonces a partir de la definicin de LL(1) se concluye que esta


gramtica es no ambigua y nunca puede ser recursiva izquierda.
Esto es obvio ya que una gramtica G es ambigua si hay una
palabra en L(G) que posea 2 derivaciones por la izquierda (a partir
del smbolo inicial).

EN CONCLUSION:
Las gramticas LL(1) se usan preferentemente para el anlisis
sintctico descendente.

Anlisis Sintctico Tabular

CONSTRUCCIN DE TABLAS LL(1)


Sea G una gramtica ; supngase que A , es una produccin con
a en Primero(). Entonces, el analizador sintctico expandir A por
cuando el smbolo actual de entrada sea a.

Algoritmo: Construccin de una tabla de anlisis sintctico predictivo


Entrada: Una gramtica G
Salida: La tabla de anlisis sintctico M
Mtodo:
1. Para cada produccin A de la gramtica dense los pasos 2 y 3.
2. Para cada terminal a de primero( ) , adase A a M[A,a]
3. a. Si esta en Primero(), adase A a M[A,b] para cada
terminal b de Siguiente(A).
b. Si esta en Primero( ) y $ esta en Siguiente(A), adase A
a M[A,$]
4. Hgase que cada entrada no definida de M sea error.

Anlisis Sintctico Tabular

CONSTRUCCIN DE TABLAS LL(1)


Del ejemplo anterior, para: E TE
Smbolo de entrada
No
Terminal

E
E
T
T

id
E T E

(
E T E

Anlisis Sintctico Tabular

CONSTRUCCIN DE TABLAS LL(1)


Del ejemplo anterior, para: E +TE
Smbolo de entrada
No
Terminal

E
E
T
T

id

E T E

(
E T E

E +TE

Anlisis Sintctico Tabular

CONSTRUCCIN DE TABLAS LL(1)


Del ejemplo anterior, para: E
Smbolo de entrada
No
Terminal

E
E
T
T

id

E T E

E T E
E +TE

Anlisis Sintctico Tabular

CONSTRUCCIN DE TABLAS LL(1)


Del ejemplo anterior, para: T F T
Smbolo de entrada
No
Terminal

id
E T E

T F T

E T E
E +TE

E
T

T F T

Anlisis Sintctico Tabular

CONSTRUCCIN DE TABLAS LL(1)


Del ejemplo anterior, para: T *F T
Smbolo de entrada
No
Terminal

id

E T E

E T E
E +TE

E
T

T F T

T F T
T *FT

Anlisis Sintctico Tabular

CONSTRUCCIN DE TABLAS LL(1)


Del ejemplo anterior, para: T
Smbolo de entrada
No
Terminal

id

E T E

E T E
E +TE

E
T

T F T

T F T

T *FT

Anlisis Sintctico Tabular

CONSTRUCCIN DE TABLAS LL(1)


Del ejemplo anterior, para: F ( E )
Smbolo de entrada
No
Terminal

id

E T E

E T E
E +TE

E
T

T F T

T F T

T *FT

F(E)

Anlisis Sintctico Tabular

CONSTRUCCIN DE TABLAS LL(1)


Del ejemplo anterior, para: F id
Smbolo de entrada
No
Terminal

id

T F T

T F T

F id

E T E
E +TE

E T E

E
T

T *FT

F(E)

Anlisis Sintctico Tabular

CONSTRUCCIN DE TABLAS LL(1)


TABLA FINAL
Smbolo de entrada
No
Terminal

id

E T E

Error

Error

E T E

Error

Error

Error

E +TE

Error

Error

T F T

Error

Error

T F T

Error

Error

Error

T *FT

Error

F id

Error

Error

F(E)

Error

Error

Anlisis Sintctico Tabular

ALGORITMO RECURSIVO GUIADO POR


TABLA (1/2)
Algoritmo:
Entrada: Una cadena W y una tabla de anlisis sintctico M para la gramtica G
Salida: Si W esta en L(G) , una derivacin por la izquierda de W; de lo contrario
una indicacin de error.

Al principio, el analizador sintctico esta en una configuracin en la que tiene a


$S en la pila S, el smbolo inicial de G en el tope y W$ en el buffer de entrada.
1. Apuntar ptr al primer smbolo de W$
2. Repetir
Sea X el smbolo de la cima de la pila y a el smbolo apuntado por ptr
Si X es un terminal o $ entonces
Si X = a entonces
Extraer X de la pila y avanzar ptr
Caso contrario
Error
Caso contrario
Si M[X,a] = X Y1Y2Yk entonces
Extraer X de la pila
Meter Yk,Yk-1,,Y1 en la pila con Y1 en la cima
Emitir la produccin X Y1Y2Yk
Caso contrario
Error
Hasta X = $ /* la pila esta vaca */

Anlisis Sintctico Tabular

ALGORITMO RECURSIVO GUIADO POR


TABLA (2/2)
Ejemplo:

Analizar si: id + id * id es valida para la gramtica anteriormente presentada.


PILA

$E
$ET
$ETF
$ETid
$ET
$E
$ET+
$ET
$ETF
$ETid
$ET
$ETF*
$ETF
$ETid
$ET
$E
$

ENTRADA

id + id * id $
id + id * id $
id + id * id $
id + id * id $
+ id * id $
+ id * id $
+ id * id $
id * id $
id * id $
id * id $
* id $
* id $
id $
id $
$
$
$

SALIDA

E TE
T FT
F id

T
E +TE
T FT
F id
T *FT

F id
T
E

Teora de lenguajes y compiladores


Unidad II

Analizador Sintctico

Semana 8

Anlisis Sintctico Descendente Predictivo

You might also like