You are on page 1of 33

Compiladores I. C.P.S. Universidad de Zaragoza -J.

Ezpeleta-
1
Leccin

3: Fundamentos

para

el anlisis

sintctico
1) Introduccin
2) Gramticas. Definiciones

y clasificacin
3) GLC. Notaciones
4) GLC. rboles

de anlisis

sintctico
5) GLC. Derivacin

a dcha. y a izda.
6) GLC. Ambigedad

y transformacin

de gramticas
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta-
2
Introduccin


Recordar, esquema

general de un compilador:
programa fuente
cdigo objeto
cdigo intermedio
estructura sintctica
tokens
analizador lxico
(scanner)
analizador semntico
analizador sintctico
(parser)
generador cdigo
intermedio
generador cdigo
objeto
preprocesador
optimizador
scanner
t
a
b
l
a
d
e

s

m
b
o
l
o
s
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta-
3
Introduccin


El analizador

sintctico:


Objetivo: agrupar

los tokens suministrados

por

el scanner para

reconocer

frases


determinar

si

es

sintcticamente

correcto


establecer

la estructura

subyacente


La sintaxis

se suele

especificar

formalmente

mediante

una

GLC


El parser recibe

tokens y los agrupa

de acuerdo

a
especificadas

por

la GLC


El parser detecta

errores

sintcticos
producciones
producciones
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta-
4
Introduccin
x := 27
{e.r.}
AL
(CTE,27),(OPAS,)(ID,x)
instAs: ID OPAS exp
exp: CTE
| ....
AS
OK
instAS
ID OPAS exp
CTE
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta-
5
Gramticas. Definiciones


El estudio

de gramticas

es

anterior al de lenguajes

de
programacin


Empez

con el estudio

del lenguaje

natural


Punto

de referencia: Noam Chomsky
Una gramtica G=(N,T,S,P) es una 4-tupla donde:
1) N es el conjunto de No-Terminales
2) T es el de Terminales tal que N

T = C
3) SeN, y se denomina Smbolo Inicial
4) P es el conjunto de Producciones Producciones
gramtica
S

A C b
C b

A b
C b

a b c
A

a
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta-
6
Gramticas. Definiciones


El smbolo

inicial

es

el nico

no terminal que

se utiliza

para

generar

todos

los strings del lenguaje


Un terminal

genera un nico

string (l

mismo)


Una

produccin

es

una

regla

que

establece

una

transformacin

de strings


Forma de una

produccin

(usando

BNF)


Significado: si

o

es

un string, al aplicarle

la produccin,
cualquier* aparicin

de o

en o

se puede

sustituir

por

|
o |
o |
de smbolos
gramaticales
de smbolos
gramaticales
*: En realidad, algunas apariciones
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta-
7


Establezcamos

dos operadores


Sea G=(N,T,S,P) una

gramtica
Gramticas. Definiciones
Sean o,o e (N

T)* y sea A| e P. Entonces
oAo
G
o|o
derivacin directa
Sean o
0

...o
n
e (N

T)* t.q.
o
0


G
o
1


G
...
G
o
n
, n>=0
Entonces
o
1


G
o
n
*
derivacin
oAo

deriva
directamente o|o

en la
gramtica G
o
0

deriva o
n
en cero o ms
pasos en la gramtica G
S

A C b
C b

A b
C b

a b c
A

a
S

a a b?
*
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta-
10
Gramticas. Definiciones


Algunas

definiciones:
Cualquier string que se pueda derivar del smbolo
inicial (string de smbolos gramaticales)
forma de frase
Cualquier forma de frase con slo elementos
terminales
frase
Conjunto de todas las frases de la gramtica
lenguaje definido por una gramtica
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta-
11
Gramticas. Definiciones


Es fcil

ver

que:


los siguiente

elementos

pertenecen

al lenguaje

generado

por

la gramtica:


el perro

est

cerca


la perro

est

lejos


el gata

est

cerca


.....


los siguiente

elementos

NO pertenecen

al lenguaje

generado

por

la
gramtica:


el perro


la lejos

perro

est


.....


Por

desgracia, no siempre

ser

tan sencillo
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta-
12
Gramticas. Definiciones


Ejercicio

1: Sea G=(N,T,S,P) con


N={S}


T={a,b}


P={SaSb,Sab}


S=S


Ejercicio

2: Sea G=(N,T,S,P) con


N={S,A,B}


T={a,b}


P={ SaB,SbA,Aa,AaS,
AbAA,Bb,BbS,BaBB}


S=S


Ejercicio

3: Cul

es

el lenguaje

generado

por

la siguiente

gramtica?
L(G)={weT
*
| |w|
a
=|w|
b
}
L(G)={a
n
b
n
|n>=1}
S [ S
S

S1
S1 [ a ]
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta-
13
Gramticas. Definiciones


Hemos

visto

cmo

la aplicacin

de producciones

genera las

frases

del lenguaje


Para compiladores, el proceso

es

en sentido

contrario:


dado un string:


Pertenece

al lenguaje?


Cules

son las

producciones

aplicadas

para

derivarlo

del smbolo

inicial?


Este proceso

lo lleva

a cabo

el analizador

sintctico

(parser)
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta-
14
Gramticas. Definiciones


Ejercicio

3: Sea
G=(N,T,S,P) con


N = {programa,
bloque,insts,
inst,opas,
ident,const,
punto}


T =
{PROGRAM,BEGIN,
END,=,A,B,1,0,.}


S = programa
programa PROGRAM ident punto bloque
bloque BEGIN insts END punto
insts insts punto inst
insts inst
inst ident opas const
opas

=
ident

A
ident

B
const

1
const

0
punto

.
P=
PROGRAM A.
BEGIN
B=1.
A=0
END.
PROGRAM A.
BEGIN
B=1.
A=0
END.
Sintcticamente correctos?
PROGRAM A.
BEGIN
B=1.
A=0.
END.
PROGRAM A.
BEGIN
B=1.
A=0.
END.
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta-
15
Gramticas. Clasificacin


Una

produccin

general

tiene

la forma


Imponiendo

restricciones

a las

posibles

formas

de las

producciones, se obtienen

distintos

tipos

de gramticas


restricciones

respecto

a qu

pueden

ser o

y |


restricciones

de dnde

se puede

aplicar

la transformacin

establecida

por

la produccin
o

|
o

|
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta-
16
Gramticas. Clasificacin


Clasificacin

de Chomsky


gramticas

de Tipo

0


gramticas

de Tipo

1


o,|,o e(N T)*


o

no vaco

y A

un no terminal


A

se transforma

en o

slo

cuando

va

precedido

por

o

y seguido

por

|


La produccin

ya

no se aplica

siempre, sino

slo

en determinados

contextos


Muchos

lenguajes

de prog. tienen

aspectos

que

requieren

una

gramtica

de este

tipo
demasiado

complicadas

de manejar, por

lo que

se usan

del tipo

siguiente,
con algunos

apaos
oA |

oo|
oA |

oo|
libres
dependientes del
contexto
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta-
17
Gramticas. Clasificacin


gramticas

de Tipo

2


A

es

un (nico) no terminal


Cada

vez

que

aparece

A, se puede

sustituir

por

|


Se corresponde

con la notacin

BNF


Pascal (en la mayora

de sus

aspectos) es

una

gramtica

de tipo

2


gramticas

de Tipo

3


A

,B

son no terminales


w

es

una

secuencia

de terminales


poco

potentes

para

lenguajes


fundamentales

para

comp. lxicos


expresiones

regulares
A |
A |
A w
A w
A wB
A wB
libres de contexto
regulares
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta-
18
Gramticas. Clasificacin


En forma de diagrama:


Cada

gramtica

de un tipo

es

tambin

del tipo

anterior


Cuanto

menos

restrictiva

es

una

gramtica, ms

complejo

es

su

anlisis


Las ms

sencillas

son las

de Tipo

3, que

pueden

ser reconocidas

por

autmatas

de estados

finitos

(recordar

anlisis

lxico)
tipo 3 tipo 2 tipo 1 tipo 0
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta-
19
GLC. Notacin


Por

claridad, para

GLC usaremos

los siguiente

convenios:


consideraremos

terminales:


primeras

minsculas

del abecedario


smbolos

de operacin

y puntuacin


dgitos


palabras

en negrita: perro,begin


consideraremos

NO terminales:


primeras

maysculas

del abecedario


palabras

en cursiva: sujeto,expresin


la S, suele

representar

el smbolo

inicial


...,X,Y,Z: representan

smbolos

gramaticales

(terminal, No terminal)


letras

minsculas

de en medio

(u,v,..) representan

cadenas

de
terminales
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta-
20
GLC. Notacin


letras

griegas

minsculas

representan

formas

de frase

(strings de
smbolos

gramaticales)


As, en una

GLC, una

produccin

se escribe

siempre

como


varias

producciones

con igual

parte izda. se pueden

agrupar

en una

produccin

con

alternativas
A |
A |
parte
derecha
parte
izquierda
A o
1
A o
2
....
A o
n
A o
1
A o
2
....
A o
n
A o
1
| o
2
|...| o
n
A o
1
| o
2
|...| o
n
=
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta-
21
GLC. Arboles

de anlisis

sintctico


Nuestro problema


Dada una gramtica G y un weT*, determinar si weL(G)


Para ello, trataremos de construir un rbol de sintaxis


teniendo presente que queremos un proceso automtico


Caractersticas:


el nodo

raz

se etiqueta

con el smbolo

inicial


cada

nodo

no hoja

se etiqueta

con un no terminal


los hijos

de un nodo

son los smbolos

(de izda. a dcha.) que

aparecen

en
una

de las

producciones

que

tienen

dicho

nodo

como

parte izda.


cuando

se ha derivado

una

frase, las

hojas

del rbol

son terminales
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta-
22
GLC. Arboles

de anlisis

sintctico
E
E

E + E
E
mi
E + E
mi
id + E
decisin
....
decisin
E

E + E|E * E|(E)|-E|id
G
id+id*id
w
Ejemplo:
podemos mirar el siguiente terminal que viene: token!
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta-
23
GLC. Derivacin

izda. y dcha.


En cada

paso

en una

derivacin:


hay que

elegir

qu

no terminal sustituir


elegido

uno, optar

por

una

de las

posibles

producciones

que

lo tengan

como

parte izda.


Si siempre

se sustituye

el de ms

a la izda.


Si siempre

se sustituye

el de ms

a la dcha.
derivacin por la izda.
derivacin por la izda.
derivacin por la dcha.
derivacin por la dcha.
dos posibilidades
de decisin
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta-
24
GLC. Arboles

de anlisis

sintctico


Aun optando por una
derivacin m
i

m
d

,
tomar decisiones puede
generar problemas


Cul de las dos
opciones nos gusta
ms?
E
mi
E + E
mi
id + E
mi
id + E * E
mi
id + id * E
mi
id + id * id
izda
E
mi
E * E
mi
E + E * E
mi
id + E * E
mi
id + id * E
mi
id + id * id
izda
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta-
25
GLC. Ambigedad


Una

gramtica

es

ambigua

si

existe

al menos

una

frase

ambgua


Una

frase

es

ambgua

si

existe

ms

de un rbol

para

ella

(mi

md)


produce indeterminismo


es

importante

eliminarla, cuando

se pueda


A veces, es

posible

eliminar

la ambigedad


Hay lenguajes

inherentemente

ambiguos
transformar la
gramtica en una
equivalente que no sea
ambigua
E

E + T | T
T

T * F | F
F

(E)|-E |id
G
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta-
26
GLC. Ambigedad


Ejemplo: Considerar

la instruccin

if en Pascal


Si la gramtica

es

de la forma
if exp1 then if exp2 then inst2 else inst3
if exp1 then
if exp2 then
inst2
else
inst3
if exp1 then
if exp2 then
inst2
else
inst3
1
1
if exp1 then
if exp2 then
inst2
else
inst3
if exp1 then
if exp2 then
inst2
else
inst3
2
2
inst

if exp then inst
| if exp then inst else inst
| otras instrucciones
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta-
27
GLC. Ambigedad


Con cul

nos

quedamos?


Generalmente, se aplica

la misma

regla

que

aplica

Pascal:


cada

else

se empareja

con el then

ms

prximo


es

decir, la buena

versin

es

la 1


Se puede

expresar

esta

regla

en una

gramtica

transformada?


en este

caso, s


no siempre

ser

posible
inst

instC | instI
instC

if exp then instC else instC
| otras instrucciones
instI

if exp then inst
| if exp then instC else instI
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta-
28
GLC. Ambigedad
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta-
29
GLC. Ambigedad


Ejercicio: Convencerse

de que

genera el mismo

lenguaje

que

la
anterior y se ha eliminado

la ambigedad


Es posible

saber

si

una

gramtica

dada es

ambigua?


Es posible

saber

si

dos GLC generan

el mismo

lenguaje?


NO !! (Hopcroft

y Ullman)


Una

cuestin

interesante: la simplificacin

de gramticas


puesto

que

puede

haber

varias

gramticas

equivalentes, busquemos

alguna

ms

simple


posibles

simplificaciones:


eliminacin

de no terminales

intiles


eliminacin

de producciones-c


eliminacin

de producciones

unitarias


otras
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta-
30
GLC. Transformacin

de gramticas


Ejemplo: Considerar

la gramtica


Verifica

que:


el no terminal C

no es

alcanzable

desde

S


el no terminal B

no deriva

ningn

string terminal


Los no terminales

B

y C

se denominan

intiles


No terminales

intiles


pueden

ser eliminados


se obtiene

una

gramtica

equivalente
S

A | B
A

a
B

B b
C

c
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta-
31
GLC. Transformacin

de gramticas


Un no terminal X es

til

si

existe
para

algn

o,| y tal

que

weT
*


Dos condiciones

necesarias

de utilidad
1) debe

haber

alguna

cadena

de terminales

que

sea derivable de X
2) X debe

aparecer

en alguna

forma de frase

derivable desde

S


Proceso:
1) eliminar

los no terminales

que

no deriven

ninguna

frase
2) eliminar

los no terminales

que

no sean

alcanzables

desde

S
S
*
o

X |
*
w
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta-
32
GLC. Transformacin

de gramticas


Un no
terminal es

terminable

cuando

es

capaz

de
derivar

alguna

frase
Algoritmo eliminaNoTerminables
(E G:GLC; S: G:GLC)
--Pre: G=(N,T,P,S) t.q. L(G)<>C

--Post: G=(N,T,P,S) .

G ~

G .

-- XeN.-weT
*
.X

*
w
Vars viejo,nuevo: conj. de no terminales
Principio
viejo:={}
nuevo:={AeN|AweP,weT
*
}
Mq viejo<>nuevo
viejo:=nuevo
nuevo:=viejo
{BeN|BoeP,oe (T viejo)
*
}
FMq
N:=nuevo
P:={AweP|AeN, we(N T)
*
}
Fin
Algoritmo eliminaNoTerminables
(E G:GLC; S: G:GLC)
--Pre: G=(N,T,P,S) t.q. L(G)<>C

--Post: G=(N,T,P,S) .

G ~

G .

-- XeN.-weT
*
.X
*
w
Vars viejo,nuevo: conj. de no terminales
Principio
viejo:={}
nuevo:={AeN|AweP,weT
*
}
Mq viejo<>nuevo
viejo:=nuevo
nuevo:=viejo
{BeN|BoeP,oe (T viejo)
*
}
FMq
N:=nuevo
P:={AweP|AeN, we(N T)
*
}
Fin
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta-
33
GLC. Transformacin

de gramticas


Segundo paso:
eliminar

los
smbolos

que

no sean

accesibles

desde

el
smbolo

inicial
Algoritmo eliminaNoAccesibles
(E G:GLC; S: G:GLC)
--Pre: G=(N,T,P,S) t.q. L(G)<>C

.
-- XeN.X es terminable
--Post: G=(N,T,P,S) .

G ~

G .

-- Xe (N T).-o,|e(N T)
*
.
-- S
*
oX|
Vars viejo,nuevo: conj. smbolos gram.
Principio
viejo:={S}
nuevo:={Xe(N T)|S oX|

e P}{S}
Mq viejo<>nuevo
viejo:=nuevo
nuevo:=viejo
{Ye (N T)|A oY| eP,Aeviejo}
FMq
<N,T>:=<nuevo

N, nuevo

T>
P:={A w e P|AeN,we(N T)
*
}
Fin
Algoritmo eliminaNoAccesibles
(E G:GLC; S: G:GLC)
--Pre: G=(N,T,P,S) t.q. L(G)<>C

.
-- XeN.X es terminable
--Post: G=(N,T,P,S) .

G ~

G .

-- Xe (N T).-o,|e(N T)
*
.
-- S
*
oX|
Vars viejo,nuevo: conj. smbolos gram.
Principio
viejo:={S}
nuevo:={Xe(N T)|S oX|

e P}{S}
Mq viejo<>nuevo
viejo:=nuevo
nuevo:=viejo
{Ye (N T)|A oY| eP,Aeviejo}
FMq
<N,T>:=<nuevo

N, nuevo

T>
P:={A w e P|AeN,we(N T)
*
}
Fin
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta-
34
GLC. Transformacin

de gramticas


Un no terminal X se dice anulable

cuando

X
*
c


Transformacin

interesante:

obtener

una

gramtica

equivalente

a otra

sin c


Una

gramtica

es

sin c

ssi:
1) no hay ninguna

regla

X c
2) como

mucho, hay una

produccin

S c

, pero

entonces

S no aparece

en
la parte derecha

de ninguna

otra

produccin


Otra

transformacin

interesante: eliminacin

de producciones

unitarias


una

produccin

de la forma A B se dice unitaria


Conclusin: desarrollo

de formas

normales


formas

normales

de Chomsky y de Greibach
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta-
35
GLC. Comparacin

de gramticas


Asumamos

una

gramtica

para

un lenguaje


Es correcta?


Expresa

el lenguaje

que

queramos

expresar?


Notar

que

la gramtica

es

la propia

definicin

del lenguaje


Formas

de verificacin:


Hacer

algunos

tests para

ver

resultados


comparar

la equivalencia

con una

gramtica

correcta


NO existe

un algoritmo

general para

GLC

You might also like