Introduccion a LEX

Lex es un generador de programa diseñado para el proceso léxico de los flujos de entradas del carácter. Acepta una especificación de alto nivel, problema orientada para la cadena de caracteres que empareja, y produce un programa en una lengua de fines generales que reconozca expresiones regulares. Las expresiones regulares son especificadas por el usuario en las especificaciones de la fuente dadas a Lex. El código escrito Lex reconoce estas expresiones en un flujo de entradas y reparte el flujo de entradas en las secuencias que emparejan las expresiones. En los límites entre las secuencias que las secciones del programa proporcionaron por el usuario se ejecutan. El archivo de fuente de Lex asocia las expresiones regulares y los fragmentos del programa. Mientras que cada expresión aparece en la entrada al programa escrito por Lex, se ejecuta el fragmento correspondiente.

El usuario provee el código adicional más allá de emparejar de la expresión necesitado para terminar sus tareas, posiblemente incluyendo el código escrito por otros generadores. El programa que reconoce las expresiones se genera en el lenguaje de programación de fines generales empleado para los fragmentos del programa de usuario. Así, una lengua de la expresión del alto nivel se proporciona para escribir las expresiones de la secuencia que se emparejarán mientras que la libertad del usuario para escribir acciones es intacta. Esto evita de forzar al usuario que desea utilizar una lengua de la manipulación de secuencia para el análisis de la entrada para escribir el proceso de programas en el mismo y la secuencia a menudo inadecuada que manejan lengua.

Lex es una no lengua completa, sino algo un generador que representa una nueva característica de lengua que se pueda agregar a diversos lenguajes de programación, llamada `` '' de las idiomas del anfitrión. Apenas mientras que las idiomas de fines generales pueden producir código para funcionar en diverso hardware, Lex puede escribir código en diversas idiomas del anfitrión. La lengua del anfitrión se utiliza para el código de salida generado por Lex y también para los fragmentos del programa agregados por el usuario. Las bibliotecas run-time compatibles para las diversas idiomas del anfitrión también se proporcionan. Esto hace Lex adaptable a diversos ambientes y a diversos usuarios. Cada uso se puede dirigir a la combinación de la lengua del hardware y del anfitrión apropiada a la tarea, al fondo del usuario, y a las características de puestas en práctica locales. Actualmente, la única lengua apoyada del anfitrión es C, aunque FORTRAN (en la forma de Ratfor [ 2 ] ha estado disponible en el pasado. Lex sí mismo existe en UNIX, el GCOS, y OS/370; pero el código generado por Lex se puede tomar dondequiera los recopiladores apropiados existe.

Lex da vuelta a las expresiones y a las acciones del usuario (llamadas fuente en esta nota) en la lengua de uso general del anfitrión; el programa generado se nombra yylex. El programa del yylex reconocerá expresiones en una corriente (llamada entrada en esta nota) y realizará las acciones especificadas para cada expresión como se detecta. Véase El Cuadro 1.

                                  +-------+ fuente - > |  Lex  |  - > yylex +-------+ +-------+ entrado - >  | yylex | - > haga salir +-------+ una descripción del cuadro 1 
de Lex

Por un ejemplo trivial, considere un programa suprimir de la entrada todos los espacios en blanco o lengüetas en los extremos de líneas.

                                 el %% [ \t]+$;

es todo se requiere que. El programa contiene un delimitador del %% para marcar el principio de las reglas, y una regla. Esta regla contiene una expresión regular que empareje unos o más casos del espacio en blanco o de la lengüeta de los caracteres (escrita el \t para la visibilidad, de acuerdo con la convención de lengua de C) apenas antes del extremo de una línea. Los soportes indican la clase del carácter hecha de espacio en blanco y de lengüeta; + indica que `` un o más...''; y el $ indica `` el extremo de la línea, '' como en QED. No se especifica ninguna acción, así que el programa generado por Lex (yylex) no hará caso de estos caracteres. Todo será copiado. Para cambiar cualquier cadena restante de espacios en blanco o de lengüetas a un solo espacio en blanco, agregue otra regla:

                           el %% [ \t]+$; [ printf(de \t]+ "");

El autómata finito generado para esta fuente explorará para ambas reglas inmediatamente, observando en la terminación de la cadena de espacios en blanco o de lengüetas si o hay un carácter del newline, y ejecutando la acción deseada de la regla. La primera regla empareja todas las cadenas de espacios en blanco o de lengüetas en el extremo de líneas, y la segunda regla toda las cadenas restantes de espacios en blanco o de lengüetas.

Lex se puede utilizar solamente para las transformaciones simples, o para el análisis y la estadística que recolectan en un nivel léxico. Lex se puede también utilizar con un generador del programa de análisis para realizar la fase de análisis léxica; es particularmente fácil interconectar Lex y Yacc [ 3 ]. Los programas de Lex reconocen solamente expresiones regulares; Yacc escribe los programas de análisis que aceptan una clase grande de las gramáticas libres del contexto, pero requiere un analizador de nivel inferior reconocer símbolo de la entrada. Así, una combinación de Lex y de Yacc es a menudo apropiada. Cuando está utilizado como preprocesador para un generador más último del programa de análisis, Lex se utiliza para repartir el flujo de entradas, y el generador del programa de análisis asigna la estructura a los pedazos que resultan. El flujo del control en tal caso (que pudo ser la primera mitad de un recopilador, por ejemplo) se demuestra en el cuadro 2. Los programas adicionales, escritos por otros generadores o a mano, se pueden agregar fácilmente a los programas escritos por Lex.

                        la gramática léxica gobierna reglas                            |              |                            v v +---------+ +---------+                       |   Lex   |    |  Yacc   |                       +---------+ +---------+                            |              |                            v v +---------+ +---------+ entrado - > |  yylex  | - > | yyparse | - > analizó la entrada +---------+ +---------+ Lex con 
el cuadro 2 de Yacc

Los usuarios de Yacc realizarán que el yylex conocido es lo que espera Yacc que su analizador léxico sea nombrado, de modo que el uso de este nombre de Lex simplifique la interconexión.

Lex genera un autómata finito determinista de las expresiones regulares en la fuente [ 4 ]. Se interpreta, más bien que se compila el autómata, para ahorrar el espacio. El resultado sigue siendo un analizador rápido. En detalle, el tiempo tomado por un programa de Lex para reconocer y para repartir un flujo de entradas es proporcional a la longitud de la entrada. El número de las reglas de Lex o de la complejidad de las reglas no es importante en la determinación de velocidad, a menos que las reglas que incluyen contexto delantero requieran una cantidad significativa de pre-exploración. Qué aumenta con el número y la complejidad de reglas es el tamaño del autómata finito, y por lo tanto el tamaño del programa generado por Lex.

En el programa escrito por Lex, los fragmentos del usuario (que representan las acciones que se realizarán como cada expresión regular se encuentra) se recolectan como casos de un interruptor. El intérprete del autómata dirige el flujo del control. La oportunidad se proporciona para el usuario para insertar declaraciones o declaraciones adicionales en la rutina que contiene las acciones, o de agregar subprogramas fuera de esta rutina de la acción.

Lex no se limita a la fuente que se puede interpretar en base de un lookahead del carácter. Por ejemplo, si hay dos reglas, un ab que busca y otro para el abcdefg, y el flujo de entradas es abcdefh, Lex reconocerá el ab y se irá el indicador de la entrada momentos antes del Cd. . Tal reserva es más costosa que el proceso de idiomas más simples.

 < atras  siguiente >

Hosted by www.Geocities.ws

1