1. CIS-IXB-001
UNIVERSIDAD
NACIONAL
DE LOJA
´Area de la Energ´ıa las Industrias y los Recursos Naturales No Renovables
Carrera de Ingenier´ıa en Sistemas
”ANALIZADOR LEXICO
ESTRUCTURA ARCHIVO JFLEX”
Tarea 1
Noveno B
Autor:
• Raul-Gomez
Docente: Ing. Henry-Paz,
Tarea de C. Por Raul-Gomez is licensed Under a Creative Commons
Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License.
Fecha: December 15, 2014
LOJA ECUADOR
1
2. 1 Analizador L´exico
Se encarga de buscar los componentes l´exicos o palabras que componen el programa
fuente, seg´un unas reglas o patrones. La entrada del analizador l´exico podemos definirla
como una secuencia de caracteres.
Figure 1: Estructura Lexica
• gram´atica (N, T, P, S)
• N S´ımbolos no terminales.
• T S´ımbolos terminales
• P Reglas de producci´on
• S Axioma inicial
El analizador l´exico tiene que dividir la secuencia de caracteres en palabras con
significado propio y despu´es convertirlo a una secuencia de terminales desde el punto de
vista del analizador sint´actico, que es la entrada del analizador sint´actico. El analizador
l´exico reconoce las palabras en funci´on de una gram´atica regular de manera que sus NO
TERMINALES se convierten en los elementos de entrada de fases posteriores. En LEX,
por ejemplo, esta gram´atica se expresa mediante expresiones regulares.
1.1 Funci´on del analizador l´exico.
El analizador l´exico es la primera fase de un compilador. Su principal funci´on consiste
en leer los caracteres de entrada y elaborar como salida una secuencia de componentes
l´exicos que utiliza el analizador sint´actico para hacer el an´alisis. Esta interacci´on, suele
aplicarse convirtiendo al analizador l´exico en una subrutina o corrutina del analizador
sint´actico. Recibida la orden “Dame el siguiente componente l´exico”del analizador
sint´actico, el analizador l´exico lee los caracteres de entrada hasta que pueda identificar
el siguiente componente l´exico.
• Eliminar los comentarios del programa.
• Eliminar espacios en blanco, tabuladores, retorno de carro, etc, y en general, todo
aquello que carezca de significado seg´un la sintaxis del lenguaje.
2
3. Figure 2: Interacci´on de un analizador l´exico con el analizador sint´actico
• Reconocer los identificadores de usuario, n´umeros, palabras reservadas del lenguaje,
..., y tratarlos correctamente con respecto a la tabla de s´ımbolos (solo en los casos
que debe de tratar con la tabla de s´ımbolos).
• Llevar la cuenta del n´umero de l´ınea por la que va leyendo, por si se produce alg´un
error, dar informaci´on sobre donde se ha producido.
• Avisar de errores l´exicos. Por ejemplo, si @ no pertenece al lenguaje, avisar de un
error.
• Puede hacer funciones de preprocesador.
Adem´as el analizador l´exico es responsable de:
• Manejo de apertura y cierre de archivo, lectura de caracteres y gesti´on de posibles
errores de apertura.
• Eliminar comentarios, espacios en blanco, tabuladores y saltos de l´ınea.
• Inclusi´on de archivos y macros.
• Contabilizar n´umero de l´ıneas y columnas para emitir mensajes de error.
1.2 Componentes L´exicos, Patrones y Lexemas
El analizador lexicogr´afico puede tener la siguiente estructura:
Figure 3: Interacci´on de componentes
3
4. Donde cada acci´on es un fragmento de programa que describe cual ha de ser la acci´on
del analizador l´exico cuando la secuencia de entrada coincida con la expresi´on regular.
En la fase de an´alisis, los t´erminos componentes l´exicos (token), patr´on y lexema se
emplean con significados espec´ıficos. Un analizador l´exico, inicialmente lee los lexemas y
le asigna un significado propio.
Componente l´exico es la secuencia l´ogica y coherente de caracteres relativo a una
categor´ıa: identificador, palabra reservada, literales (cadena/num´erica), operador o
car´acter de puntuaci´on, adem´as de que un componente l´exico puede tener uno o varios
lexemas.
Patr´ones una regla que genera la secuencia de caracteres que puede representar a un
determinado componente l´exico (expresi´on regular).
Lexema es una cadena de caracteres que concuerda con un patr´on que describe un
componente l´exico (valor de cadena). Ejemplo de una cadena de c´odigo: const pi =
3.1416;
Ej: 8, 23, 50 ( son lexemas que encajan con el patr´on ( 0 — 1 — 2 — ... — 9) + ).
Una vez detectado que un grupo de caracteres coincide con un patr´on, se ha detectado
un lexema. A continuaci´on se le asocia un n´umero, que se le pasar´a al sint´actico, y, si es
necesario, informaci´on adicional, como puede ser una entrada en la tabla de s´ımbolos.
La tabla de s´ımbolos suelen ser listas encadenadas de registros con parte variable: listas
ordenadas, ´arboles binarios de b´usqueda, tablas hash, etc.
Lexemas Componente l´exico Patr´on
const const const
= relaci´on ¡ o ¡= o = o ¡¿ o ¿ o ¿=
Pi identificador letra seguida de letras o n´umeros
3.1416 n´umero cualquier literal num´erica
“hola mundo” literal caracteres entre comillas
<identificador, atributo para el s´ımbolo E>
<op_asignacion>
<identificador, atributo para el s´ımbolo M>
<op_multiplica>
<identificador, apuntador al s´ımbolo C>
<op_exponente>
<numero, atributo valor 2>
1.3 Analizador Sint´actico
Este analizador se encarga de formar componentes sint´acticos del lenguaje fuente. En
definitiva, nos permitir´a saber si un texto concreto pertenece al conjunto de posibles
textos de un lenguaje. Para implementar un analizador sint´actico necesitamos una
gram´atica que nos proporcione la especificaci´on sint´actica del lenguaje fuente. Una
gram´atica est´a formado por una serie de reglas. Cada regla tiene una parte izquierda y
una parte derecha. Si se reconoce la parte derecha de una regla, se puede sustituir todo
por la parte izquierda de la misma regla. Las reglas est´an formadas por dos tipos de
s´ımbolos:
4
5. • No terminales: tambi´en llamados variables y que se expanden en partes derechas de
otras reglas.
• Terminales: son tokens de la especificaci´on l´exica. Ejemplo: queremos especificar la
sintaxis de operaciones aritm´eticas de n´umeros enteros. Las operaciones en cuesti´on
son la suma y la resta. Una primera aproximaci´on podr´ıa ser: E E + E E E – E
E nint Los tokens son: +: el signo m´as (suma) -: el signo menos (resta) nint: un
n´umero entero, cuya expresi´on regular ser´ıa [0-9]* Sin embargo, esta gram´atica no
es v´alida ya que es ambigua. La ambiguedad es un problema bastante importante
ya que implica que puede haber m´as de un ´arbol de derivaci´on para encontrar
una misma cadena. No se pueden implementar analizadores mediante gram´aticas
ambiguas, ya que aparecer´ıan conflictos. Veamos dos ´arboles de derivaci´on con la
primera gram´atica para formar la expresi´on 1+1:
Figure 4: Comprobacion de un analizador sintaxico
La ambiguedad es bastante dif´ıcil de detectar. Para ello se definen una serie de
subconjuntos de gram´aticas, y a la hora de dise˜nar el analizador podemos detectar
dicha ambiguedad. En nuestro caso interesa usar las gram´aticas SLR a partir de las
cuales se pueden implementar analizadores sint´acticos ascendentes. La gram´atica
anterior en SLR ser´ıa: E E + T E E - T E T T nint
1.4 Analisis Sem´antico
Sem´antica: conjunto de reglas que especifican el significado de cualquier sentencia
sint´acticamente correcta y escrita en un determinado lenguaje. El an´alisis sem´antico,
a diferencia de otras fases, no se realiza claramente diferenciado del resto de las tareas
del compilador. Fase en la que se obtiene informaci´on necesaria para la compilaci´on
tras conocer la estructura sint´actica del programa. Completa las fases de an´alisis
l´exico y sint´actico incorporando comprobaciones que no pueden asimilarse al mero
reconocimiento de una cadena dentro de un lenguaje.
Errores sem´anticos de un programa: Conversiones de tipos no permitidas
int x;
x = 4.32;
Error: Ej1.java [6:1] possible loss of precision
{ Variables usadas y no definidas
5
6. { Operandos de tipos no compatibles
if (x || 5) x = 0;
Error: Ej2.java [7:1] operator || cannot be applied to int,int
El an´alisis sem´antico se divide en dos categor´ıas:
– An´alisis de la exactitud del programa para garantizar una ejecuci´on adecuada.
– Algunos lenguajes (Lisp, Smalltallk) pueden no tener an´alisis est´atico.
– Por ejemplo, ADA es un lenguaje con fuertes restricciones para que un pro-
grama sea ejecutable.
– An´alisis para mejorar la eficiencia (optimizaci´on del programa traducido)
2 Jflex
Lex es un programa para generar analizadores l´exicos (en ingl´es scanners o lexers).
Lex se utiliza com´unmente con el programa yacc que se utiliza para generar an´alisis
sint´actico. Lex, escrito originalmente por Eric Schmidt y Mike Lesk, es el analizador
l´exico est´andar en los sistemas Unix, y se incluye en el est´andar de POSIX. Lex
toma como entrada una especificaci´on de analizador l´exico y devuelve como salida
el c´odigo fuente implementando el analizador l´exico en C.
Aunque tradicionalmente se trata de software propietario, existen versiones libres
de lex basadas en el c´odigo original de ATT en sistemas como OpenSolaris y Plan
9 de los laboratorios Bell. Otra versi´on popular de software libre de lex es Flex.
2.1 Estructura de un archivo de lex
La estructura de un archivo de lex es intencionadamente similar a la de un archivo
del yacc; los archivos se dividen en tres secciones, separadas por l´ıneas que contienen
solamente dos s´ımbolos
"%", como sigue:
Secci´on de declaraciones
%%
Secci´on de reglas
%%
Secci´on de c´odigo en C
Lo siguiente es un ejemplo de archivo lex para la versi´on Flex de lex. Reconoce
cadenas de n´umeros (n´umeros enteros) en la entrada, y simplemente los imprime en
la salida.
6
7. /*** Secci´on de declaraciones ***/
%{
/* C´odigo en C que ser´a copiado */
#include <stdio.h>
%}
/* Esto indica a Flex que lea s´olo un fichero de entrada */
%option noyywrap
%%
/*** Secci´on de reglas ***/
/* [0-9]+ identifica una cadena de uno o m´as d´ıgitos */
[0-9]+ {
/* yytext es una cadena que contiene el texto coincidente. */
printf("Encontrado un entero: %sn", yytext);
}
. { /* Ignora todos los dem´as caracteres. */ }
%%
/*** Secci´on de c´odigo en C ***/
int main(void)
{
/* Ejecuta el ’’lexer’’, y despu´es termina. */
yylex();
return 0;
}
Si se da esta entrada a flex, ser´a convertida en un archivo de C, lex.yy.c. Esto se
puede compilar en un ejecutable que encuentre y haga salir cadenas de n´umeros
enteros. Por ejemplo, dando la entrada:
abc123z.!&*2ghj6
el programa imprimir´a:
Encontrado un entero: 123
Encontrado un entero: 2
Encontrado un entero: 6
7
8. 3 BIBLIOGRAFIA
References
[1] Juan Marcos Sacrist´an Donoso “Desarrollo de compiladores”. 2008. Ensenanza
informatica.Disponible en: http://megazar.tripod.com/compil.pdf
[2] Alfred V. Aho,Ravi Sethi,Jeffrey D. Ullman “Compiladores: principios,
t´ecnicas y herramientas”. 1998. (impreso en mexico) 53519 Naucalpan de
Juares, Edo. Mexico. Disponible en: https://books.google.com.ec/books?
id=yG6qJBAnE9UC&pg=PA86&lpg=PA86&dq=compiladores+lexico&source=
bl&ots=rsWPT13_jQ&sig=4xTPyW6bjHW0UvLJNCDs6Vo5cco&hl=es&sa=X&ei=
UVePVLW8CIueNsCjg7gD&ved=0CFkQ6AEwCQ#v=onepage&q=compiladores%
20lexico&f=false
[3] Jeffrey D. Ullaman . ”Traductores, Compiladores e Interpretes. ”. 2012. De-
partamento de Lenguajes y Automatas. Universidad de Sevilla. Disponible en:
https://www.lsi.us.es/docs/doctorado/memorias/TESINA-Roche.pdf
[4] Louden, K.C (2010)Construccion de Compiladores”. Disponible en:
http://centrodeartigo.com/articulos-noticias-consejos/article_
126048.html
8