Compiladores
SISTEMAS COMPUTACIONALES
COMPILADORES
COMPILADOR LEX
En este apartado y en el siguiente se describe una herramienta particular, llamada Lex, que ha sido ampliamente usada para especificar analizadores l'xicos para una variedad de lenguajes. Se har' referencia a la herramienta como el compilador Lex, y a su especificaci'n de entrada como el lenguaje Lex. La discusi'n deuna herramienta existente nos permitir' mostrar como la especificaci'n de patrones usando expresiones regulares puede estar combinada con acciones, como por ejemplo, crear entradas en una tabla de s'mbolos, expandir marcos, o incluso generar documentaci'n autom'ticamente.
El programa Lex est' dise'ado para ser utilizado junto con el programa Yacc , es un generador de analizadores sint'cticos.Lex suele ser usado seg'n la siguiente figura.
Primero, se prepara una especificaci'n de un analizador l'xico creando un programa contenido, por ejemplo en el fichero prog.l, en lenguaje Lex. Entonces, prog.l se pasa a trav's del compilador Lex para producir un programa en C, que por defecto se denomina lex.yy.c en el sistema operativo UNIX. 'ste consiste en una representaci'n tabular de undiagrama de transici'n construido a partir de las expresiones regulares de prog.l, junto con una rutina est'ndar que usa la tabla de reconocimiento de lexemas. Las acciones asociadas con expresiones regulares en prog.l son trozos de c'digo C, y son transcritas directamente a lex.yy.c. Finalmente, lex.yy.c se pasa a trav's del compilador C para producir un programa objeto, que por defecto se llamaa.out, el cual es el analizador l'xico que transforma una entrada en una secuencia de tokens.
Un programa Lex consta de tres secciones:
%%
%%
La secci'n de declaraciones incluye declaraciones de variables, constantes y definiciones regulares. Las definiciones regulares son sentencias usadas como componentes de las expresiones regulares que aparecen en las reglas.
Las reglas de traducci'nde un programa Lex son sentencias de la forma:
p1 { acci'n1 }
p2 { acci'n2 }
... ...
pn { acci'nn }
Donde cada pi es una expresi'n regular y cada acci'n es un fragmento de programa, describiendo qu' acci'n debe realizar el analizador l'xico cuando el patr'n pi se corresponde con un lexema. En Lex, las acciones est'n escritas en C.
La tercera secci'n contiene cualesquiera procedimientosauxiliares que sean requeridos por las acciones. Alternativamente, estos procedimientos pueden ser compilados separadamente y montados junto con el analizador l'xico.
Un analizador l'xico creado por Lex funciona en concierto con un analizador sint'ctico de la siguiente manera. Cuando es activado por el analizador sint'ctico, el analizador l'xico comienza leyendo de su entrada un car'cter a la vez,hasta que encuentre el prefijo m's largo de la entrada que ha correspondido con una de las expresiones regulares pi. Entonces, ejecuta acci'ni, que t'picamente devolver' el control al parser. Pero, si no lo hace, entonces el analizador l'xico procede a buscar m's lexemas, hasta que una acci'n contenga una sentencia return o se lea el fichero completo. La b'squeda repetida de lexemas hasta unadevoluci'n expl'cita del control permite que el analizador l'xico procese los espacios en blanco y comentarios convenientemente.
El analizador l'xico devuelve un entero, que representa el token, al analizador sint'ctico. Para pasar un valor de atributo con informaci'n sobre el lexema, se puede usar una variable global llamada yylval. Esto se hace cuando se use Yacc como generador del analizadorsint'ctico.
Los analizadores l'xicos, para ciertas construcciones de lenguajes de programaci'n, necesitan ver adelantadamente m's all' del final de un lexema antes de que puedan determinar un token con certeza. En Lex, se puede escribir un patr'n de la forma r1/r2, donde r1 y r2 son expresiones regulares, que significa que una cadena se corresponde con r1, pero s'lo si est' seguida por una cadena que se...
Regístrate para leer el documento completo.