Professional Documents
Culture Documents
Para implementar el TAD ARBOL de forma genrica, el mdulo TadItem debe exportar una operacin que nos permita comparar dos datos de tipo ITEM. As, adems del procedimiento ValorPorDefecto, incluiremos en el mdulo de definicin de TadItem el procedimiento
PROCEDURE Comparar(a, b: ITEM): INTEGER;
36
Aplicacin: Listado de identificadores para Modula-2. Como aplicacin, se trata de escribir un programa que lea un programa en Modula-2 y genere como resultado un listado en el que aparezcan en orden alfabtico los identificadores definidos por el usuario. Un identificador es una cadena de caracteres que comienza por una letra y est compuesta por letras, dgitos y el carcter de subrayado. Se debe tener especial cuidado en no contabilizar como identificadores las cadenas contenidas dentro de un comentario o un literal de cadena; aunque en un primer prototipo este detalle se puede ignorar. Lectura del cdigo fuente Para la lectura del cdigo fuente, implementaremos una librera LexMod2 segn el siguiente mdulo de definicin:
DEFINITION MODULE LexMod2; PROCEDURE Abrir(VAR nombre: ARRAY OF CHAR); PROCEDURE Cerrar; PROCEDURE SigIdent(VAR id: ARRAY OF CHAR); END LexMod2.
En el mdulo de implementacin tendremos una variable encapsulada de tipo File, sobre la que se efectuarn las operaciones de lectura. Esta forma de abstraccin se denomina encapsulado de datos: se oculta la definicin de un dato (en nuestro caso, la variable de tipo File) y se interacta con l a travs de una interfaz. La variable de error del TAD es otro ejemplo de encapsulado de datos. El procedimiento Abrir abre el fichero nombre que contiene el programa Modula2 a procesar, mientras que el procedimiento Cerrar cierra este fichero. El procedimiento SigIdent devuelve en id el siguiente identificador que aparece en el programa. Para ello, el procedimiento SigIdent va leyendo el fichero nombre carcter a carcter, agrupndolos hasta formar un elemento lexicogrfico de Modula-2. Los elementos lexicogrficos de Modula-2 pueden ser identificadores, constantes literales (enteros, reales, caracteres y cadenas), comentarios o smbolos. En general, puede saberse qu tipo de elemento lexicogrfico estamos leyendo al encontrar su primer carcter: los nmeros empiezan por un dgito, las cadenas por comillas simples o dobles, etc. Si el elemento lexicogrfico no es un identificador, se descarta y se contina leyendo el fichero. Por el contrario, si el elemento lexicogrfico es un identificador, se devuelve en el parmetro id. Por ejemplo, las primeras llamadas aplicadas al fichero LEXMOD2.DEF devolvern DEFINITION, MODULE, LexMod2, PROCEDURE , Abrir, VAR, nombre, ARRAY.... El fin de fichero se sealar devolviendo en id la cadena vaca. Generacin del listado de identificadores Para generar el listado de identificadores, se utilizar el TAD ARBOL empleando el siguiente tipo ITEM:
CONST MAX_IDENTIFICADOR= <<a definir>>; TYPE ITEM= ARRAY [1..MAX_IDENTIFICADOR] OF CHAR;
Antes de incluir un identificador en el ARBOL se debe comprobar que no sea una palabra reservada de Modula-2 (en el listado slo deben aparecer los identificadores definidos por el usuario). Si se trata de la primera aparicin del identificador, se inserta en el ARBOL.
37
Impresin del listado de identificadores Para imprimir el listado, basta efectuar un recorrido inorden del ARBOL. Prctica Suplementaria Un rbol TRIE es un rbol general, es decir, cada nodo puede tener un nmero diferente de hijos, que es muy apropiado para representar diccionarios de palabras. Las palabras vienen representadas por caminos dentro del rbol. Para evitar tomar como palabra independiente las primeras letras de otra palabra, se aade un campo especial de final de palabra (FDP). As podemos distinguir si, por ejemplo, DAD es parte de DADO o es una palabra por s solo.
ATRIE
... D
...
...
FDP F
... D
... O
... Z
FDP F
... D
... O
... Z
FDP F
... D
... R
...
FDP F
... D
... L
...
FDP F
... D
... O
...
FDP F
... D
...
...
FDP V
... D
... O
...
FDP V
... D
...
...
FDP V
38
(* Devuelve la palabra siguiente en el rbol. Si la palabra que se pasa de parmetro es la ltima, se devuelve ella misma.*) PROCEDURE Siguiente(a: ATRIE; p: ARRAY OF CHAR; VAR sig: ARRAY OF CHAR); (* Libera toda la memoria ocupada por el rbol *) PROCEDURE Destruir(VAR a: ATRIE); (* Lista por pantalla todos las palabras contenidas en el rbol *) PROCEDURE Listar(a: ATRIE);
39