next up previous contents
Next: 5.4.3 El control de Up: 5.4 La integración con Previous: 5.4.1 Las variables de

5.4.2 La lista de posiciones

Sin embargo, con las variables anteriores no es suficiente. La causa está en que una vez que ICEeditor cede el control al analizador sintáctico, éste no lo devuelve hasta que termina de analizar todo el texto (o la porción modificada incrementalmente, en su caso). Una forma de solucionar ésto es hacer que el analizador léxico vaya almacenando la posición de cada componente léxico en un lista enlazada, a la que ICEeditor podrá acceder una vez que el analizador sintáctico haya terminado su tarea.

Para ello hemos de definir los tipos de datos correspondientes y las funciones de manejo asociadas. El primer paso consiste en definir una estructura C en la cual se almacenará la información correspondiente a cada componente léxico individual. Esta estructurá recibirá el nombre de ITEM_TOKEN_INFO. Como se van a enlazar varios de estas estructuras en una lista, es conveniente definir un tipo TOKEN_INFO que sea un puntero a una de estas estructuras. Su función es hacer de puntero al primer elemento de la lista. Las definiciones en C se muestran a continuación:

typedef struct ITEM_TOKEN_INFO *TOKEN_INFO;
struct ITEM_TOKEN_INFO
{
    int token_line;
    int token_pos;
    int token_len;
    TOKEN_INFO_LIST next_item;
}

El siguiente paso consiste en definir un conjunto de funciones que permitan manejar cómodamente listas de tipo TOKEN_INFO. Utilizando una notación al estilo Lisp podemos definir las siguientes funciones:

Mediante el tipo TOKEN_INFO y las funciones asociadas disponemos de las herramientas necesarias para realizar el control de posición de los componentes léxicos en el reconocedor léxico.

Para facilitar el proceso de interacción entre LE-LISP y C, se definen las funciones siguientes, que permiten obtener por separado cada uno de los componentes del CAR de una lista con información posicional de los componentes léxicos:

Estas funciones no tienen argumentos, sino que acceden directamente a una variable global denominada token_info_list, toman el car de la lista a la que apunta mediante una llamada a CAR_TOKEN_INFO y recuperan el campo de interés, que será el resultado que devuelvan.

Una función adicional, llamada nextl_token_info_list, llama a NEXTL_TOKEN_INFO para eliminar el CAR de la lista de información. Comprueba si la lista resultante es vacía, en cuyo caso devuelve el valor 0. Si la lista no está vacía, devuelve el valor 1.


next up previous contents
Next: 5.4.3 El control de Up: 5.4 La integración con Previous: 5.4.1 Las variables de

Miguel A. Alonso Pardo
Thu Nov 20 16:47:01 CET 1997