Вы находитесь на странице: 1из 6

1.

TÍTULO PRELIMINAR

Análisis de Léxico como elemento de un compilador

2. JUSTIFICACIÓN

El siguiente trabajo se realizó con el propósito de mostrar la estructura y


funcionalidad de un analizar léxico en el ámbito de la programación y como es una
gran herramienta para leer y traducir símbolos.

3. OBJETIVOS DE LA INVESTIGACIÓN

Objetivos generales
 Alcanzar a comprender lo que es un análisis léxico como preámbulo para el
análisis sintáctico y semántico de un compilador
 Ubicar las funciones principales que desarrolla el analizador de léxico en el
trabajo que hace el compilador para pasar de un lenguaje de programación de
alto nivel al lenguaje máquina el cual puede ser leído y luego interpretado por un
computador.
Objetivos específicos
 Comprender como inicia la etapa de análisis de un programa por parte del
compilador, el cual, se compone de dos partes: el análisis y la síntesis, ya que
el análisis se compone por el análisis léxico, análisis sintáctico y análisis
semántico.
 Nuestro trabajo intenta dar a conocer de una manera fácil lo que es el Análisis
Léxico el cual descompone y lee carácter por carácter la información para así
formar un significado, creando componentes léxicos para que después sea
enviado al análisis sintáctico.

4. PLANTEAMIENTO DEL PROBLEMA.

Se ha decidido desarrollar la investigación de lo que es un analizar léxico para


comprender cómo se realiza la lectura de símbolos, caracteres y cadenas de un
cierto lenguaje de programación que entra a un compilador. Debido a esto se
formula quiere dar a conocer ¿En qué medida y cómo se realizan las actividades
funcionales de un analizador léxico al recibir el lenguaje de programación como
primera fase del análisis de compilación? ¿Qué es un token y como se construyen?
(Ver la Figura # 1)
Figura # 1:
FASES DE UN
COMPILADOR

5. PLANTEAMIENTO DE LA HIPÓTESIS

Es importante conocer lo que el análisis léxico hace como primera fase de


compilación encargado de leer el código fuente y procesarlo, también es conocido
como escaneo (o scanner). Durante este proceso se realizan operaciones básicas
de manejo de cadenas de acuerdo a ciertas reglas del lenguaje, estas reglas las
conocemos en teoría computacional como expresiones regulares.
Por lo anterior queremos dar a entender y comprender lo importante y lo que
realmente hace el análisis léxico en el análisis de compilación. Durante este
investigación iremos estableciendo ordenadamente los procesos y técnicas que
hace el compilador para lleva a cabo esta fase.

6. MARCO TEÓRICO/ CONCEPTUAL/ DE REFERENCIA

Definición.
Un analizador léxico es un módulo destinado a leer caracteres del archivo de
entrada, donde se encuentra la cadena a analizar, reconocer subcadenas que
correspondan a símbolos del lenguaje y retornar los tokens correspondientes y sus
atributos.
Un analizador léxico y/o analizador lexicográfico (en inglés scanner) es la primera
fase de un compilador consistente en un programa que recibe como entrada el
código fuente de otro programa (secuencia de caracteres) y produce una salida
compuesta de tokens (componentes léxicos) o símbolos. Estos tokens sirven para
una posterior etapa del proceso de traducción, siendo la entrada para el analizador
sintáctico (en inglés parser).
La especificación de un lenguaje de programación a menudo incluye un conjunto de
reglas que definen el léxico. Estas reglas consisten comúnmente en expresiones
regulares que indican el conjunto de posibles secuencias de caracteres que definen
un token o lexema.
En algunos lenguajes de programación es necesario establecer patrones para
caracteres especiales (como el espacio en blanco) que la gramática pueda
reconocer sin que constituya un token en sí.

Funciones del analizador léxico.


Analizador léxico (scanner): lee la secuencia de caracteres del programa fuente,
caracter a caracter, y los agrupa para formar unidades con significado propio, los
componentes léxicos (tokens en inglés). Estos componentes léxicos representan:
palabras reservadas: if, while, do,… identificadores: asociados a variables, nombres
de funciones, tipos definidos por el usuario, etiquetas,... Por ejemplo: posición,
velocidad, tiempo,… operadores: = * + - / == > < & ! = . . . símbolos especiales : ( )
[ ] f g ... constantes numéricas: literales que representan valores enteros, en coma
flotante, etc., 982, 0xF678, -83.2E+2,... constantes de caracteres: literales que
representan cadenas concretas de caracteres, \hola mundo",...
El analizador léxico opera bajo petición del analizador sintáctico devolviendo un
componente léxico conforme el analizador sintáctico lo va necesitando para avanzar
en la gramática. Los componentes léxicos son los símbolos terminales de la
gramática.
Suele implementarse como una subrutina del analizador sintáctico. Cuando recibe
la orden obtén el siguiente componente léxico, el analizador léxico lee los caracteres
de entrada hasta identificar el siguiente componente léxico.

Otras funciones secundarias:


Manejo del archivo de entrada del programa fuente: abrirlo, leer sus caracteres,
cerrarlo y gestionar posibles errores de lectura.
Eliminar comentarios, espacios en blanco, tabuladores y saltos de línea (caracteres
no válidos para formar un token).
Inclusión de archivos: # include…
La expansión de macros y funciones inline: # define…
Contabilizar el número de líneas y columnas para emitir mensajes de error.
Reconocimiento y ejecución de las directivas de compilación (por ejemplo, para
depurar u optimizar el código fuente).
Ventajas de separar el análisis léxico y el análisis sintáctico:
Facilita transportabilidad del traductor (por ejemplo, si decidimos en un momento
dado cambiar las palabras reservadas begin y end de inicio y fin de bloque, por {y},
sólo hay que cambiar este módulo.
Se simplifica el diseño: el analizador es un objeto con el que se interactúa mediante
ciertos métodos. Se localiza en un único módulo la lectura física de los caracteres,
por lo que facilita tratamientos especializados de E/S.
Componentes Léxicos, Patrones, Lexemas
Patrón: es una regla que genera la secuencia de caracteres que puede representar
a un determinado componente léxico (una expresión regular).
Lexema: cadena de caracteres que concuerda con un patrón que describe un
componente léxico. Un componente léxico puede tener uno o infinitos lexemas. Por
ejemplo: palabras reservadas tienen un único lexema. Los números y los
identificadores tienen infinitos lexemas.

Los componentes léxicos se suelen definir como un tipo enumerado. Se codifican


como enteros. También se suele almacenar la cadena de caracteres que se acaba
de reconocer (el lexema), que se usará posteriormente para el análisis semántico.

typedef enum{TKN IF, TKN THEN, TKN NUM, TKN ID, TKN OPADD,...}
TokenType;
Es importante conocer el lexema (para construir la tabla de símbolos). Los
componentes léxicos se representan mediante una estructura registro con tipo de
token y lexema:
typedef struct {
TokenType token;
char *lexema; //se reserva memoria dinámicamente
} TokenRecord;
TokenRecord getToken(void);
a[indice]= 2 + 4
Búfer de entrada

Cada componente léxico va acompañado de su lexema:


<TKN_ID, a>
<TKN_CORAPER, [>
<TKN_ID, indice>
<TKN_CORCIERRE, ]>
<TKN_NUM, 2>
<TKN_OPADD, +>
<TKN_NUM, 4>
Especificación de los componentes léxicos: expresiones regulares.
Los componentes léxicos se especifican haciendo uso de expresiones regulares.
Además de las tres operaciones básicas: concatenación, repetición (*) y alternativas
(|) vamos a usar los siguientes meta símbolos:
Una o más repeticiones +
r+ indica una o más repeticiones de r
(0|1)+ = (0|1)(0|1)*
Cualquier caracter.
.*b.* indica cualquier cadena que contiene una letra b
Un rango de caracteres [ ] (clase)
[a-z] indica cualquier caracter entre la a y z minúsculas
[a-zA-Z] indica cualquier letra del abecedario minúscula o mayúscula
[0-9] indica cualquier dígito de 0 a 9
[abc] indica a|b|c
Cualquier caracter excepto un conjunto dado ~
~ (a|b) indica cualquier caracter que no sea una a ó b
Opcionalidad ?
r? indica que la expresión r puede aparecer o no. En el caso de que aparezca
sólo lo hará una vez.
Cuando queremos usar estos símbolos con su significado tenemos que usar la barra
de escape, [a\-z] significaría cualquier letra que sea a, guión o z.
Algunos ejemplos:
Números
nat = [0-9]+
signedNat = ( + j -)? nat
number = signedNat(‘‘.’’nat)? (E signedNat)?

Identificadores
letter = [a-zA-Z]
digit = [0-9]
identifier = letter (letter j digit)*
Palabras Reservadas
tkn if = ‘‘if’’
tkn while = ‘‘while’’
tkn do = ‘‘do’’
Comentarios
{ (˜ })* } comentarios en Pascal
Delimitadores
delimitadores = (newline j blank j tab j comment)+

Algunos autores:
Aho, A.V., Sethi, R., Ullman, J.D. (1990), Compiladores:
Principios, técnicas y herramientas, Tema 3, páginas: 85-158.

Louden, K.C. (1997), Compiler Construction: Principles and


Practice, Tema 2, páginas: 31-93.

7. METODOLOGÍA (Cómo se hará la investigación y con qué instrumentos


metodológicos)
Nuestro equipo organiza la realización de la investigación asignando temas. Al
frente de cada tema figura un responsable y a cada tema se asocian varios
subtemas que en su totalidad deben de coincidir con los contenidos del tema
principal.
Después de que cada responsable ha investigado sus subtemas nos reunimos para
colaborar en equipo y hacer que los contenidos de cada uno de los miembros
coincidan con el tema principal

8. AGENDA DE TRABAJO (Cuándo se realizará la investigación y en qué


distribución de tiempos)

9. ÍNDICE PRELIMINAR

1. Funciones del analizador léxico.


2. Especificación de los componentes léxicos: expresiones regulares.
3. Reconocimiento de los componentes léxicos: autómatas finitos.
4. Implementación de un analizador léxico:
a) Dirigido por tabla
b) Mediante bucles anidados.
5. Aspectos prácticos en la implementación de un análisis léxico:
a) Principio de máxima longitud.
b) Palabras reservadas versus identificadores.
c) Gestión del búfer de entrada.
6. Errores léxicos y su tratamiento.
7. Generadores automáticos de analizadores léxicos: Lex.

10. BIBLIOGRAFÍA (Qué documentos fueron explorados y apoyarán en la


realización de la investigación).

Вам также может понравиться