Professional Documents
Culture Documents
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