Software">
Nothing Special   »   [go: up one dir, main page]

Analizador Lexico Investigacion

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

Act. 6: Investigación.

Analizadores Léxicos.
En Lenguaje de programación.

INSTITUTO TECNOLOGICO SUPERIOR DE IRAPUATO


ING. SISTEMAS COMPUTACIONALES

TOLENTINO HERNANDEZ SUSANA PAOLA


IS18111634

AUTOMATAS 1– ISCC27B
UNIDAD 4
DOCENTE: JUAN CARLOS GONZALEZ CORDOBA

IRAPUATO, GTO.
16 DE MARZO DEL 2022
INTRODUCCION.

En este documento se plasmará la información obtenida de la investigación


realizada previamente acerca del uso de analizadores léxicos en lenguajes de
programació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. Escribir analizadores léxicos eficientes “a mano” puede resultar una tarea
tediosa y complicada, para evitarla se han creado herramientas de software – los
generadores de analizadores léxicos – que generan automáticamente un analizador
léxico a partir de una especificación provista por el usuario.

Puede asegurarse que la herramienta del tipo mencionado más conocida es Lex
[Lev92]. Lex es un generador de analizadores léxicos, originalmente incluido dentro
del ambiente de desarrollo de UNIX usando a C como lenguaje huésped y
posteriormente migrado a casi todas las plataformas y lenguajes. Otra herramienta
que últimamente ha tenido gran difusión es JLex – que usa a Java como lenguaje
huésped y corresponde al compilador de compiladores Cup – [App98][Ber97];
mientras que algunos compiladores de compiladores actuales como Javacc
[Javacc] y Eli [Com98] integran la especificación del análisis léxico sin brindar un
módulo específico.

Todas estas herramientas para generar analizadores léxicos permiten definir la


sintaxis de los símbolos mediante expresiones regulares, mientras que sus atributos
deben ser computados luego del reconocimiento de una subcadena que constituya
un símbolo del lenguaje. Una alternativa sería contar con una herramienta que
permita computar los atributos a medida que se reconocen dichas subcadenas
aprovechando el mecanismo de cómputo garantizado por el analizador léxico. De
esta manera se libra al usuario del control sobre la cadena a computar.

Las técnicas utilizadas para construir analizadores léxicos también se pueden


aplicar a otras áreas, como, por ejemplo, a lenguajes de consulta y sistemas de
recuperación de información. En cada aplicación, el problema de fondo es la
especificación y diseño de programas que ejecuten las acciones activadas por
patrones dentro de las cadenas.

Existe una gran variedad de generadores de analizadores léxicos. Quizás la


herramienta más conocida es Lex, un generador de analizadores léxicos para el
sistema operativo UNIX basada en expresiones regulares que genera código C.
Estas herramientas generan automáticamente analizadores léxicos, por lo general
a partir de una especificación basada en expresiones regulares. La organización
básica del analizador léxico resultante es en realidad un autómata finito. Es por esto,
que en este capítulo se introduce el concepto de expresiones regulares como así
también otros conceptos básicos como los Autómatas Finitos. Por último, se
encuentran los algoritmos que permiten construir autómatas finitos determinístico
(AFD) a partir de expresiones regulares (ER) entre otros.
CONTENIDO: USO DE ANALIZADORES LEXICOS EN LENGUAJES DE
PROGRAMACION.

El análisis léxico es una técnica que se encuentra basada en un conjunto de reglas


que relacionan un conjunto de partes para formar un CPU. Un analizador léxico es
la primera fase de un compilador consiste en un programa que recibe el código
fuente de otro programa y produce una salida compuesta en tokens o símbolos.
Estos tokens sirven para una posterior etapa del proceso de traducción, siendo la
entrada del analizador sintáctico.

Un lenguaje de programación incluye un conjunto de reglas que definen léxico, las


cuales consisten en expresiones regulares que indican el conjunto de posibles
secuencias de carácter que definen un token o lexema.

Algunas aplicaciones de los analizadores léxicos son:

❖ El analizador léxico divide la entrada en componentes léxicos.


❖ Los componentes se agrupan en categorías léxicas.
❖ Asociamos atributos a las categorías léxicas.
❖ Especificamos las categorías mediante expresiones regulares.
❖ Para reconocer los lenguajes asociados a las expresiones regulares
empleamos autómatas de estados finitos (AFD).

❖ se pueden crear los AFD directamente a partir de la expresión regular.


❖ El analizador léxico utiliza la maquina discriminadora determinista.
❖ El tratamiento de errores en nivel léxico es muy simple.
❖ Se pueden emplear las ideas de los analizadores léxicos para facilitar el
tratamiento de ficheros de texto.

Se han desarrollado algunas herramientas para construir analizadores léxicos a


partir de notaciones de propósito especial basadas en expresiones regulares. Ya se
ha estudiado el uso de expresiones regulares en la especificación de patrones de
componentes léxicos. Antes de considerar los algoritmos para compilar expresiones
regulares en programas de concordancia de patrones, se da un ejemplo de una
herramienta que pueda ser utilizada por dicho algoritmo.

En esta sección se describe una herramienta concreta, llamada LEX, muy utilizada
en la especificación de analizadores léxicos para varios lenguajes. Esa herramienta
se denomina compilador LEX, y la especificación de su entrada, lenguaje LEX. El
estudio de una herramienta existente permitirá mostrar cómo., utilizando
expresiones regulares, se puede combinar la especificación de patrones con
acciones, por ejemplo, haciendo entradas en una tabla de símbolos, cuya ejecución
se pueda pedir a un analizador léxico. Se pueden utilizar las especificaciones tipo
LEX, aunque no se disponga de un compilador LEX.
Por lo general, se utiliza el LEX de la forma representada en la figura. Primero, se
prepara una especificación del analizador léxico creando un programa lex.l en
lenguaje LEX. Después lex.l se pasa por el compilador LEX para producir el
programa en C lex.yy.c. El programa lex.yy.c consta de una representación tabular
de un diagrama de transiciones construido a partir de las expresiones regulares de
lex.l. junto con una rutina estándar que utiliza la tabla para reconocer lexemas. Las
acciones asociadas a las expresiones regulares de lex son partes de código en C y
se transfieren directamente a lex.yy.c. Por último, lex.yy.e se ejecuta en el
compilador de C para producir un programa objeto a. out. Que es el analizador léxico
que transforma un archivo de entrada en una secuencia de componentes léxicos.

Especificaciones en LEX
Un programa en LEX consta de tres partes:

1. Declaraciones
2. Reglas de traducción
3. Funciones auxiliares

La sección de declaraciones incluye declaraciones de variables, constantes


manifiestas y definiciones regulares. (Una constante manifiesta es un identificador
que se declara para representar una constante)

Las definiciones regulares se utilizan como componentes de las expresiones


regulares que aparecen en las reglas de traducción.

Las reglas de traducción de un programa en LEX son proposiciones de la forma

P1 {acción1}

P2 {acción2}

……

Pn {acción}
donde pi es una expresión regular y cada acción es un fragmento de programa que
describe cuál ha de ser la acción del analizador léxico cuando el patrón
p1 concuerda con un lexema. En LEX, las acciones se escriben en C, en general,
sin embargo, pueden estar en cualquier lenguaje de implantación.

La tercera sección contiene todos los procedimientos auxiliares que puedan


necesitar las acciones. A veces, estos procedimientos se pueden compilar por
separado y cargar con el analizador léxico.

Un analizador léxico creado por LEX se comporta en sincronía con un analizador


sintáctico como sigue. Cuando es activado por el analizador sintáctico, el analizador
léxico comienza a leer su entrada restante, un carácter a La vez, hasta que
encuentre el mayor prefijo de la entrada que concuerde con una de las expresiones
regulares p1. Entonces, ejecuta la acción1, Generalmente, acción1 devolverá el
control al analizador sintáctico. Sin embargo, si no lo hace, el analizador léxico se
dispone a encontrar más lexemas, basta que una acción hace que el control regrese
al analizador sintáctico. La búsqueda repetida de lexemas hasta encontrar una
instrucción return explícita permite al analizador léxico procesar espacios en blanco
y comentarios de manera apropiada.

El analizador léxico devuelve una única cantidad, el componente léxico, al


analizador sintáctico. Para pasar un valor de atributo con la información del lexema,
se puede asignar una variable global llamada yylval.

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
corresponde con r2. La expresión regular r2, después del operador lookahead "/",
indica el contexto derecho para una correspondencia; se usa únicamente para
restringir una correspondencia, no para ser parte de la correspondencia.
Recuperación de errores lexicográficos: Los programas pueden contener diversos
tipos de errores, que pueden ser:

Errores lexicográficos: Que veremos a continuación.


Errores sintácticos: Por ejemplo, una expresión aritmética con mayor número
de paréntesis de apertura que de cierre.
Errores semánticos: Por ejemplo, la aplicación de un operador a un tipo de
datos incompatible con el mismo.
Errores lógicos: Por ejemplo, un bucle sin final.

Cuando se detecta un error, un compilador puede detenerse en ese punto e informar


al usuario, o bien desechar una serie de caracteres del texto fuente y continuar con
el análisis, dando al final una lista completa de todos los errores detectados. En
ciertas ocasiones es incluso posible que el compilador corrija el error, haciendo una
interpretación coherente de los caracteres leídos. En estos casos, el compilador
emite una advertencia, indicando la suposición que ha tomado, y continúa el
proceso sin afectar a las sucesivas fases de compilación.

Los errores lexicográficos se producen cuando el analizador no es capaz de generar


un token tras leer una determinada secuencia de caracteres. En general, puede
decirse que los errores lexicográficos son a los lenguajes de programación lo que
las faltas de ortografía a los lenguajes naturales. Las siguientes situaciones
producen con frecuencia la aparición de errores lexicográficos:

1. Lectura de un carácter que no pertenece al vocabulario terminal previsto para


el autómata. Lo más normal en este caso es que el autómata ignoré estos
caracteres extraños y continué el proceso normalmente. Por ejemplo, pueden
dar error en la fase de análisis lexicográfico la inclusión de caracteres de
control de la impresora en el programa fuente para facilitar su listado.
2. Omisión de un carácter. Por ejemplo, si se ha escrito ELS en lugar de ELSE.
3. Se ha introducido un nuevo carácter. Por ejemplo, si escribimos ELSSE en
lugar de ELSE.
4. Han sido permutados dos caracteres en el token analizado. Por ejemplo, si
escribiéramos ESLE en lugar de ELSE.
5. Un carácter ha sido cambiado. Por ejemplo, si se escribiera ELZE en vez de
ELSE.

Las técnicas de recuperación de errores lexicográficos se basan, en general, en la


obtención de los distintos sinónimos de una determinada cadena que hemos
detectado como errónea. Por otra parte, el analizador sintáctico es capaz en muchos
casos de avisar al analizador lexicográfico de cuál es el token que espera que éste
lea.

Para el ejemplo de borrado de un carácter, tenemos que los sinónimos de ELSE


son ELS, ELE, ESE, y LSE. Por tanto, si incluimos en nuestro analizador una rutina
de recuperación de errores debidos a omisión de caracteres, cualquiera de estos
sinónimos sería aceptado en lugar del lexema ELSE, se emitiría la correspondiente
advertencia, y el proceso continuaría asumiendo que se ha leído el token
<pal_res_ELSE>.

Análogamente, podemos incluir rutinas para los demás casos. Por ejemplo, si el
analizador lee el lexema ESLE, y no puede construir un token correcto para él
mismo, procedería a generar los sinónimos por intercambio de caracteres (es decir,
SELE, ELSE o ESEL) y comprobaría si alguno de ellos es reconocible. En caso
afirmativo, genera el token correspondiente y advierte al usuario del posible error y
de su interpretación automática, continuando con el proceso.

Todos los procedimientos para la recuperación de errores lexicográficos son en la


práctica métodos específicos, y muy dependientes del lenguaje que se pretende
compilar.
EJEMPLO

Dicho analizador es capaz de recibir una secuencia de caracteres y producir una


salida compuesta de tokens (componentes léxicos).

Los tokens reconocidos por el analizador son los siguientes:

Números: 0 1 2 3 4 5 6 7 8 9

Variables: A B C D E F G H I J K L M N Ñ O P Q R S T U V W X Y Z

Operadores: + - * /

Delimitadores: ( )

Generador Lex

Es un programa para generar analizadores léxicos (en inglés scanners o lexers), se


utiliza comúnmente con el programa yacc que se utiliza para generar análisis
sintáctico, escrito originalmente por Eric Schmidt y Mike Lesk, es el analizador léxico
estándar en los sistemas Unix, y se incluye en el estándar de POSIX. Lex toma
como entrada una especificación de analizador léxico y devuelve como salida el
código fuente implementando el analizador léxico en C. Aunque tradicionalmente se
trata de software propietario, existen versiones libres de lex basadas en el código
original de AT&T en sistemas como OpenSolaris y Plan 9 de los laboratorios Bell.
Otra versión popular de software libre de lex es Flex.

Generador Flex

Es una herramienta para la generación de programas que realizan concordancia de


patrones en texto, es una herramienta para generar escáneres. programas que
reconocen patrones léxicos en un texto, es una reescritura de la herramienta LEX
del Unix de AT&T (aunque las dos implementaciones no comparten ningún código),
con algunas extensiones e incompatibilidades, de las que ambas conciernen a
aquellos que desean escribir analizadores aceptables por cualquier
implementación. Flex lee los archivos de entrada dados, o la entrada estándar si no
se le ha indicado ningún nombre de archivo, con la descripción de un escáner a
generar. La descripción se encuentra en forma de parejas de expresiones regulares
y código C, denominadas reglas.

Generador JTLex

JTLex en cambio permite expresar conjuntamente sintaxis y semántica al estilo de


los esquemas de traducción. A su vez el proceso de cómputo de atributos es
implementado por JTLex por un autómata finito traductor con las ventajas de
eficiencia que esto supone. Una especificación JTLex permite no sólo asociar un
procedimiento, o acción, a cada expresión regular, sino también a cada ocurrencia
de un símbolo dentro de la expresión.

Aplicaciones

Se pueden emplear para muchos programas “convencionales”. Los ejemplos más


claros son aquellos programas que tienen algún tipo de entrada de texto donde hay
un formato razonablemente libre en cuantos espacios y comentarios. En estos
casos es bastante engorroso controlar donde empieza y termina cada componente
y es fácil liarse con los punteros a char. Este simplifica notablemente la interfaz y si
se dispone de un generador automático, el problema se resuelve en pocas líneas
de código.

CONCLUSION.

Como conclusión los analizadores léxicos son una aplicación de los compiladores
que se encargan de verificar que el texto este escrito en un formato aceptado para
todo el programa que está escrito en un lenguaje de programación al igual que se
encarga de verificar que tenga congruencia, los analizadores léxicos sirven en gran
parte para resolver problemas que pueden surgir a causa de que el programa no
tenga congruencia o no este bien estructurado.

BIBLIOGRAFIAS.

➢ Bellas, F. G., Unanue, R. M., & Fernández, V. D. F. (2016). Lenguajes de


programación y procesadores. Editorial Centro de Estudios Ramon Areces
SA.
➢ http://cidecame.uaeh.edu.mx/lcc/mapa/PROYECTO/libro32/27_herramienta
s_para_la_especificacin_de_analizadores_lxicos.html
➢ https://jazieljosuecelis.wordpress.com/2015/05/25/aplicaciones-de-un-
analizador-lexico/
➢ https://lenguajesyautomatas1998.blogspot.com/2019/04/unidad-4-4.html
➢ Jurado Málaga, E. (2008). Teoría de autómatas y lenguajes formales.
Universidad de Extremadura. Servicio de Publicaciones.
➢ Kelley, D., & Platas, M. L. D. (1995). Teoría de autómatas y lenguajes
formales (Vol. 22). Prentice Hall.
➢ Ostenero, F. L., & Serrano, A. M. G. (2014). Teoría de los lenguajes de
programación. Editorial Universitaria Ramon Areces.
➢ Vázquez, J. C., Constable, L., Jornet, W., & Meloni, B. (2015). Enseñanzas
de la Implementación de un Analizador Léxico.

También podría gustarte