Está en la página 1de 48

Anlisis Sintctico

Teora de Autmatas y Lenguajes Formales


Alma Mara Pisabarro, 2007

ANLISIS SINTCTICO
Funcin Entrada: sucesin de componentes lxicos <clex, vlex> Salida: la entrada es o no correcta sintcticamente Adems:
si la entrada es correcta, rbol de derivacin si no indicacin de errores

Uso de gramticas independientes de contexto Especificacin precisa y fcil de entender Construccin automtica de analizadores sintcticos Imparten una estructura al programa fuente, a la que se asigna el significado. Deteccin adecuada de errores Fcil mantenimiento: evolucin del lenguaje <programa> <cabecera> <bloque> <cabecera> program <identificador>; <cabecera> program <identificador> (<ids.archivos>); <bloque> <declaraciones y definiciones de entorno> <def. de subprogramas> <sent. secuencial>. <sent. secuencial> begin <sentencias> end ...

TIPOS DE ANLISIS SINTCTICOS


Universales (CYK, Earley, ...) Descendentes. Subclases de gramticas adecuadas (LL) Ascendentes. Subclases de gramticas adecuadas (LR)
<programa> ...

<cabecera>

<bloque>

<cabecera>

...

....

program

id

...

program

id

begin ...

ERRORES: TIPOS
Lxicos (a!b, begon) Sintcticos (X := a *(b-(c+d);;) Semnticos (3 div sqrt(2)) Lgicos (bucle infinito) Consideraciones La mayora de los errores son simples La mayora son o se manifiesten en la fase de anlisis sintctico La deteccin de errores lgicos es muy difcil o imposible A veces el error est mucho antes de que se pueda detectar

ERRORES: OBJETIVOS DEL GESTOR DE ERRORES

Informar con claridad y exactitud


lnea, posicin, mensajes (falta un ;)

Recuperarse con rapidez


No se abandona al primer error Introduccin de errores espurios (sintcticos o semnticos): inhibir mensajes de demasiado cercanos Se abandona si hay muchos errores

No retrasar significativamente la traduccin de programas correctos


Mecanismos sencillos de recuperacin

ERRORES: ESTRATEGIAS
En modo pnico: descartar smbolos de entrada (hasta que alguno permita la recuperacin: elementos de sincronizacin) A nivel de frase: correccin local segn el error concreto (borrar, sustituir, insertar: peligro de bucle infinito) De producciones de error: prever errores (frecuentes o probables) ampliando la gramtica con reglas especficas de error De correccin global: hallar el programa correcto ms cercano al de entrada: costoso y no necesariamente se encuentra el deseado

ANLISIS SINTCTICO DESCENDENTE


tipo simple | ^ simple | array [simple] of tipo integer | char | num ptpt num tipo

simple

tipo

tipo

simple

simple

array [

simple ]

of

tipo

simple

simple

simple

integer

char

num

ptpt

num

Anlisis Sintctico Predictivo


Anlisis Sintctico Descendente Recursivo
Conjunto de procedimientos recursivos Cada no terminal de la gramtica tiene asociado un procedimiento El smbolo de preanlisis determina sin ambigedad el procedimiento seleccionado para cada no terminal Procedimiento adicional parea

procedimiento tipo: segn que regla se aplique: ?: { <tipo> <simple> } simple ?: { <tipo> ^ <simple> } parea (^); simple ?: { <tipo> array [ <simple> ] of <tipo> } parea (array); parea ( [ ); simple; parea ( ] ); parea (of); tipo procedimiento simple: segn que regla se aplique: ?: { <simple> integer } parea (integer) ?: { <simple> char } parea (char) ?: { <simple> num ptpt num } parea (num); parea (ptpt); parea (num)

parea (num); parea(ptpt); parea(num)


procedure parea (t:TCompLex); begin if preanalisis = t then preanalisis := SgteCompLex() else error end;
simple simple simple

?
num ptpt num num
parea

ptpt
parea

num

parea

num ptpt num ... ...

num ptpt num ... ....

num ptpt num ... ...

parea( ^ ); simple
tipo tipo tipo

?
^ simple ^ simple

?
parea

^ char

^ char

^ char

parea (array); parea ([); simple; parea (]); parea(of); tipo parea(^); simple
tipo tipo tipo

?
array [ simple ] of tipo array [ simple ] of tipo

?
array [num ptpt num] of char array [ num ptpt num ] of char array [ num ptpt num ] of char

tipo

tipo

array

[ simple ]

of

tipo

array

[ simple ]

of

tipo

?
array [ num ptpt num ] of char array [ num ptpt num ] of char

Eleccin de regla a aplicar: tipo simple | ^ simple | array [ simple ] of tipo simple integer | char | num ptpt num tipo: regla 1: preanalisis in [integer, char, num] regla 2: preanalisis = ^ regla 3: preanalisis = array simple: regla 4: preanalisis = integer regla 5: preanalisis = char regla 6: preanalisis = num

const INTEGER = 257; CHAR = 258; ... var preanalisis: TCompLex; function StgteCompLex(): TCompLex; procedure parea(...)...; procedure simple; begin if preanalisis = INTEGER then parea (INTEGER) else if preanalisis = CHAR then parea (CHAR) else if preanalisis = NUM then begin parea(NUM); parea(PTPT); parea(NUM); end else error end;

procedure tipo; begin if preanalisis in [INTEGER, CHAR, NUM] then simple else if preanalisis = ^ then begin parea(^); simple end else if preanalisis = ARRAY then begin parea(ARRAY); parea([); simple; parea (OF); tipo end else error end; begin preanalisis := SgteCompLex(); tipo; end.

Anlisis Sintctico Predictivo no Recursivo


Utilizan una pila en lugar de llamadas recursivas Guiado por una tabla Las tablas se construyen directamente slo para ciertos tipos de gramticas

ENTRADA

PILA

X Y Z $

Programa para
anlisis sintctico predictivo SALIDA

Tabla de anlisis Sintctico M

Inicialmente:
Buffer: cadena de entrada finalizada con el smbolo $ Pila: smbolo $ y en la cima el smbolo inicial de la gramtica Tabla M: Si A es un no terminal y a un terminal, M[A,a] contiene una regla de produccin de la gramtica X: Cima de la pila A: smbolo de la entrada (preanalisis)

Anlisis Sintctico Predictivo no recursivo


Si X terminal
Si X <> a
Llamar a la rutina de recuperacin de error

Si X = a
Si X = a = $
Fin con xito

Si X = a <> $
Sacar X de la pila Obtener siguiente smbolo de la entrada

Si X no terminal
Si M [X, a] contiene una regla
Sacar X de la pila Meter en la pila la parte derecha de la regla en orden inverso

Si M [X, a] no contiene una regla


Llamar a la rutina de recuperacin de error

No terminal E E T T F

Smbolo de entrada id E TE E +TE T FT T F id


PILA

( E TE

) E

$ E T

T FT T *FT F (E)
ENTRADA SALIDA

Gramtica: E TE E +TE | T FT T *FT | F (E) | id

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

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 $ $ $ $

E TE T FT F id T E +TE T FT F id T *FT F id

T E

Algoritmo de Anlisis Sintctico Predictivo no recursivo


apuntar ae al primer smbolo de w$ repetir X smbolo de la cima de la pila a smbolo apuntado por ae si x es un terminal o $ entonces si X = a entonces extraer X de la pila avanzar ae si_no error fin_si si_no si M[x,a] = X Y1Y2...Yk entonces extraer X de la pila meter Yk, Yk-1, ..., Y1 en la pila, con Y1 en la cima emitir la produccin X Y1Y2...Yk si_no error fin_si fin_si hasta_que X = $ /*la pila est vacia*/

Funciones PRIMERO y SIGUIENTE


La funcin PRIMERO(a) devuelve el conjunto de terminales que inician las cadenas derivadas de a La funcin SIGUIENTE(a) devuelve el conjunto de terminales que pueden aparecer inmediatamente a la derecha de a en alguna forma de frase Son funciones asociadas a una gramtica G Permiten rellenar las entradas de una tabla de ASP para G Los conjuntos de componentes lxicos devueltos por la funcin SIGUIENTE se pueden utilizar como elementos de sincronizacin durante la recuperacin de errores en modo pnico

FUNCIN PRIMERO (X)


Para todos los smbolos X de la gramtica Repetir hasta que no se puedan aadir ms smbolos a ningn conjunto 1. Si existe la regla x PRIMERO (X) = PRIMERO(X) U {} 2. Si x es un smbolo terminal PRIMERO (X) = {X} 3. Si x es un smbolo no terminal Para cada produccin x y1y2...yk PRIMERO (X) = PRIMERO (X) U PRIMERO (Y1) si existe la regla y1
PRIM (X) = PRIM (X) U PRIM (Y1) U PRIM (Y2) si existen las reglas y1 y y2 PRIM (X) = PRIM (X) U PRIM (Y1) U PRIM (Y2) U PRIM (Y3) .... si existe la regla yn n=1...k PRIM (X) = PRIM (X) U PRIM (Y1) U PRIM (Y2) U .... U PRIM (Yk) U {}

FUNCIN SIGUIENTE (X)


Para todos los smbolos A no terminales de la gramtica Repetir hasta que no se puedan aadir ms smbolos a ningn conjunto 1. Si S es el smbolo inicial de la gramtica SIGUIENTE (S) = SIGUIENTE (S) U {$} 2. Si existe una regla A B 3. 4. SIGUIENTE (B) = PRIMERO () - {} Si existe una regla A B SIGUIENTE (B) = SIGUIENTE (B) U SIGUIENTE (A) Si existe una regla A B y PRIMERO () SIGUIENTE (B) = SIGUIENTE (B) U SIGUIENTE (A)

Gramtica: E TE E +TE | T FT
PRIMEROS

T *FT | F (E) | id

SIGUIENTES

E E T T F + * ( + ( * ( + * id id id

( (

) id ) id

E E T T $ $ $ $ ) ) + + ) )

F $ + * )

ALGORITMO DE CONSTRUCCIN DE TASP Entrada: Una gramtica G Salida: La tabla de anlisis sintctico M Para cada regla X de G 1. Para terminal t de PRIMERO () Aadir X a M[X, t] 2. Si PRIMERO () Aadir X a M[X, b], b SIGUIENTE (x) Si PRIMERO () y $ SIGUIENTE (X) Aadir X a M[X, $] 3. Poner error en todas las entradas no definidas de M

regla E TE
regla E +TE regla E regla T FT regla T *FT regla T

regla F (E) regla F id

PRIMERO (TE) = PRIMERO (T) = {(, id} M [ E, ( ] = E TE M [ E, id ] = E TE PRIMERO (+TE) = PRIMERO (+) = { + } M [ E, + ] = E +TE SIGUIENTE (E) = { ), $ } M [ E, ) ] = E M [ E, $ ] = E PRIMERO (FT) = PRIMERO (F) = {(, id} M [ T, ( ] = T FT M [ T, id ] = T FT PRIMERO (*FT) = PRIMERO (*) = { * } M [ T, * ] = T *FT SIGUIENTE (T) = { ), +, $ } M [ T, ) ] = T M [ T, + ] = T M [ T, $ ] = T PRIMERO ((E)) = PRIMERO (() = { ( } M [ F, ( ] = F (E) PRIMERO (id) = { id } M [ F, id ] = F id

Smbolo de entrada No terminal id E E E TE error + error E +TE * error error ( E TE error ) error E $ error E

T
T F

T FT
error F id

error
T error

error
T *FT error

T FT
error F (E)

error
T error

error
T error

GRAMTICAS LL(1)
Si una gramtica es recursiva por la izquierda o ambigua la TASP tendr al menos una entrada con definicin mltiple. Recurso: Transformar la gramtica Una gramtica cuya TASP no tiene entradas con definiciones mltiples se define como LL(1)
Ninguna gramtica ambigua o recursiva por la izquierda puede ser LL(1) G es LL(1), si y solo si, cuando A | siendo dos reglas distintas de G se cumple: PRIMERO () PRIMERO () = Solo puede derivarse de o de Si deriva , no deriva ninguna cadena que comience con un terminal de SIGUIENTE (A)

ANLISIS ASCENDENTE
Estilo general: Anlisis sintctico por desplazamiento y reduccin
Por precedencia de operadores (gramticas muy especficas) LR (generadores automticos de AS)

Se construye el rbol de AS para una cadena w a partir de las hojas y se avanza hacia la raz
Proceso: reducir w al smbolo inicial de la gramtica Cada reduccin sustituye una subcadena (asidero o mango) que concuerde con el lado derecho de un regla de produccin por el smbolo no terminal del lado izquierdo de esa regla

ASIDEROS O MANGOS
Un asidero de una cadena es una subcadena que concuerda con el lado derecho de una produccin y cuya reduccin al no terminal del lado izquierdo de la regla es un paso de una derivacin por la derecha
Ejemplo S aABe A Abc Ab Bd
abbcde aAbcde aAde aABe S asidero posicin 2 (regla A b) asidero posicin 2 (regla A Abc) asidero posicin 3 (regla B d) asidero posicin 1 (regla S aABe)

ASIDEROS O MANGOS
La produccin situada ms a la izquierda de que concuerda con el lado derecho de una produccin A no es un asidero si la reduccin por esa regla genera una cadena no reducible al smbolo inicial
Ejemplo S aABe A Abc Ab Bd
aAbcde aunque b es la subcadena situada ms a la izquierda que concuerda con una parte derecha (regla A b) no es un asidero

a A A c d e No se puede reducir a S

ASIDEROS O MANGOS
Formalmente, un asidero de una forma de frase derecha es una regla A y una posicin de donde la cadena podra encontrarse y sustituirse por A para producir la forma de frase derecha previa en una derivacin por la derecha de

Ejemplo
EE+E EE*E E(E) E id
Formas de Frase Derecha id1 + id2 * id3 E + id2 * id3 Asidero id1 id2 Regla de Reduccin E id E id

E + E * id3
E+E*E E+E E

id3
E*E E+E

E id
EE*E EE+E

USO DE UNA PILA EN AS POR DESPLAZAMIENTO Y REDUCCIN


Problemas de implantacin del AS por desplazamiento y reduccin
Situar la subcadena a reducir Elegir la regla adecuada en caso de que haya ms de una con esa subcadena en la parte derecha

Posible solucin utilizar:


Una pila para manejar los smbolos gramaticales Buffer de entrada para gestionar la cadena w a analizar

FUNCIONAMIENTO DEL ANALIZADOR


Inicialmente:
En la pila el smbolo de fin de cadena ($) En el buffer la cadena a analizar seguida de la marca de fin de lnea (w$)

Repetir hasta que se detecte un error o en la pila solo haya el smbolo inicial (E$) y la entrada est vaca ($)
Desplazar cero o ms smbolos de la entrada a la pila hasta que en la cima haya un asidero Reducir al lado izquierdo de la regla adecuada

OPERACIONES DEL ANALIZADOR


Desplazar: Mover el siguiente smbolo de entrada a la cima de la pila Reducir: (En este momento el extremo derecho del asidero est en la cima de la pila) Localizar el extremo izquierdo del asidero dentro de la pila y decidir el no terminal con el que se debe sustituir el asidero. Aceptar: Anunciar el fin con xito del anlisis Error: Llamar a la rutina de recuperacin de errores

pila

entrada

accin

$ $ id1 $E $E+ $ E + id2 $E+E $E+E* $ E + E * id3 $E+E*E $E+E $E

id1 + id2 * id3 $ + id2 * id3 $ + id2 * id3 $ id2 * id3 $ * id3 $ * id3 $ id3 $ $ $ $ $

desplazar reducir por E id desplazar desplazar reducir por E id desplazar desplazar reducir por E id reducir por E E * E reducir por E E + E aceptar

PREFIJOS VIABLES
Este mtodo de anlisis garantiza que el asidero siempre aparecer en la cima de la pila, nunca dentro Los prefijos de las formas de frase derecha que pueden aparecer en la pila se denominan prefijos viables Un prefijo viable es un prefijo de una forma de frase derecha que no continua ms all del extremo derecho del asidero situado ms a la derecha de esta forma de frase

CONFLICTOS
Existen gramticas independientes de contexto para las que no se pueden utilizar analizadores sintcticos por desplazamiento y reduccin (gramticas no LR) En esas gramticas se puede llegar a una configuracin en la que, conociendo el contenido de la pila y el siguiente smbolo de entrada, no se puede decidir si
Desplazar o reducir (conflicto de desplazamiento/reduccin) Que tipo de reduccin efectuar (conflicto de reduccin/reduccin)

ANALIZADORES SINTCTICOS LR
Se pueden construir AS LR para casi todos los lenguajes que se pueden describir con GLC Es el mtodo de anlisis por desplazamiento y reduccin sin retroceso ms general pero eficiente La clase de gramticas aplicables es un supraconjunto de las que se pueden analizar con ASP Detectan los errores sintcticos tan pronto como sea posible en un examen de izquierda a derecha Inconveniente: costosos de construir a mano

ALGORITMO DE ANLISIS SINTCTICO LR


a1 ... ai ... an $

Sm Xm S m-1 X m-1 ... S0 accin ir_a

Programa para anlisis sintctico LR

SALIDA

ALGORITMO DE ANLISIS SINTCTICO LR


Entrada
Cadena de entrada w Tabla de AS LR con las funciones accin e ir_a para la gramtica G

Salida
Si w est en L(G) una derivacin ascendente Si no indicacin de error

Mtodo
Inicialmente:
La pila contiene S0 (estado inicial) El buffer de entrada contiene w$ (la cadena de entrada seguida de la marca de fin de cadena)

Ejecucin del programa de anlisis hasta encontrar una accin de aceptacin o de error

PROGRAMA DE ANLISIS
apuntar ae al primer smbolo de w$ repetir sea S el estado en la cima de la pila y a el smbolo apuntado por ae si accion [S,a]= desplazar S entonces meter a y despus S en la cima de la pila avanzar ae al siguiente smbolo de entrada si_no si accin [S, a] = reducir A entonces sacar 2 * || smbolos de la pila sea S el estado que hay ahora en la cima de la pila meter en la cima de la pila A y despus ir_a [S, A] emitir la produccin A si_no si accin [S, a] = aceptar entonces fin con xito si_no error fin_repetir

EJEMPLO Gramtica (1) E E + T (2) E T (3) T T * F (4) T F (5) F (E) (6) F id


Cdigos de las acciones 1. di significa desplazar y meter en la pila el estado i 2. rj significa reducir por la regla de nmero j

3. Acep significa aceptar


4. El espacio en blanco significa error

TABLA DE ANLISIS SINTCTICO LR (para la gramtica del ejemplo)


accin Estado 0 1 ir_a

id
d5

+
d6

(
d4

$
acep

E
1

T
2

F
3

2
3 4 5 6 7 8 9 10 11 d5 d5 d5

r2
r4 r6

d7
r4 d4 r6 d4 d4

r2
r4 r6

r2
r4 8 r6 9 3 10 2 3

d6 r1 r3 r5 d7 r3 r5

d11 r1 r3 r5 r1 r3 r5

MOVIMIENTOS DEL ANALIZADOR SINTCTICO LR DEL EJEMPLO (para la entrada id * id + id)


PILA (1) 0 ENTRADA ACCION

id * id + id $ desplazar

(2) 0 id 5
(3) 0 F 3 (4) 0 T 2 (5) 0 T 2 * 7

* id + id $ reducir por F id
* id + id $ reducir por T F * id + id $ desplazar id + id $ desplazar

(6) 0 T 2 * 7 id 5
(7) 0 T 2 * 7 F 10 (8) 0 T 2 (9) 0 E 1

+ id $ reducir por F id
+ id $ reducir por T T * F + id $ reducir por E T + id $ desplazar

(10) 0 E 1 + 6
(11) 0 E 1 + 6 id 5 (12) 0 E 1 + 6 F 3 (13) 0 E 1 + 6 T 9

id $ desplazar
$ reducir por F id $ reducir por T F $ reducir por E E + T

(14) 0 E 1

$ aceptar

GENERADORES DE AS: YACC


Yacc es un generador de analizadores sintcticos LALR Resolucin de conflictos en Yacc
Un conflicto reduccin/reduccin se resuelve eligiendo la regla en conflicto que se haya listado primero en la especificacin en Yacc Un conflicto de desplazamiento/reduccin se resuelve a favor del desplazamiento

Invocando a Yacc con la opcin v se genera el archivo y.output que contiene


Los ncleos de los conjuntos de elementos encontrados por el analizador sintctico Una descripcin de los conflictos en las acciones del anlisis generados por el algoritmo LALR Una representacin legible de la tabla de anlisis sintctico LR que muestra como se resolvieron los conflictos de las acciones del anlisis sintctico