Вы находитесь на странице: 1из 14

Instituto Tecnolgico de Celaya

Lenguajes y Autmatas II


Tipos De Analizadores Sintcticos
Introduccin
Un analizador sintctico (o parser) es una de las partes de un compilador que
transforma su entrada en un rbol de derivacin.
El anlisis sintctico convierte el texto de entrada en otras estructuras
(comnmente rboles), que son ms tiles para el posterior anlisis y capturan la
jerarqua implcita de la entrada. Un analizador lxico crea tokens de una
secuencia de caracteres de entrada y son estos tokens los que son procesados
por el analizador sintctico para construir la estructura de datos, por ejemplo un
rbol de anlisis o rboles de sintaxis abstracta.
El anlisis sintctico tambin es un estado inicial del anlisis de frases de lenguaje
natural. Es usado para generar diagramas de lenguajes que usan flexin
gramatical, como los idiomas romances o el latn. Los lenguajes habitualmente
reconocidos por los analizadores sintcticos son los lenguajes libres de contexto.
Cabe notar que existe una justificacin formal que establece que los lenguajes
libres de contexto son aquellos reconocibles por un autmata de pila, de modo que
todo analizador sintctico que reconozca un lenguaje libre de contexto es
equivalente en capacidad computacional a un autmata de pila.
Los analizadores sintcticos fueron extensivamente estudiados durante los aos
70 del siglo XX, detectndose numerosos patrones de funcionamiento en ellos,
cosa que permiti la creacin de programas generadores de analizadores
sintticos a partir de una especificacin de la sintaxis del lenguaje en forma
Backus-Naur por ejemplo, tales como yacc, GNU bison y javaCC.
Clasificacin
La tarea esencial de un analizador es determinar si una determinada entrada
puede ser derivada desde el smbolo inicial, usando las reglas de una gramtica
formal, y como hacer esto, existen esencialmente dos formas:
Analizador sintctico descendente (Top-Down-Parser): ..un analizador
puede empezar con el smbolo inicial e intentar transformarlo en la entrada,
intuitivamente esto sera ir dividiendo la entrada progresivamente en partes
cada vez ms pequeas, de esta forma funcionan los analizadores LL, un
ejemplo es el javaCC. Pueden ser:
Instituto Tecnolgico de Celaya
Lenguajes y Autmatas II


o Con retroceso.
o Con recursin.
o LL(1)
Analizador sintctico ascendente (Bottom-Up-Parser): un analizador puede
empezar con la entrada e intentar llegar hasta el smbolo inicial,
intuitivamente el analizador intenta encontrar los smbolos ms pequeos y
progresivamente construir la jerarqua de smbolos hasta el inicial, los
analizadores LR funcionan as y un ejemplo es el Yacc. Pueden ser:
o Con retroceso.
o LR(1)

Anlisis Descendente Con Retroceso.
Objetivo: El mtodo parte del axioma inicial y aplica todas las posibles reglas al no
terminal ms a la izquierda.
Ejemplo: Utilizaremos la siguiente gramtica (No recursiva por la izquierda).

Para reconocer la cadena de entrada: (a + b) * a + b
Instituto Tecnolgico de Celaya
Lenguajes y Autmatas II



Mediante este rbol se pueden derivar todas las posibles sentencias reconocibles
por esta gramtica y el objetivo de este algoritmo es hacer una bsqueda en este
rbol de la rama que culmine en la sentencia a reconocer. El mecanismo funciona
mediante una bsqueda primero en profundidad. Mira si todos los tokens a la
izquierda de un No Terminal coincide con la cabeza de la secuencia a reconocer.
En todo el rbol de derivaciones, se pretende profundizar por cada rama hasta
llegar a encontrar una forma sentencial que no puede coincidir con lo que se
busca, en cuyo caso se desecha, o que coincide con lo buscado, momento en que
se acepta la sentencia. Si por ninguna rama se puede reconocer, se rechaza la
sentencia.
Instituto Tecnolgico de Celaya
Lenguajes y Autmatas II


Algoritmo:
Sea k N el no terminal ms a la izquierda de la forma sentencial.
Sea 2 T* la secuencia de tokens en la izquierda de k.

En el programa principal

Problemas: Este mtodo no funciona con gramticas recursivas a la izquierda, ya
que puede ocurrir que entre en un bucle infinito. No existen muchos analizadores
sintcticos con retroceso. En parte, porque casi nunca se necesita el retroceso
para analizar sintcticamente las construcciones de los lenguajes de
programacin. En casos como el anlisis sintctico del lenguaje natural, el
retroceso tampoco es muy eficiente, y se prefieren otros mtodos.
Reconocer con el algoritmo (a+b)*a+b
Instituto Tecnolgico de Celaya
Lenguajes y Autmatas II



Anlisis Descendente Con Recursin. Diagramas De Conway.
Una gramtica de contexto libre puede expresar un lenguaje al igual que puede
hacerlo la notacin BNF, y los diagramas de Conway.
Definicin: Un diagrama de Conway es un grafo dirigido donde los elementos no
terminales aparecen como rectngulos, y los terminales como crculos. Para
demostrar que permite representar las mismas gramticas que la BNF, se hace
por induccin sobre las operaciones bsicas de BNF:
Instituto Tecnolgico de Celaya
Lenguajes y Autmatas II



De esta forma todos los posibles caminos desde el inicio del grafo hasta el final,
representan formas sentnciales vlidas. En todo diagrama de Conway hay un
origen y un destino.
Anlisis Descendente De Gramticas LL(1)
Una gramtica LL (1) es aquella en la que su tabla de chequeo de sintaxis no
posee entradas mltiples, o sea, es suficiente con examinar slo un smbolo a la
entrada, para saber qu regla aplicar. Toda gramtica reconocible mediante el
mtodo de los diagramas de Conway es LL (1).
El mtodo consiste en seguir un algoritmo partiendo de:
- La cadena a reconocer, junto con un apuntador, que nos indica cual es el token
actual.
- Una pila de smbolos (terminales y no terminales)
- Una tabla asociada de forma unvoca a una gramtica.
Anlisis Ascendentes
Instituto Tecnolgico de Celaya
Lenguajes y Autmatas II


Aqu se construye el rbol sintctico de abajo hacia arriba, lo cual disminuye el
nmero de reglas mal aplicadas con respecto al caso descendente (si hablamos
del caso con retroceso).
Tanto si hay retroceso como si no, en un momento dado, la cadena de entrada
estar dividida en dos partes y :
: El trozo de la cadena de entrada (secuencia de tokens) por reconocer.
Coincidir siempre con algn trozo de la parte derecha de la cadena de entrada
.Vamos consumiendo tokens, y todos los tokens que nos queden por
consumir constituyen .
: coincidir siempre con el resto de la cadena de entrada, trozo al que se habrn
aplicado algunas reglas de produccin, ( ) en sentido inverso.
En un momento dado, el analizador sintctico se encuentra en con un par ,
concreto, al que se llama configuracin.
El analizador sintctico para poder trabajar puede realizar una de las cuatro
operaciones siguientes:
- Aceptar: Cadena reconocida.
- Rechazar: La entrada no es vlida.
- Reducir: Aplicar una regla de produccin a los elementos de .
- Desplazar: Se desplaza el terminal ms de la izquierda de a la derecha de .
Mediante reducciones y desplazamientos, tenemos que llegar a aceptar o
rechazar la cadena de entrada. Antes de hacer los desplazamientos tenemos que
hacerles todas las reducciones posibles a . Cuando es el axioma inicial y es
la tira nula, se acepta la cadena de entrada. Cuando no es la tira nula o no es
el axioma inicial y no se puede aplicar ninguna regla, entonces se rechaza la
cadena de entrada.
Anlisis Ascendente Con Retroceso.
Cuando se da cuenta que llega a una situacin en la que no puede continuar,
entonces vuelve atrs deshaciendo todos los cambios. En el anlisis con retroceso
no se permiten las reglas , puesto que estas se podrn aplicar de forma
indefinida. El algoritmo es el siguiente:
Instituto Tecnolgico de Celaya
Lenguajes y Autmatas II



En el programa principal pondremos:

Analizadores LR
Vamos a analizar una tcnica eficiente de anlisis sintctico ascendente que se
puede utilizar para analizar una amplia clase de gramticas de contexto libre. La
tcnica se denomina anlisis sintctico LR(k); la L es por el examen de la
entrada de izquierda a derecha (en ingls, left-to-right), la R por construir una
derivacin por la derecha (en ingls, rightmost derivation) en orden inverso, y la k
por el nmero de smbolos de entrada de examen por anticipado utilizados para
tomar las decisiones del anlisis sintctico. Cuando se omite, se asume que k, es
1. El anlisis LR es atractivo por varias razones.
Pueden reconocer la inmensa mayora de los lenguajes de programacin que
puedan ser generados mediante gramticas de contexto-libre.
Instituto Tecnolgico de Celaya
Lenguajes y Autmatas II


El mtodo de funcionamiento de estos analizadores posee la ventaja de localizar
un error sintctico en el mismo instante que se produce con lo que se adquiere
una gran eficiencia de tiempo de compilacin frente a procedimientos menos
adecuados como puedan ser los de retroceso.
El principal inconveniente del mtodo es que supone demasiado trabajo construir
un analizador sintctico LR a mano para una gramtica de un lenguaje de
programacin tpico. Se necesita una herramienta especializada - un generador de
analizadores sintcticos LR -. Por fortuna, existen disponibles varios de estos
generadores. Ms adelante estudiaremos el diseo y uso de uno, el programa
YACC. Con este generador se puede escribir una gramtica de contexto libre y el
generador produce automticamente un analizador sintctico de dicha gramtica.
Si la gramtica contiene ambigedades u otras construcciones difciles de analizar
en un examen de izquierda a derecha de la entrada, el generador puede localizar
dichas construcciones e informar al diseador del compilador de su presencia.
Existen tres tcnicas para construir una tabla de anlisis sintctico LR para una
gramtica.
El primer mtodo, llamado LR sencillo (SLR, en ingls) es el ms fcil de
implantar, pero el menos poderoso de los tres. Puede que no consiga producir una
tabla de anlisis sintctico para algunas gramticas que otros mtodos si
consiguen. El segundo mtodo, llamado LR cannico, es el ms poderoso y
costoso. El tercer mtodo, llamado LR con examen por anticipado (LALR, en
ingls), est entre los otros dos en cuanto a poder y costo. El mtodo LALR
funciona con las gramticas de la mayora de los lenguajes de programacin y,
con un poco de esfuerzo, se puede implantar en forma eficiente.
Funcionalmente hablando, un analizador LR consta de dos partes diferenciadas,
un programa de proceso y una tabla del anlisis. El programa de proceso posee
como veremos seguidamente un funcionamiento muy simple y permanece
invariable de analizador a analizador. Segn sea la gramtica a procesar deber
variarse el contenido de la tabla de anlisis que es la que identifica plenamente al
analizador. La figura muestra un esquema sinptico de la estructura general de un
analizador LR.
Instituto Tecnolgico de Celaya
Lenguajes y Autmatas II



Como puede apreciarse en la figura, el analizador consta de una tira de entrada
donde se encuentra la cadena a reconocer finalizada con el smbolo $ que
representa el delimitador. Esta tira lee de izquierda a derecha un smbolo cada vez
en el proceso de reconocimiento. El contenido de la pila tiene la forma

Donde el smbolo s
m
se encuentra en la cabeza tal y como se muestra en la figura.
Cada uno de los X
i
son smbolos de la gramtica y a los si vamos a denominarlos
estados del analizador.
Los estados se utilizan para representar toda la informacin contenida en la pila y
situada antes del propio estado. Es mediante el estado en cabeza de la pila por el
que se decide qu reduccin ha de efectuarse o bien qu desplazamiento.
Tradicionalmente, una tabla de anlisis para un reconocedor LR consta de dos
partes claramente diferenciadas entre s que representan dos funciones, la funcin
GOTO y la funcin ACCION. Seguidamente estudiaremos los cometidos de ambas
acciones. El funcionamiento del analizador LR es el siguiente:
1.- Se determina el estado s
m
en cabeza de la pila y el smbolo actual a
i
en el
instante de la cadena de entrada.
2.- Se consulta en la tabla de anlisis la funcin accin con los parmetros
anteriores y que puede dar como resultado.
Instituto Tecnolgico de Celaya
Lenguajes y Autmatas II



Por su parte la funcin GOTO acta igualmente con un estado y un smbolo de la
gramtica produciendo un nuevo estado. Anlogamente puede definirse una
configuracin de un analizador LR como un par de la forma

Es decir, el primer componente es el contenido actual de la pila, y el segundo la
subtira de entrada que resta por reconocer, a
i
es el smbolo de entrada actual de
anlisis. El movimiento del analizador se realiza teniendo en cuenta:
1. El smbolo ledo a
i
.
2. El smbolo en cabeza de la pila s
m
.
Actuando con la funcin accin y dependiendo de las cuatro posibles alternativas
pueden obtenerse las configuraciones que seguidamente se detallan.
1. Si accin (s
m
, a
i
) = desplazar s.
Entonces se introducen en la pila el smbolo actual analizado de la cadena de
entrada y en la cabeza de la pila el nuevo estado obtenido mediante la funcin
GOTO(s
m
, a
i
) = S.
La configuracin as obtenida es la mostrada seguidamente.

Pasando s a estar situado en cabeza de la pila y a
i+1
el siguiente smbolo a
explorar en la cinta de entrada.
2. Si entonces el analizador ejecuta la
reduccin oportuna donde el nuevo estado en cabeza de la pila se obtiene
mediante la funcin GOTO(s
m-r
, a
i
) = s donde r es precisamente la longitud de la
cadena reducida.
Instituto Tecnolgico de Celaya
Lenguajes y Autmatas II


Aqu el analizador extrajo primero 2r smbolos de la pila (r smbolos de estados y r
smbolos de la gramtica), exponiendo el estado s
m-r
. Luego introdujo A, el lado
izquierdo de la regla de produccin, y s, la entrada de GOTO(s
m-r
, A), en la pila.
La configuracin as obtenida es la mostrada seguidamente.

donde s es el nuevo estado en cabeza de la pila y no se ha producido variacin en
la tira de entrada que aun queda por analizar.
3. Si accin (sm, ai) = aceptar entonces se ha llegado a la finalizacin en el
proceso de reconocimiento y el anlisis termina reconociendo la tira de entrada.
4. Si accin (sm, ai) = error entonces es muestra de que el analizador LR ha
descubierto un error sintctico y proceder en consecuencia activando las rutinas
de correccin de errores. Una de las ventajas de este tipo de anlisis es que,
cuando se produce una accin de error, el token errneo suele estar al final de
o al principio de , lo que permite depurar con cierta facilidad las cadenas de
entrada (programas).
La configuracin inicial del analizador es

Donde s
0
es el estado inicial del reconocedor. Los sucesivos movimientos se
realizan en base a los cuatro puntos anteriores hasta que se acepta la cadena de
entrada o bien hasta la aparicin de un error.
Las tablas LR(1) ideadas por Knuth en 1965 son demasiado grandes para las
gramticas de los lenguajes de programacin. En 1969 De Remer y Korenjack
descubrieron formas de compactar estas tablas, haciendo prctico y manejable
este tipo de parser. Hay para ellos las gramticas Simples- LR (SLR) o bien Look-
Ahead LR (LALR) estando las gramticas incluidas de la siguiente forma:

Pero no sus lenguajes respectivos que coinciden en sus conjuntos. El
metacompilador YACC utiliza el anlisis LALR(1). El autmata debe de mantener
informacin de su configuracin (), y para mantener informacin sobre se
comunica con LEX, quin se encarga de la metacompilacin a nivel lxico.
Consideraciones Sobre El Anlisis Ascendente.
Instituto Tecnolgico de Celaya
Lenguajes y Autmatas II


Cundo usar recursin a derecha o a izquierda?
Ejemplo: Reconocer identificadores separados por comas
id, id, id,..., id
Podramos optar por 2 gramticas diferentes :

Qu diferencia hay entre ?

Alternativamente se va desplazando y reduciendo con lo que el tamao de la
pila se mantiene siempre estable (es ms conveniente, pero no siempre se puede
aplicar la recursin a la izquierda).
Si hacemos la recursin a derecha, siempre existe la posibilidad de que se
desborde la pila.
Por la forma de construir las tablas pueden aparecer conflictos:
Instituto Tecnolgico de Celaya
Lenguajes y Autmatas II


- Shift/Reduce: aparece cuando en la tabla de acciones hay que poner una R de
reducir y una D de desplazar, el conflicto es que el programa no sabe si reducir o
desplazar. En gramticas con ambigedad se produce el conflicto shift/reduce
(relacionado con el hecho de considerar la gramtica como asociativa a izquierda
o asociativa a derecha).
- Reduce/Reduce: Se pueden utilizar dos reglas para reducir y no sabe cul elegir.
Los conflictos reduce/reduce se pueden eliminar en la mayora de los casos.

Referencias Bibliogrficas:
www.lcc.uma.es/~galvez/ftp/tci/tictema3.pdf, consultado el 30 junio 2014.
http://es.wikipedia.org/wiki/Analizador_sint%C3%A1ctico, consultado el 30 junio
2014
http://dsc.itmorelia.edu.mx/~jcolivares/courses/ps207a/ps2_u4.pdf, consultado el
30 junio 2014.

Вам также может понравиться