Next: 6.3.3 Funciones de actualización
Up: 6.3 Integración con el
Previous: 6.3.1 La variable token
Como se ha podido observar en la definicón de la estructura
ice_lex_object, los campos que son listas de enteros tienen
asignado el tipo INT_LIST, y los que son listas de cadenas de carácteres el
tipo STRING_LIST. Estos dos tipos han sido definidos para
facilitar la tarea de manejo de tales listas, ya que además de
definir el tipo en sí se define un conjunto de funciones
asociadas que permiten trabajar de un modo seguro y estandarizado
sobre estas listas.
El tipo INT_LIST implementa las listas de enteros. La
declaración de este tipo se realiza como se muestra en las siguientes
líneas de código:
typedef struct ITEM_INT_LIST *INT_LIST
struct ITEM_INT_LIST
{
int data_item;
INT_LIST next_item;
};
Por tanto, cuando se declara una variable de tipo INT_LIST, se
está declarando realmente un puntero a un objeto en memoria de tipo
ITEM_INT_LIST, el cual es una estructura que almacena un valor
entero, identificado como el campo data_item y un puntero al
siguiente elemento de la lista, identificado mediante el campo
next_item.
Para manejar este tipo de listas, se han definido las siguientes
funciones:
- RESET_INT_LIST. Esta función toma como argumento un
puntero a un valor de tipo INT_LIST
y se encarga de eliminar una
lista de enteros, liberando todas las posiciones de memoria ocupadas
por todos sus elementos y estableciendo el puntero de inicio de la
lista al valor NULL.
- IS_EMPTY_INT_LIST. Esta función comprueba si el valor
que se le pasa como argumento es el inicio de una lista de enteros o
no. El valor devuelto es un entero con significado booleano.
- CONS_INT_LIST. Esta función, al igual que la función
cons del Lisp, añade un elemento en la cabeza de una lista de
enteros. Para ello toma como argumento un puntero a un elemento
INT_LIST y un valor entero, que será asignado al campo
data_item de la estructura ITEM_INT_LIST que representa al
nuevo elemento de la lista.
- NEXTL_INT_LIST. Esta función realiza un trabajo
similar al de su homónima nextl en Lisp: elimina el primer
elemento de una lista de enteros y devuelve el resto de la lista (En
Lisp el CDR). Al igual que la función Lisp, esta función modifica
físicamente sus argumentos, ya que no crea una lista nueva, sino
que desengancha realmente el primer elemnto de la lista
argumento
.
- CAR_INT_LIST. Esta función obtiene, utilizando
terminología Lisp, el CAR de una
lista de enteros. Al igual que la función Lisp, sólo realiza
operaciones de lectura, por lo que no modifica la lista argumento. En
este caso el argumento es realmente un valor de tipo INT_LIST.
Con estas funciones se dispone de un conjunto lo suficientemente
amplio de operadores para tratar las listas de enteros sin necesidad de
recurrir a manipulaciones manuales de sus elementos.
Las listas de cadenas de carácteres, que por ahora sólo se utilizan para tratar el
campo lemma de la variable componente léxico, se implementan mediante la
utilización del tipo STRING_LIST, el cual se declara tal y
como se muestra en las siguientes líneas de código:
typedef struct ITEM_STRING_LIST *SRING_LIST;
struct ITEM_STRING_LIST
{
char *data_item;
STRING_LIST next_item;
}
Al igual que ocurría con las lista de enteros, una variable de
tipo STRING_LIST es un puntero a una estructura
ITEM_STRING_LIST que representa el primer elemento de la lista de
cadenas de carácteres. Estas estructuras tienen dos campos, uno de los cuales, que
recibe por nombre data_item,
almacena un puntero a una cadena de caracteres, mientras que el otro,
llamado next_item, almacena un
puntero al siguiente elemento de la lista.
El conjunto de funciones que se han definido para tratar con este tipo
de listas es equivalente al que se definió para trabajar con las
listas de enteros. Así, se dispone de las siguientes funciones:
- RESET_STRING_LIST, que elimina la lista de cadenas de carácteres,
teniendo cuidado de liberar toda la memoria ocupada, no sólo por
las estructuras que componen cada elemnto, sino por las propias
cadenas de caracteres a las que apunta cada una de dichas estructuras.
- IS_EMPTY_STRING_LIST comprueba si una lista de cadenas de carácteres
esta vacía.
- CONS_STRING_LIST. Añade un elemento al principio de
lista. Toma como parámetros un puntero a INT_LIST y un
puntero a char. Esta función crea una nueva estructura
ITEM_STRING_LIST y la enlaza al principio de la lista. Para
rellenar el campo data_item se crea una
nueva cadena de caracteres en la que se copia el contenido de la que se
pasa como argumento, por lo que dicho argumento permanece sin
cambios.
- NEXTL_STRING_LIST, elimina el primer elemento de una lista
de cadenas de carácteres.
- CAR_STRING_LIST, devuelve la cadena de caracteres
almacenada en el primer elemento de la lista de cadenas de carácteres.
Next: 6.3.3 Funciones de actualización
Up: 6.3 Integración con el
Previous: 6.3.1 La variable token
Miguel A. Alonso Pardo
Thu Nov 20 16:47:01 CET 1997