Está en la página 1de 10

Algoritmos Usados por el Generador de Autmatas Finitos Determinsticos

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.

19
Algoritmos Usados por el Generador de Autmatas Finitos Determinsticos

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:

? +

d
|

'+' '-'

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

20
Algoritmos Usados por el Generador de Autmatas Finitos Determinsticos

dado se tendr:

.
#
4
? +

d
|
3

'+' '-'
1 2

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:

21
Algoritmos Usados por el Generador de Autmatas Finitos Determinsticos

Tipo de nodo Anulable(Nodo)

Hoja con nmero i Falso


.
Anulable(si) y Anulable(sd)
si sd

|
Anulable(si) o Anulable(sd)
si sd

*
Verdadero
s

+
Anulable(s)
s

?
Verdadero
s

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:

22
Algoritmos Usados por el Generador de Autmatas Finitos Determinsticos

Tipo de nodo PrimeraPos(Nodo) UltimaPos(Nodo)

Hoja con nmero i {i} {i}


. Si Anulable(si) Entonces Si Anulable(sd) Entonces
PrimeraPos(si) U PrimeraPos(sd) UltimaPos(sd) U UltimaPos(si)
si sd Sino PrimeraPos(si) Sino UltimaPos(sd)

|
PrimeraPos(si) U PrimeraPos(sd) UltimaPos(sd) U UltimaPos(si)
si sd

*
PrimeraPos(s) UltimaPos(s)
s

+
PrimeraPos(s) UltimaPos(s)
s

?
PrimeraPos(s) UltimaPos(s)
s

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 }
23
Algoritmos Usados por el Generador de Autmatas Finitos Determinsticos

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
24
Algoritmos Usados por el Generador de Autmatas Finitos Determinsticos

"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:
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

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.

25
Algoritmos Usados por el Generador de Autmatas Finitos Determinsticos

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 }
Ud = { 3, 4 } Transicin[ {1, 2, 3}, d ] = { 4, 3 }
EstadosD = { {1, 2, 3}0, {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
Ud = { 3, 4 } Transicin[ {3}, d ] = { 3, 4 }
EstadosD = { {1, 2, 3}0, {3}0, {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
Ud = { 3, 4 } Transicin[ {3, 4}, d ] = { 3, 4 }
EstadosD = { {1, 2, 3}0, {3}0, {3, 4}0 }

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:

26
Algoritmos Usados por el Generador de Autmatas Finitos Determinsticos

d d
'+' / '-'
0 1 2

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:

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

Fig. 9 Algoritmo para el funcionamiento de un Autmata Finito


Determinstico.

27
Algoritmos usados por el Generador de Analizadores Sintcticos

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.

28

También podría gustarte