Sei sulla pagina 1di 10

Captulo 3: Algoritmos Usados por el Generador de Autmatas

Finitos Determinsticos
3.1 Introduccin
En este captulo se presentan los algoritmos usados por el generador de
autmatas finitos determinsticos que sirve como base principal para la
construccin de un analizador lexicogrfico.
A diferencia del captulo 2, en este captulo se documenta en detalle
cada aspecto de los algoritmos, y se incluyen ejemplos que clarificarn su
funcionamiento.
Durante su lectura no se debe olvidar que el tratamiento de lenguajes
con expresiones regulares es un caso especial de anlisis sintctico
(implcitamente se est trabajando con una gramtica del Tipo 3), al que
comnmente se lo denomina anlisis lexicogrfico. La teora aqu presentada
se puede aplicar a muchas reas de la ciencia, y no slo al anlisis
lexicogrfico.
3.2 Arbol Sintctico para una Expresin Regular
3.2.1 Descripcin
Se construir un rbol sintctico para la expresin regular a partir del
anlisis sintctico de la misma.
Como ya se sabe, en un rbol hay 2 tipos de nodos: nodos hojas y nodos
que no son hojas que aqu representarn operaciones. En un rbol sintctico de
una expresin regular los nodos hojas representarn un caracter (o smbolo
terminal) que aparece en el texto fuente, el resto de los nodos representarn
operaciones con ellos.
El lenguaje para expresiones regulares con el que trabajaremos es el que
se presenta en la seccin 10.3. En la misma se definen 5 operaciones, lo que
nos da 6 tipos de nodos posibles a saber:
1. Nodo hoja: se representa con un crculo y dentro del mismo el caracter
que hay en esa posicin.
Algoritmos Usados por el Generador de Autmatas Finitos Determinsticos
19
2. Nodo concatenacin: se representa con un crculo con un punto adentro.
3. Nodo disyuncin: se representa con un crculo con un | adentro.
4. Nodo asterisco: se representa con un crculo y un * adentro.
5. Nodo opcional: se representa con un crculo y un ? adentro.
6. Nodo uno o ms: se representa con un crculo y un + adentro.
El rbol puede ser construido trabajando con cualquier tcnica de
anlisis sintctico que permita construir el rbol sintctico respetando el orden
de examen de los terminales de izquierda a derecha (puede ser LL(k) o LR(k)).
Ejemplo: sea la expresin regular la siguiente:
( '+' | '-' ) ? d +
El rbol sintctico sera:
Fig. 3 Arbol sintctico para ( '+' | '-' ) ? d +
A los efectos de poder implementar los algoritmos de generacin se
trabaja con la expresin regular aumentada "ExpReg #" donde el numeral (#)
significa fin de la expresin regular. Al construir el rbol sintctico para la
expresin regular aumentada, el nodo raz del rbol ser un nodo
concatenacin el cual tendr como subrbol izquierdo el rbol sintctico
construido y como subrbol derecho la hoja etiquetada con #. Para el ejemplo
.
+
|
'+' '-'
d
?
Algoritmos Usados por el Generador de Autmatas Finitos Determinsticos
20
dado se tendr:
Fig. 4 Arbol sintctico para ( '+' | '-' ) ? d + #
En el rbol sintctico presentado en la figura 4 se muestran las hojas
numeradas de 1 a N. La numeracin de las hojas se realizar por el orden de
aparicin de las mismas en la expresin regular.
3.2.2 Funciones aplicables a nodos de un rbol sintctico
Definiremos 4 funciones que operan sobre nodos de un rbol sintctico
construido para una expresin regular dada: Anulable, PrimeraPos, UltimaPos
y SiguientePos. El sufijo Pos significa posicin del rbol. Las funciones
devuelven algn valor referente a esa posicin del rbol.
La funcin Anulable devuelve como resultado Verdadero o Falso. Es
recursiva por definicin y se la caracteriza por medio de la siguiente tabla:
.
+
|
'+' '-'
d
.
#
1
2
3
4
?
Algoritmos Usados por el Generador de Autmatas Finitos Determinsticos
21
Fig. 5 Funcin Anulable
Las funciones PrimeraPos y UltimaPos son tambin recursivas.
Devuelven como resultado un conjunto cuyos elementos son los nmeros de
las hojas siguientes a la posicin actual. Las funciones quedan caracterizadas
mediante la siguiente tabla:
Tipo de nodo
Anulable(Nodo)
Hoja con nmero i Falso
|
*
.
+
?
si
sd
si
sd
s
s
s
Anulable(si) y Anulable(sd)
Anulable(si) o Anulable(sd)
Verdadero
Anulable(s)
Verdadero
Algoritmos Usados por el Generador de Autmatas Finitos Determinsticos
22
Fig. 6 Funciones PrimeraPos y UltimaPos
La funcin SiguientePos se calcula nicamente para los nodos hoja,
pero su clculo requiere el completo recorrido del rbol sintctico. Se define
por las dos reglas siguientes:
1. Si n es un nodo concatenacin con subrbol izquierdo si y subrbol
derecho sd, e i es una posicin dentro de UltimaPos(si), entonces todas
las posiciones de PrimeraPos(sd) estn en SiguientePos(i).
2. Si n es un nodo asterisco e i es una posicin dentro de UltimaPos(n),
entonces todas las posiciones de PrimeraPos(n) estn en SiguientePos(i).
Ejemplo: para el ejemplo dado (ver figura 4) tenemos:
Funciones PrimeraPos y UltimaPos:
Para el nodo disyuncin:
PrimeraPos( | ) = { 1, 2 }
UltimaPos( | ) = { 1, 2 }
Tipo de nodo
PrimeraPos(Nodo)
Hoja con nmero i
|
*
.
+
?
si
sd
si
sd
s
s
s
UltimaPos(Nodo)
{ i } { i }
Si Anulable(si) Entonces
PrimeraPos(si) U PrimeraPos(sd)
Sino PrimeraPos(si)
PrimeraPos(si) U PrimeraPos(sd)
PrimeraPos(s)
PrimeraPos(s)
PrimeraPos(s)
Si Anulable(sd) Entonces
UltimaPos(sd) U UltimaPos(si)
Sino UltimaPos(sd)
UltimaPos(sd) U UltimaPos(si)
UltimaPos(s)
UltimaPos(s)
UltimaPos(s)
Algoritmos Usados por el Generador de Autmatas Finitos Determinsticos
23
Para el nodo opcional:
PrimeraPos( ? ) = { 1, 2 }
UltimaPos( ? ) = { 3 }
Para el nodo concatenacin de ms a la izquierda:
PrimeraPos( . ) = { 1, 2, 3 }
UltimaPos( . ) = { 3 }
Para el nodo concatenacin raz:
PrimeraPos( . ) = { 1, 2, 3 }
UltimaPos( . ) = { 4 }
Las funciones SiguientePos(i) para cada hoja son:
SiguientePos(1) = { 3 }
SiguientePos(2) = { 3 }
SiguientePos(3) = { 3, 4 }
SiguientePos(4) = { }
3.3 Construccin de un AFD a partir de una expresin regular
3.3.1 Construccin del AFD
La construccin de un autmata finito determinstico (AFD) a partir de
una expresin regular se realiza mediante el siguiente procedimiento:
1. Construir el rbol sintctico para la expresin regular aumentada
ExpReg #, donde # es un marcador de final que se aade a ExpReg y
que difiere de los caracteres que pueden aparecer en ExpReg (no debe
estar dentro del conjunto de terminales).
2. Calcular las funciones Anulable, PrimeraPos, UltimaPos y SiguientePos
haciendo recorridos en profundidad del rbol.
3. Construir EstadosD (la letra D por Determinstico), el conjunto de
estados del AFD, por medio del procedimiento descripto en el punto
siguiente. Los estados dentro de EstadosD son conjuntos de posiciones;
al principio, cada estado est "no marcado", y un estado se convierte en
Algoritmos Usados por el Generador de Autmatas Finitos Determinsticos
24
"marcado" justo antes de considerar sus transiciones de salida. El estado
inicial del AFD es PrimeraPos(raz), y los estados de aceptacin son
todos los que contienen la posicin asociada con el marcador #.
3.3.2 Clculo del conjunto de estados y de la tabla de transiciones
El procedimiento de clculo del conjunto de estados y de la tabla de
transiciones del autmata finito determinstico para la expresin regular es el
que se muestra en la figura siguiente:
Fig. 7 Algoritmo para la construccin del conjunto de estados y
la tabla de transiciones para el AFD de la expresin
regular.
3.3.3 Ejemplo de construccin del AFD a partir de la expresin regular
Para la expresin regular utilizada en los puntos precedentes tenemos
los siguientes pasos:
1. Inicialmente EstadosD = { {1, 2, 3} }.
El nico estado del conjunto est sin marcar.
Al principio, el nico estado no marcado en EstadosD es PrimeraPos(raz), donde raz
es la raz del rbol sintctico construido para ExpReg #.
Mientras haya un estado E sin marcar en EstadosD hacer
Marcar E
Para cada smbolo de entrada a hacer
sea U el conjunto de posiciones que estn en
SiguientePos(p) para alguna posicin p en E, tal que el
smbolo en la posicin p es a.
Si U no est vaco y no est en EstadosD entonces
Aadir U como estado no marcado a EstadosD.
Transicin[E, a] = U.
Sino Transicin[E, a] = no definida
FinPara
FinMientras
Algoritmos Usados por el Generador de Autmatas Finitos Determinsticos
25
2. Sea E = { 1, 2, 3 } el estado actual, al que luego se le dar el nmero 0:
U
'+'
= { 3 } Transicin[ {1, 2, 3}, '+' ] = { 3 }
U
'-'
= { 3 } Transicin[ {1, 2, 3}, '-' ] = { 3 }
U
d
= { 3, 4 } Transicin[ {1, 2, 3}, d ] = { 4, 3 }
EstadosD = { {1, 2, 3}, {3}, {3, 4} }
3. Sea E = { 3 } el estado actual, al que luego se le dar el nmero 1:
U
'+'
= { } Transicin[ {3}, '+' ] = no definido
U
'-'
= { } Transicin[ {3}, '-' ] = no definido
U
d
= { 3, 4 } Transicin[ {3}, d ] = { 3, 4 }
EstadosD = { {1, 2, 3}, {3}, {3, 4} }
4. Sea E = { 3, 4 } el estado actual, al que luego se le dar el nmero 2:
U
'+'
= { } Transicin[ {3, 4}, '+' ] = no definido
U
'-'
= { } Transicin[ {3, 4}, '-' ] = no definido
U
d
= { 3, 4 } Transicin[ {3, 4}, d ] = { 3, 4 }
EstadosD = { {1, 2, 3}, {3}, {3, 4} }
5. No hay ms estados sin marcar, por lo tanto termina la iteracin.
Los estados (conjunto de posiciones siguientes) fueron numerados de 0
a n-1, donde n es el cardinal del conjunto EstadosD.
Hay un solo estado final y es el {3, 4} (al que se le dio el nmero 2),
puesto que es el que contiene la posicin que corresponde al #, que fue
numerada con 4. El conjunto de estados finales queda as:
Estados Finales = { {3, 4} }
La tabla de transiciones de estados para el autmata finito determinstico
que reconoce cadena de caracteres con la estructura " ( '+' | '-' ) ? d +" es la
siguiente:
Estado '+' '-' d
0 1 1 2
1 no definido no definido 2
2 no definido no definido 2
La grfica del autmata finito determinstico para el ejemplo dado es:
Algoritmos Usados por el Generador de Autmatas Finitos Determinsticos
26
Fig. 8 Autmata finito determinstico construido para la
expresin regular ( '+' | '-' ) ? d +
3.4 Funcionamiento de un autmata finito determinstico
El siguiente procedimiento ilustra el funcionamiento de un autmata
finito determinstico:
Fig. 9 Algoritmo para el funcionamiento de un Autmata Finito
Determinstico.
0 1 2
'+' / '-'
d
d
d
EstadoActual = 0;
Buscar un caracter de entrada y guardarlo en c
Hacer
Si c no es FinDeArchivo entonces
EstadoNuevo = Transicin[EstadoActual, c];
Buscar un caracter de entrada y guardarlo en c
Si EstadoNuevo es un estado del autmata entonces
EstadoActual = EstadoNuevo;
FinSi
FinSi
Mientras EstadoActual sea igual a EstadoNuevo;
Si EstadoActual es un elemento del conjunto de estados finales entonces
La cadena de entrada leda hasta este momento cumple con la
expresin regular.
FinSi
Algoritmos Usados por el Generador de Autmatas Finitos Determinsticos
27
Captulo 4: Algoritmos usados por el Generador de Analizadores
Sintcticos
4.1 Introduccin
En este captulo se presentan los algoritmos usados por el Generador de
Analizadores Sintcticos SLR. Se tratar de clarificar bien los conceptos
tericos utilizados, lo que no hace la bibliografa que se utiliz (luego de la
lectura de la bibliografa, en el mejor de los casos quedan muchos conceptos
flotando y sin relacin alguna, y lo ms comn es que no se los entienda).
Los analizadores sintcticos generados trabajan con la tcnica SLR(1) o
SLR para simplificar, la que es un caso especial de LR(k). A diferencia de la
tcnica LR(1) cannica y de la tcnica LALR, esta tcnica genera tablas
mucho ms pequeas (se minimiza el nmero de estados del autmata de pila).
Se la puede aplicar a casi todas las gramticas de contexto libre que pueda
necesitar un programador (el desarrollo de lenguajes de programacin con
gramticas complejas puede requerir trabajar con la tcnica LALR, pero si la
tcnica SLR es aplicable entonces el analizador ser ms eficiente).
La tcnica LR ha sido descripta por Knuth [1965], pero no result
prctica porque el tamao de las tablas que se deban construir eran demasiado
grandes (recordar que en ese tiempo 16 kbytes era mucha memoria). En 1969
Korenjak mostr que mediante esa tcnica se podan producir analizadores
sintcticos de tamao razonable para las gramticas de los lenguajes de
programacin. En 1969 y 1971, DeRemer invent los mtodos "LR simples"
(SLR por Simple LR) y "LR con smbolo de anticipacin" (LALR por
lookahead-LR) que son ms simples que los de Korenjak.
La utilizacin de la tcnica SLR (y del resto de las LR) simplifica
mucho el trabajo del desarrollo de un traductor, siempre y cuando se disponga
de un programa generador de las tablas de anlisis sintctico. Si no se dispone
de un generador de las tablas, la construccin de las mismas puede llegar a
desalentar la construccin del traductor puesto que se requiere un dominio
profundo de los algoritmos de construccin y de la teora en la que se basan.
Una persona puede entender bien los algoritmos de construccin de las tablas,
y an as cometer muchos errores.
Algoritmos usados por el Generador de Analizadores Sintcticos
28

Potrebbero piacerti anche