Sunteți pe pagina 1din 33

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-

Introduccin

tabla de smbolos

Recordar, esquema general de un compilador:


preprocesador
scanner

programa fuente
analizador lxico
(scanner)
tokens
analizador sintctico
(parser)
estructura sintctica
analizador semntico

optimizador

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

generador cdigo
intermedio
cdigo intermedio
generador cdigo
objeto
cdigo objeto
-J.Ezpeleta-

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

producciones
producciones
especificadas por la GLC
El parser detecta errores sintcticos

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

-J.Ezpeleta-

Introduccin
instAS
ID

OPAS

exp

CTE

x := 27
(CTE,27),(OPAS,)(ID,x)

{e.r.}

AL

OK
AS

instAs: ID OPAS exp


exp: CTE
| ....

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

-J.Ezpeleta-

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


gramtica

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 =
3) SN, y se denomina Smbolo Inicial
S A C b
4) P es el conjunto de Producciones
C b A b
C b a b c
A a
Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

Gramticas. Definiciones
El smbolo inicial es el nico no terminal que se utiliza para
generar todos los strings del lenguaje
de
de smbolos
smbolos
gramaticales
gramaticales

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 es un string, al aplicarle la produccin,


cualquier* aparicin de en se puede sustituir por
*: En realidad, algunas apariciones
Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

Gramticas. Definiciones
A deriva
directamente en la

Establezcamos dos operadores


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

gramtica G

derivacin directa

Sean , (N T)* y sea


A G

A P.

Entonces

0 deriva n en cero o ms

derivacin

Sean 0 ...n (N T)* t.q.


0 G 1 G ... G n
Entonces
*
1
G n
S
C
C
A
Compiladores I. C.P.S. Universidad de Zaragoza
-J.Ezpeleta-

pasos en la gramtica G

, n>=0
A C b
* a a b?
b A b S
b a b c
a

Gramticas. Definiciones
Algunas definiciones:
forma de frase

Cualquier string que se pueda derivar del smbolo


inicial (string de smbolos gramaticales)
frase

Cualquier forma de frase con slo elementos


terminales
lenguaje definido por una gramtica

Conjunto de todas las frases de la gramtica

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

-J.Ezpeleta-

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-

Gramticas. Definiciones
Ejercicio 1: Sea G=(N,T,S,P) con

N={S}
T={a,b}
P={SaSb,Sab}
S=S

L(G)={anbn|n>=1}

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


N={S,A,B}
L(G)={wT*| |w|a=|w|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?
Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

S [ S
S S1
S1 [ a ]

10

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

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

-J.Ezpeleta-

(parser)

11

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

P=
programa PROGRAM ident punto bloque
bloque BEGIN insts END punto
insts insts punto inst
insts inst
inst ident opas const
opas =
ident A
PROGRAM
PROGRAM
PROGRAM A.
A.
PROGRAM A.
A.
ident B
BEGIN
BEGIN
BEGIN
BEGIN
const 1
B=1.
B=1.
B=1.
B=1.
const 0
A=0
A=0.
A=0
A=0.
punto .
END.
END.
END.
END.

Sintcticamente correctos?
Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

12

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 y
restricciones de dnde se puede aplicar la transformacin establecida por
la produccin

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

-J.Ezpeleta-

13

Gramticas. Clasificacin
Clasificacin de Chomsky
gramticas de Tipo 0
gramticas de Tipo 1

libres
dependientes del
contexto

,, (N T)*
no vaco y A un no terminal
A se transforma en slo cuando va precedido por 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
Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

14

Gramticas. Clasificacin
gramticas de Tipo 2

libres de contexto

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

ww
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
Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

wB
wB

regulares

15

Gramticas. Clasificacin
En forma de diagrama:
tipo 3

tipo 2

tipo 1

tipo 0

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)

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

-J.Ezpeleta-

16

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-

17

GLC. Notacin
letras griegas minsculas representan formas de frase (strings de
smbolos gramaticales)
As, en una GLC, una produccin se escribe siempre como


parte
izquierda

parte
derecha

varias producciones con igual parte izda. se pueden agrupar en una


produccin con alternativas

11
22

....
....
n

11|| 22|...|
|...| nn

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

-J.Ezpeleta-

18

GLC. Arboles de anlisis sintctico


Nuestro problema
Dada una gramtica G y un wT*, determinar si wL(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-

19

GLC. Arboles de anlisis sintctico


Ejemplo:

E E + E|E * E|(E)|-E|id
w

id+id*id
E

mi

E + E

mi

E + E
decisin

....

decisin

id + E

podemos mirar el siguiente terminal que viene: token!

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

-J.Ezpeleta-

20

GLC. Derivacin izda. y dcha.

dos posibilidades
de decisin

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.


derivacin
derivacin por
por la
la izda.
izda.
Si siempre se sustituye el de ms a la dcha.
derivacin
derivacin por
por la
la dcha.
dcha.

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

-J.Ezpeleta-

21

GLC. Arboles de anlisis sintctico


Aun optando por una
derivacin mi md,
tomar decisiones puede
generar problemas
Cul de las dos
opciones nos gusta
ms?

izda

mi

mi

E + E

E * E

id + E

E + E * E

id + E * E

id + E * E

id + id * E

id + id * E

id + id * id

id + id * id

mi
mi
mi
mi

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

izda

-J.Ezpeleta-

mi
mi
mi
mi

22

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


G E E + T | T
transformar la
gramtica en una
equivalente que no sea
ambigua

T T * F | F
F (E)|-E |id

Hay lenguajes inherentemente ambiguos


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

-J.Ezpeleta-

23

GLC. Ambigedad
Ejemplo: Considerar la instruccin if en Pascal
Si la gramtica es de la forma
inst if exp then inst
| if exp then inst else inst
| otras instrucciones
if exp1 then if exp2 then inst2 else inst3
11
if
if exp1
exp1 then
then
if
exp2
if exp2 then
then
inst2
inst2
else
else
inst3
inst3
Compiladores I. C.P.S. Universidad de Zaragoza

22
if
if exp1
exp1 then
then
if
if exp2
exp2 then
then
inst2
inst2
else
else
inst3
inst3
-J.Ezpeleta-

24

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-

25

GLC. Ambigedad

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

-J.Ezpeleta-

26

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?
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-
eliminacin de producciones unitarias
otras
Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

27

GLC. Transformacin de gramticas


Ejemplo: Considerar la gramtica

Verifica que:

S
A
B
C

A | B
a
B b
c

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

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

-J.Ezpeleta-

28

GLC. Transformacin de gramticas


Un no terminal X es til si existe

S * X * w
para algn , y tal que wT*

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

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

-J.Ezpeleta-

29

GLC. Transformacin de gramticas


Un no
terminal es
terminable
cuando es
capaz de
derivar alguna
frase

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

--Post:
--Post: G=(N,T,P,S)
G=(N,T,P,S) G
G GG
*
-X
-XN.
N.wwTT*..X
X
* ww

*
Vars
Vars viejo,nuevo:
viejo,nuevo: conj.
conj. de
de no
no terminales
terminales
Principio
Principio
viejo:={}
viejo:={}
*
nuevo:={A
nuevo:={AN|Aw
N|AwP,w
P,wTT*}}
Mq
Mq viejo<>nuevo
viejo<>nuevo
G G?
viejo:=nuevo
viejo:=nuevo
Termina?
nuevo:=viejo
nuevo:=viejo
Correcto?
*
{B
{BN|B
N|BP,
P,(T
(T viejo)
viejo)*}}
Por qu L(G)<>
FMq
FMq
en la Pre?
N:=nuevo
N:=nuevo
Coste?
*
P:={Aw
P:={AwP|A
P|AN,
N, ww(N
(N T)
T)*}}
Fin
Fin
Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

30

GLC. Transformacin de gramticas


Segundo paso:
eliminar los
smbolos que
no sean
accesibles
desde el
smbolo
inicial

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

--Pre: G=(N,T,P,S) t.q. L(G)<>

XN.X
-XN.X es
es terminable
terminable
---Post:
G=(N,T,P,S)
--Post: G=(N,T,P,S) G
G GG
*
XX(N
-(NT
T).
).,(N
,(NT
T)).*.
--SS * XX
--

*
Vars
Vars viejo,nuevo:
viejo,nuevo: conj.
conj. smbolos
smbolos gram.
gram.
Principio
Principio
viejo:={S}
viejo:={S}
nuevo:={
nuevo:={XX(N(N TT))|S
|SXX P}
P}{S}
{S}
Mq
viejo<>nuevo
Mq viejo<>nuevo
viejo:=nuevo
viejo:=nuevo
nuevo:=viejo
nuevo:=viejo
{Y
{Y(N(N TT))|A
|AYYP,A
P,Aviejo}
viejo}
FMq
FMq
<N,T>:=<nuevo
N, nuevo
nuevo T>
T>
<N,T>:=<nuevo N,
*}
P:={A
w

P
|
A

N
,
w

(N

T)
*
P:={A w P|AN,w(N T) }
Fin
Fin

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

-J.Ezpeleta-

31

GLC. Transformacin de gramticas


Un no terminal X se dice anulable cuando X *
Transformacin interesante:
obtener una gramtica equivalente a otra sin
Una gramtica es sin ssi:
1) no hay ninguna regla X
2) como mucho, hay una produccin S , 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-

32

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

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

-J.Ezpeleta-

33

S-ar putea să vă placă și