Next: 6.3.2 Estructuras de datos
Up: 6.3 Integración con el
Previous: 6.3 Integración con el
Para facilitar la interacción del analizador sintáctico son el
reconocedor léxico no determinista, se ha optado por mantener
intactas las estructuras generadas por Flex y añadir una nueva
variable, denominada token, que almacene la lista de componentes léxicos
reconocidos en cada ejecución de la función yylex.
La variable token tiene como tipo una nueva estructura denominada
ice_lex_object. Esta estructura, que se define en el fichero de
cabecera que contiene las declaraciones de tipos y fuenciones C
utilizadas en el reconocedor generado por Flex, se muestra en el
siguiente fragmento de código:
struct ice_lex_object
{
char *word;
INT_LIST category,
gender,
number,
person,
verbal_tense;
STRING_LIST lemma;
}
El siginificado de los distintos campos es el siguiente:
- word. Este campo almacena la cadena de caracteres
correspondiente a la palabra que ha sido reconocida en la última
llamada a la función yylex.
- category. Es una lista de valores enteros que almacena el
tipo de componente léxico que se ha reconocido. Cada uno de los valores se
corresponde con una declaración %token en el fichero de la
gramática. Para comprender mejor su significado, diremos que cada
valor de esta lista se corresponde con un valor válido que
podría ser devuelto por la función yylex cuando se trata
de reconocedores léxicos deterministas convencionales.
Estos dos campos cosnstituyen la información básica que se debe
almacenar en token para permitir el enlace entre los anlizadores
léxico y sintáctico. Por tanto, debe ser incorporada en cualquier
programa Flex que pretenda utilizar el reconocimiento no determinista
de los componentes léxicos. El resto de la información almacenada en la variable
token es específica de la aplicación que se trata en este
trabajo. Diferentes aplicaciones pueden redefinir la estructura
ice_lex_object para adaptar el contenido de los campos a sus
necesidades específicas. Otra posible solución hubiese sido
situar esta información dependiente de la aplicación en la
variable yylval. Para ello habría que definir dicha variable
como un puntero a una lista de estructuras en las que se
almacenaría tal información. El problema surge al tratar de
mantener la consistencia entre la lista de componentes léxicos (representada como
una lista de ice_lex_object's) y la lista de yylval's. Para
facilitar el mantenimiento de esta consistencia se ha considerado más
adecuado almacenar toda la información que tiene relación con las
capacidades no deterministas en una única estructura. Con ello se
consigue adicionalmente un alto grado de aislamiento de estas nuevas
características con respecto a las capacidades estándar de los
reconocedores generados por Flex.
Los campos con información adicional dependiente de la aplicación
que se han utilizado son:
- gender. Es una lista de enteros que almacena el código
que identifica el género
de aquellas palabras en las que es aplicable esta característica.
Para aquellos componentes léxicos en los que no es aplicable, recibe el entero que
se corresponde con el valor No-Aplicable. Esta lista está coordinada
con la lista category, lo que quiere decir que el primer elemento
de la lista de género indica el género del primer token en la
lista de categorías, el segundo elemento en la lista de géneros
el valor del género para el segundo componente léxico, etc.
- number. Este campo es una lista de enteros que indica el
valor del número para aquellas palabras en las cuales es aplicable.
Por tanto, es equivalente a la lista gender, salvo que los
valores conciernen al número en vez de al género.
- person. Al igual que los campos anteriores, es una lista de
enteros coordinada con la lista de categorías, pero que en este
caso indica la persona (aplicable en el caso de verbos y pronombres).
- verbal_tense. Lista de enteros que indica el tiempo verbal
de una palabra, si es aplicable.
- lemma. Este campo es una lista de cadenas de carácteres que indica el
lema de cada palabra según cada tipo de componente léxico que ha sido reconocido
para dicha palabra. Por ejemplo, tomemos la palabra para, que es
reconocida como:
- una preposición, en cuyo caso el lema es para.
- Dos formas verbales del verbo parar
, en cuyo caso el
lema es parar para ambas. Cada forma verbal se
corresponde con un componente léxico distinto y por lo tanto con dos elementos en
cada una de las lista presentes en la estructura token.
- Dos formas verbales del verbo parir
, en
cuyo caso el lema es parir para ambas.
Next: 6.3.2 Estructuras de datos
Up: 6.3 Integración con el
Previous: 6.3 Integración con el
Miguel A. Alonso Pardo
Thu Nov 20 16:47:01 CET 1997