Está en la página 1de 17

Compilador LEX y lenguaje LEX

Stalin Zurita Quinto Segundo


Semestre Marzo - Agosto 2012

LEX es un constructor de analizadores lxicos.

Parte de un conjunto de reglas lxicas (expresiones regulares) y produce un programa (yylex) que reconoce las cadenas que cumplen dichas reglas.
Cada vez que LEX encuentra un lexema que viene definido por una expresin regular, se ejecutan las acciones (escritas en C) que van al lado de la definicin de dicha expresin. Opera mediante una descripcin de la gramtica hecha mediante expresiones regulares.

Lex es una herramienta que se ha utilizado para generar un programa en lenguaje C, que sirve como analizador lxico, y esto para una variedad de lenguajes. Normalmente se le llama compilador Lex a la herramienta, y lenguaje Lex a sus especificaciones de entrada. Por ejemplo: Existe un equivalente en lenguaje Ada: aflex. La herramienta Lex genera un programa C que sirve como analizador lxico; aflex genera tambin un analizador lxico, pero en lenguaje Ada. Genera los diagramas de transicin de estados en cdigo C, C ++, o Java generalmente.

Ops [] Clases de Caracteres

Ejemplo [a-z]

Explicacin Alternancia de caracteres en el rango indicado, en este caso a|b|c|...|z. Ms de un rango se puede especificar, como por ejemplo: [0-9A-Za-z] para caracteres alfanumricos. Si su primer carcter es un "^", entonces coincidir con cualquier carcter fuera de la clase. Indica repeticin 0 o ms veces de lo que le precede.

* e* Cerradura de Kleen + e+ Cerradura positiva . .+ {} a{3,6}

Indica repeticin 1 o ms veces de lo que le precede.

Representacin de cualquier carcter, excepto el final de lnea Indica un rango de repeticin cuando contiene dos nmeros separados por comas, como en el ejemplo, la cadena aceptada ser aquella con longitud 3, 4, 5 o 6 formada por el carcter 'a'. Indica una repeticin fija cuando contiene un solo numero, por ejemplo, a{5}, aceptara cualquier cadena formada por 5 a's sucesivas.

Repeticin especificada

Indica que el patrn que lo antecede es opcional, es decir, puede existir o no. En el ejemplo, el patrn coincide con todos los nmeros enteros, positivos o negativos por igual, ya que el opcionalidad signo es opcional. | (-|+|~)?[0-9]+ Este hace coincidir, al patrn que lo precede o lo antecede y puede usarse consecutivamente. En el ejemplo tenemos un Union patrn que coincidir con un entero positivo, negativo o con signo de complemento. "" "bye" Las cadenas encerradas entre " y " son aceptadas literalmente, es decir tal como aparecen dentro de las comillas, para incluir Comillas caracteres de control o no imprimibles, pueden usarse dentro dobles de ellas secuencias de escape de C. \ \. Indica a lex que el carcter a continuacin ser tomado literalmente, como una secuencia de escape. Secuencia de Escape <<EOF>> [a-z] Solo en flex, este patrn coincide con el fin de archivo.

-?[0-9]+

Un programa Lex consta de tres secciones:

<declaraciones> %% <reglas de traduccin> %% <procedimientos auxiliares>

Secciones de un programa LEX

Las secciones de Declaraciones y la de Procedimientos de

Usuario son opcionales, mientras que la de Reglas es obligatoria (aunque se encuentre vaca), con lo que tenemos que la plantilla ms pequea que podemos definir es:
%% 1) Seccin

de Declaraciones: Ejemplo: Inclusin de ficheros, declaracin de variables, funciones, etc. Cualquier cosa entre %{ %} se copia a la salida

Las definiciones son definiciones regulares que toman la forma: nombre expresin_regular

2) Seccin de reglas de traduccin: Las reglas van en dos columnas Columna izquierda: ER. Definicin de los patrones a buscar. Columna derecha: acciones. Partes de programa que se ejecutarn si se encuentra una cadena que cumpla el patrn de la izquierda.

Las reglas de traduccin se describen de la forma: patrn {accin} Patrn es una expresin regular; Accin es un trozo de cdigo

3) Seccin de procedimientos auxiliares Contiene las funciones que pueden ser llamadas por las acciones de la seccin de reglas. Alternativamente, estos procedimientos pueden ser compilados separadamente y montados junto con el analizador lxico. Algunas consideraciones: Cualquier cdigo C que se desea insertar va comprendido entre %{ y%} Si se verifican dos patrones, se elige la regla que aparece primero (colocar las palabras reservadas antes que los identificadores).

Como hemos ido reflejando en algunos ejemplos, Lex incorpora algunas variables, funciones, procedimientos y macros que nos permiten realizar de una forma ms sencilla todo el procesamiento.
Como variables, las ms utilizadas son:

Como mtodos (funciones y procedimientos), tenemos:

Como macros y directivas caractersticos, existen:

Primero se prepara una especificacin de la gramtica en lenguaje Lex. (lex.l)

Posteriormente, se pasa por el 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 representacin tabular de un diagrama de transicin construido a partir de las expresiones regulares de lex.l.

Finalmente, lex.yy.c se pasa a travs del compilador C para producir un programa objeto, que por defecto se llama a.out, el cual es el analizador lxico que transforma una entrada en una secuencia de tokens.

Creacin de un analizador lxico con LEX

Reconoce cadenas de nmeros (nmeros enteros) en la entrada, y simplemente los imprime en la salida.

Por ejemplo, dando la entrada: abc123z.!&*2ghj6 El programa imprimir: Encontrado un entero: 123 Encontrado un entero: 2 Encontrado un entero: 6

También podría gustarte