Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Analisis Lexico

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 12

“ENSAYO”

“ANÁLISIS LÉXICO”

LENGUAJES Y AUTOMATAS I

INGENIERÍA EN SISTEMAS COMPUTACIONALES

PRESENTA:
OSWALDO ZÚÑIAG HERNÁNDEZ

DOCENTE: JOSÉ ODISEO LÓPEZ


CALDERÓN

JIQUILPAN, MICHOACÁN, MARZO DE 2024


ÍNDICE
Introducción___________________________________________________________ 3
Análisis Léxico ________________________________________________________ 4
Funciones de un analizador léxico__________________________________________ 5
Definiciones básicas ____________________________________________________ 5
Reconocimiento de identificadores _________________________________________7
Implementación de un análisis léxico _______________________________________ 8
Errores léxicos _________________________________________________________ 9
Estrategia de recuperación de errores________________________________________ 9
Conclusión____________________________________________________________10
Bibliografía ___________________________________________________________10
INTRODUCCIÓN
En este tema se hablara antes que todo acerca del compilador ya que a base de este elemento
surgen los analizadores Se conocerán los tipos de análisis léxicos y sintácticos tales como
las funcionalidades que tienen cada uno de ellos, sus errores tanto léxicos y sintácticos se
hablaran la importancia que se tiene uno con otro ya que va derivado, uno necesita del otro
para poder tomar el correcto funcionamiento del programa Se hablara de los componentes
que tienen y los lenguajes de programación. Así como por ejemplo El lenguaje c++, java c#.
En los Generadores Existen varios para cada análisis léxico conocido como scanner y el
sintáctico (parse)ya que surge el ahorro de esfuerzo para los generadores Automáticos ya que
estos. Generadores solo necesitan conocer la especificación de tokens a reconocer.
Un lenguaje de programación, alguna expresión, comando o sentencia es el medio por el cual
el hombre interactúa con una computadora. Pero el lenguaje de programación no entra
directamente a ser ejecutado, es decir, necesita de otro componente importante para
completar este tipo de entrada que se le ha propiciado, y es en este punto donde surge el tema
de los analizadores. Los analizadores son parte importante dentro de un compilador: Un
compilador es un programa que lee un código escrito en un lenguaje (alto nivel, código
fuente) y lo traduce a un programa equivalente en otro lenguaje (lenguaje objeto)” Como
parte importante de este proceso de traducción, el compilador informa así al usuario de la
presencia de errores en el programa fuente.

Análisis léxico
La fase de rastreo (scanner), tiene las funciones de leer el programa fuente como un archivo
de caracteres y dividirlo en tokens. Los tokens son las palabras reservadas de un lenguaje,
secuencia de caracteres que representa una unidad de información en el programa fuente. En
cada caso un token representa un cierto patrón de caracteres que el analizador léxico
reconoce, o ajusta desde el inicio de los caracteres de entrada. De tal manera es necesario
generar un mecanismo computacional que nos permita identificar el patrón de transición entre
los caracteres de entrada, generando tokens, que posteriormente serán clasificados. Este
mecanismo es posible crearlo a partir de un tipo especifico de máquina de estados llamado
autómata finito.
Es la primera fase de un compilador. Su principal función consiste en leer la secuencia de
caracteres del programa fuente, carácter a carácter, y elaborar como salida la secuencia de
componentes léxicos que utiliza el analizador sintáctico. El analizador sintáctico emite la
orden al analizador léxico para que agrupe los caracteres y forme unidades con significado
propio llamados componentes léxicos (tokens). Los 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: () [] {}.
• 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.

FUNCIÓN DEL ANALIZADOR LÉXICO


• Manejo de apertura y cierre de archivo, lectura de caracteres y gestión de posibles
errores de apertura.
• Eliminar comentarios, espacios en blanco, tabuladores y saltos de línea.
• Inclusión de archivos y macros.
• La expansión de macros y funciones inline: # define.
• Contabilizar 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
Una de las ventajas de separar el análisis léxico y análisis sintáctico es que facilita la
transportabilidad del traductor si se decide realizar cambios posteriores, por ejemplo, cambiar
las etiquetas begin-end por llaves de apertura y cierre {}.
DEFINICIONES BASICAS Componentes léxicos, patrones y lexemas
En la fase de análisis, los términos componentes léxicos (token), patrón y lexema se emplean
con significados específicos. Un analizador léxico, inicialmente lee los lexemas y le asigna
un significado propio.

• Componente léxico es la secuencia lógica y coherente de caracteres relativo a una


categoría: identificador, palabra reservada, literales (cadena/numérica), operador o
carácter de puntuación, además de que un componente léxico puede tener uno o varios
lexemas.
• Patrón es una regla que genera la secuencia de caracteres que puede representar a un
determinado componente léxico (expresión regular).
• Lexema es una cadena de caracteres que concuerda con un patrón que describe un
componente léxico (valor de cadena).
Ejemplo de una cadena de código: const pi = 3.1416;

El analizador léxico recoge información sobre los componentes léxicos en sus atributos
asociados. Los tokens influyen en las decisiones del análisis sintáctico, y los atributos, en la
traducción de los tokens. En la práctica los componentes léxicos suelen tener solo un atributo.
Para efectos de diagnóstico, puede considerarse tanto el lexema para un identificador como
el número de línea en el que se encontró por primera vez. Esta información puede ser
almacenada en la tabla de símbolos para el identificador (estructura de datos).
Para la cadena E=M*C**2 de ejemplo, los componentes léxicos y los valores de atributo
asociado son:
Tome en cuenta que ciertas parejas no necesitan un valor de atributo. Los atributos
relacionados con ese token deberán ser conservados y transferidos a alguna estructura de
datos para que sean empleados en las siguientes etapas del análisis
Manejo de Buffer de entrada
Existen algunos aspectos de eficiencia relacionados con el manejo de buffer. Primero se
menciona un esquema de doble buffer de entrada que resulta útil como pre-análisis de la
entrada para identificar los componentes léxicos. El segundo esquema introduce algunas
técnicas útiles para aumentar la eficiencia del analizador léxico, empleando “centinelas”.
Hay veces en que el analizador léxico necesita analizar previamente varios caracteres, además
del lexema para un patrón, antes de poder anunciar una concordancia. Se pueden emplear
muchos esquemas de manejos de buffer, pero, aquí tan solo se señalarán algunos principios
básicos.
Parejas de buffer – Se utiliza un buffer dividido en dos mitades de N (1024 o 512) caracteres
cada una, Se leen N caracteres de entrada en cada mitad del buffer con un orden de lectura
del sistema, en vez de invocar una instrucción de lectura para cada carácter de entrada. Si
quedan menos de N caracteres en la entrada, entonces se lee un carácter especial eof en el
buffer después de los caracteres de entrada. Es decir, eof marca el final del archivo fuente y
es distinto a cualquier carácter de la entrada.

Se mantienen dos apuntadores en el buffer de entrada. La cadena de caracteres entre los dos
apuntadores es el lexema en curso. Al principio, los dos apuntadores apuntan al primer
carácter del próximo lexema que hay que encontrar. Uno de ellos, apuntador delantero,
examina hacia adelante hasta encontrar una concordancia con un patrón. Una vez
determinado el siguiente lexema, el apuntador delantero se coloca en el carácter de su
extremo derecho. Después de haber procesado el lexema, ambos apuntadores se colocan en
el carácter situado inmediatamente después del lexema. Con este esquema se pueden
considerar los comentarios y los espacios en blanco como patrones que no producen
componentes léxicos.
Centinela – Corrigiendo la deficiencia del método anterior para reducir la necesidad de dos
pruebas para cada avance del apuntador delantero. Se amplia cada mitad del buffer para
admitir un carácter centinela al final. De esta manera se vuelve más eficiente el proceso de
cargar del buffer, realizando una carga en cada mitad.

El manejo de buffer es una labor puramente de programación y se recomienda realizarla de


la manera que resulte más sencilla, no es necesario apegarse a alguno de los dos métodos
antes mencionados.
Especificaciones de componentes léxicos
Las expresiones regulares son una notación importante para especificar patrones. Cada patrón
concuerda con una serie de cadenas que, de modo que las expresiones regulares servirán
como nombres para conjuntos de cadenas. El término alfabeto denota cualquier conjunto
finito de símbolos, por ejemplo, el alfabeto binario {0, 1}. Una cadena es una secuencia de
finita de símbolos de un alfabeto y un lenguaje se refiere a conjunto de cadenas de un alfabeto
fijo.
Reconocimiento de componentes léxico
Un reconocedor de lenguajes es un programa que toma como entrada una cadena x e indica
si dicha cadena pertenece a una frase del programa. Se compila una expresión regular en un
reconocedor construyendo un diagrama de transiciones generalizado llamado autómata finito.
Un autómata finito puede ser determinista o no determinista, dependiendo del número de
transiciones para un mismo símbolo de entrada. Tanto los autómatas finitos deterministas
como los no deterministas pueden reconocer con precisión a los conjuntos regulares. Por
tanto, ambos pueden reconocer con precisión lo que denotan las expresiones regulares.
RECONOCIMIENTO DE IDENTIFICADORES
Un identificador está formado por al menos una letra mayúscula o minúscula (ejemplo: a)
seguida de forma opcional por más letras o números (ej: aa, a1, etc).
La forma de representar mediante expresiones regulares cualquier letra mayúscula o
minúscula es: [a-z][A-Z] y le denominamos letra. La forma de representar un número
cualquiera es [0-9] y le denominamos número. Para finalizar se define como [otro] cualquier
otro símbolo, indicando que ya ha terminado de definirse el identificador. Esto lo
representamos mediante un diagrama de transiciones de la siguiente manera:

Empezamos en el estado inicial q0, y estamos leyendo un fichero con código fuente donde
tenemos escrito a2 = b + 5. Empezamos reconociendo una letra, con lo que pasamos del
estado q0, al estado q1 (hemos reconocido a, de la variable a2). Leemos el siguiente carácter,
con lo que entra el 2, y nos quedamos en el mismo estado que ya estábamos q1 (ya hemos
reconocido a2) que todavía no es un estado final. Leemos el espacio en blanco o bien el signo
=, si el analizador elimina los espacios en blanco, por tanto, el siguiente carácter es distinto
de una letra o un número, con lo que saltamos al estado q2, que este si es un estado final, y
ya se ha reconocido a2, pasándose el identificador al analizador sintáctico, que nada más
recibirlo solicitará otro token al analizador léxico.
IMPLEMENTACIÓN DE UN ANALIZADOR LÉXICO

❖ Utilizando un generador de analizadores léxicos


Son herramientas que a partir de las expresiones regulares generan un programa que permite
reconocer los tokens o componentes léxicos. Estos programas suelen estar escritos en C,
donde una de las herramientas es FLEX, o pueden estar escritos en Java, donde las
herramientas pueden ser JFLEX o JLEX.
Ventajas: Comodidad y rapidez de desarrollo.
Inconvenientes: Estos programas son ineficientes y dificultad de mantenimiento del código
generado.

❖ Utilizando un lenguaje de alto nivel


A partir del diagrama de transiciones y del pseudocódigo correspondiente se programa el
analizador léxico.
Ventajas: Eficiente y compacto (lo que facilita el mantenimiento).
Inconvenientes: Hay que realizar todo a mano.

❖ Utilizando un lenguaje de bajo nivel (ensamblador) Ventajas:

Más eficiente y compacto.


Inconvenientes: Más difícil de desarrollar.

ERRORES LÉXICOS
Son detectados, cuando durante el proceso de reconocimiento de caracteres,
los símbolos que tenemos en la entrada no concuerdan con ningún patrón. Hay
que tener en cuenta que hay pocos errores detectables por el analizador léxico
Nombres incorrectos de los identificadores
Se debe a que se utilizan caracteres inválidos para ese patrón, como por
ejemplo un paréntesis, o se empieza por un número.
Números incorrectos
Debido a que está escrito con caracteres inválidos (puntos en lugar de comas) o
no está escrito correctamente.
Palabras reservadas escritas incorrectamente
Se producen errores de ortografía. El problema aquí es cómo distingues
entre un identificador y una variable reservada. Caracteres que no
pertenecen al alfabeto del lenguaje
Ejemplos: @, €, ¿, ?, ñ, etc.
ESTRATEGIA DE RECUPERACIÓN DE ERRORES
Modo pánico
Consiste en borrar de forma sucesiva caracteres de la entrada hasta que el
analizador léxico es capaz de encontrar un token bien formado.
¿Cuál sería el proceso para tratar el error?
 Anotar el error y el estado.
 Recuperarse. Tenemos varias alternativas: Ignorar, borrar,
insertar, remplazar o conmutar.
 Seguir.
Intentar transformaciones
La mayoría de los analizadores que implementan esta estrategia la aplican
cuando se corrige el lexema con una sola transformación. Ejemplo -25, j
• Eliminamos los dos últimos caracteres quedándonos con -25,
quedándonos en un estado de aceptación.
• Devolvemos a la entrada. j
• Nos posicionamos en el estado inicial.
• En la siguiente lectura tendremos otro error teniendo que descartar la
coma, volviendo al estado inicial
• En la siguiente lectura se reconoce el identificador j.
CONCLUSIÓN
El analizador léxico es la forma en como un programa puede revisar o analizar
un código fuente de otro programa con el fin de que este le de salida por medio
de símbolos. Estos símbolos están compuestos por definiciones básicas que hay
dentro de un analizador léxico, que serían las definiciones: Token: Que es la
agrupación de caracteres que identifica el analizador que se componen por
símbolos. Lexema: Es la secuencia de caracteres ya agrupados que tienen
en común con un token. Patrón: Es como se describe o se da el nombre de los
tipos de lexema. De igual forma observamos mediante un ejemplo de cómo
funciona un analizador léxico y como se construye gracias a una expresión
regular del autómata finito que lo soporta. Con esta información se ha conocido
como se diseña un analizador léxico mediante tablas o diagrama de
transacciones, que representan los estados por los que pasa el analizador a
reconocer un token. Se ha observado 3 formas en las que se puede reconocer un
identificador que serían: generador de analizadores léxicos, lenguaje de alto
nivel y lenguaje de bajo nivel. Los errores léxicos se pueden detectar ya que con
esto nos ayudaría a eliminar errores o minimizar el problema que se tendrá en
el compilador.
BIBLIOGRAFIAS
http://informatica.uv.es/docencia/iiguia/asignatu/2000/PL/2008/tema2.pdf
http://www.cc.uah.es/ie/docencia/ProcesadoresDeLenguaje/ProcesadoresDeLenguajeTema
2_1xpagina.pdf
https://pdfcoffee.com/ensayo-analisis-lexicodocx-5-pdf-free.html/
http://www.uco.es/users/ma1fegan/2019-2020/pl-grado/temas/Tema-2-lexico.pdf
https://www.studocu.com/es-ar/document/instituto-tecnologico-de-cancun/ingenieria-ensistemas-
computacionales/resumen-de-analisis-lexico-automatas/14242612

También podría gustarte