Sie sind auf Seite 1von 12

INSTITUTO TECNOLÓGICO DE MATEHUALA

INVESTIGACION DE ANALIZADORES LEXICOS Y GRAMATICOS


CON IMPLEMENTACION DE LEX Y YACC

Nombre: Garcia Caltzoncin Luis Eduardo


Carrera: Ingeniería en Sistemas Computacionales
Semestre: Sexto
Docente: Martha Beatriz Coronado Rosales
Periodo: Enero-Junio 2018

Matehuala, S.L.P. 05 de Marzo de 2018


Introducción

En esta investigación estamos profundizando en los analizadores léxicos y


sintácticos y como estos emplean herramientas para así poder lograr una
mejor práctica, el analizador léxico es la primera fase de un compilador junto
con el sintáctico, por eso son de fundamental importancia para así poder
compilar un programa.
Analizador léxico
Un analizador léxico 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í.

Analizador sintáctico
Un analizador sintáctico (o parser) es un programa informático que analiza una
cadena de símbolos de acuerdo a las reglas de una gramática formal. El
término proviene del latín pars, que significa parte (del discurso). Usualmente
hace parte de un compilador, en cuyo caso, transforma una entrada en un
árbol sintáctico de derivación.12

El análisis sintáctico convierte el texto de entrada en otras estructuras


(comúnmente árboles), que son más útiles para el posterior análisis y capturan
la jerarquía implícita de la entrada. Un analizador léxico crea tokens de una
secuencia de caracteres de entrada y son estos tokens los que son procesados
por el analizador sintáctico para construir la estructura de datos, por ejemplo
un árbol de análisis o árboles de sintaxis abstracta.

El análisis sintáctico también es un estado inicial del análisis de frases de


lenguaje natural. Es usado para generar diagramas de lenguajes que usan
flexión gramatical, como los idiomas romances o el latín. Los lenguajes
habitualmente reconocidos por los analizadores sintácticos son los lenguajes
libres de contexto. Cabe notar que existe una justificación formal que
establece que los lenguajes libres de contexto son aquellos reconocibles por
un autómata de pila, de modo que todo analizador sintáctico que reconozca
un lenguaje libre de contexto es equivalente en capacidad computacional a
un autómata de pila.

Los analizadores sintácticos fueron extensivamente estudiados durante los


años 1970, detectándose numerosos patrones de funcionamiento en ellos,
cosa que permitió la creación de programas generadores de analizadores
sintáticos a partir de una especificación de la sintaxis del lenguaje en forma
Backus-Naur por ejemplo, tales como yacc, GNU bison y javaCC.

¿QUÉ ES EL ANÁLISIS LÉXICO-SINTÁCTICO DE UN LENGUAJE?

El análisis léxico-sintáctico tiene por objeto reconocer la forma de las


sentencias de un lenguaje. Reconocer la forma de una sentencia implica
reconocer sus lexemas y estructuras sintácticas. El resultado del análisis léxico-
sintáctico puede ser un error de reconocimiento o una versión de la sentencia
reconocida en forma de árbol de sintaxis abstracta (asa).

Para reconocer los lexemas de un lenguaje usaremos expresiones regulares y


para reconocer estructuras sintácticas usaremos gramáticas independientes
de contexto (gramática en adelante).
Una gramática es un conjunto de reglas. Cada regla es de la forma genérica:
Lenguajes de programación
El uso más común de los analizadores sintácticos es como parte de la fase de
análisis de los compiladores. De modo que tienen que analizar el código fuente
del lenguaje. Los lenguajes de programación tienden a basarse en gramáticas
libres de contexto, debido a que se pueden escribir analizadores rápidos y
eficientes para estas.
Las gramáticas libres de contexto tienen una expresividad limitada y sólo
pueden expresar un conjunto limitado de lenguajes. Informalmente la razón de
esto es que la memoria de un lenguaje de este tipo es limitada, la gramática
no puede recordar la presencia de una construcción en una entrada
arbitrariamente larga y esto es necesario en un lenguaje en el que por ejemplo
una variable debe ser declarada antes de que pueda ser referenciada. Las
gramáticas más complejas no pueden ser analizadas de forma eficiente. Por
estas razones es común crear un analizador permisivo para una gramática libre
de contexto que acepta un superconjunto del lenguaje (acepta algunas
construcciones inválidas), después del análisis inicial las construcciones
incorrectas pueden ser filtradas.
Normalmente es fácil definir una gramática libre de contexto que acepte
todas las construcciones de un lenguaje pero por el contrario es
prácticamente imposible construir una gramática libre de contexto que
admita solo las construcciones deseadas. En cualquier caso la mayoría de
analizadores no son construidos a mano sino usando generadores
automáticos.
Herramientas para la construcción de compiladores
Herramientas para la construcción de compiladores. El uso y
perfeccionamiento de los compiladores ha traído consigo el desarrollo de
herramientas que aportan a la realización de los mismos, estas se han ido
especializando en las diferentes fases del proceso de compilación,
brindándole a los desarrolladores una serie de facilidades a la hora de diseñar
e implementar un compilador. En el mundo existen diversas herramientas de
apoyo de este tipo, desarrolladas en diferentes lenguajes de programación,
las cuales responden a los intereses de los múltiples sistemas operativos. Entre
las herramientas más utilizadas se pueden encontrar el Flex, Yacc, Lex, Bison
entre otras.

Herramienta Descripción

Bison Generador de Analizadores Sintácticos Ascendentes tipo YACC

Generador de Analizadores Léxicos y Sintácticos Descendentes


COCO/R
Recursivos

Flex Generador de Analizadores Léxicos tipo Lex

Lex Generador de Analizadores Léxicos

SDGLL1 Sistema Detector de Gramáticas LL(1)

TS 2006 Tipo abstracto de datos Tabla de Símbolos de uso sencillo (beta0.4)

TS Tipo abstracto de datos Tabla de Símbolos

TS-OO Tipo abstracto de datos Tabla de Símbolos


YACC Generador de Analizadores Sintácticos Ascendentes LR(1)

Bison
Es un generador de analizadores sintácticos de propósito general que
convierte una descripción gramatical para una gramática independiente del
contexto en un programa en C que analice esa gramática. Es utilizado en un
amplio rango de analizadores de lenguajes, desde aquellos usados en simples
calculadoras de escritorio hasta complejos lenguajes de programación.

Lex
Es un generador de analizador léxico, que sirve para generar los token para la
siguiente fase . La principal característica de Lex es que va a permitir asociar
acciones descritas en C, a la localización de las Expresiones Regulares que se
hayan definido. Para e llo Lex se apoya en una plantilla que recibe como
parámetro, y que se debe diseñar con cuidado. Internamente Lex va a actuar
como un autómata que localizará las expresiones regulares que se le
describan, y una vez reconocida la cadena representada por dicha expresión
regular, ejecutará el código asociado a esa regla.

Yacc
Es un programa para generar analizadores sintácticos. Las siglas del nombre
significan Yet Another Compiler Compiler, es decir, "Otro generador de
compiladores más". Genera un analizador sintáctico (la parte de un
compilador que comprueba que la estructura del código fuente se ajusta a la
especificación sintáctica del lenguaje) basado en una gramática
analítica.Yacc genera el código para el analizador sintáctico en el Lenguaje
de programación C.

Flex
Es una herramienta para generar escáneres: programas que reconocen
patrones léxicos en un texto. Flex lee los ficheros de entrada dados, o la
entrada estándar si no se le ha indicado ningún nombre de fichero, con la
descripción de un escáner a generar. Estas herramientas de apoyo han sido
reescritas para otros lenguajes, incluyendo Ratfor, EFL, ML,Ada, Java, Python, y
Limbo. De esta forma se ha logrado una mayor utilización de las mismas en
diferentes compiladores desarrollados sobre tecnologías libres. Teniendo en
cuenta las características de las aplicaciones antes mencionadas, se ha
escogido para la realización del compilador las herramientas Yacc y Lex. En
muchos de los compiladores desarrollados en el mundo suelen ser utilizados
juntos. Yacc utiliza una gramática formal para analizar un flujo de entradas,
algo que Lex no puede hacer con expresiones regulares simples (Lex se limita
a los autómatas de estados finitos simples). Sin embargo, Yacc no puede leer
en un flujo de entradas simple, requiere una serie de símbolos. Lex se utiliza a
menudo para proporcionar a Yacc estos símbolos.

INTRODUCCIÓN A LOS GENERADORES LEX Y YACC


Un generador de analizadores es un programa que acepta como entrada la
especificación de las características de un lenguaje L y produce como salida.

un analizador para L. La especificación de entrada puede referirse a la


lexicografía, la sintaxis o la semántica; el analizador resultante servirá para
analizar las características especificadas.
 E Especificación de las características del lenguaje L
 A Analizador para L
Los generadores Lex y Yacc sirven, respectivamente, para generar
analizadores lexicográficos y analizadores sintácticos para su
aprovechamiento como partes de los compiladores de los lenguajes de
programación; estos usos de Lex y Yacc no son los únicos, aunque sí son los
que aquí se consideran principalmente.
Para entender cabalmente el funcionamiento de los generadores de
analizadores, hay que conocer la teoría de compiladores relacionada con las
tareas de análisis de lenguajes.
Cuando se emplea el término Lex, se mencionan dos posibles significados:

a) una notación para especificar las características lexicográficas de un lenguaje


de programación
b) un traductor de especificaciones lexicográficas.

Esta misma dualidad también es de aplicación al término Yacc.


Esquema de uso
El esquema de la página siguiente ilustra la manera de usar los generadores
Lex y Yacc para obtener un analizador léxico-sintáctico de un lenguaje de
programación L, y de ejecutar el analizador obtenido. Los nombres que
aparecen en el esquema significan:

ELEXIC.L
Es la especificación de las características lexicográficas del lenguaje L, escrita en Lex

ESINT.Y
Es la especificación de las características sintácticas del lenguaje L, escrita en Yacc.

LEX.YY.C
Es el analizador lexicográfico de L generado por Lex; está constituido, en su parte
principal, por una función escrita en C que realiza las tareas de análisis lexicográfico
basándose en autómatas regulares reconocedores de la forma de las piezas
sintácticas de L
LIBL
Es una librería asociada a Lex que contiene estructuras de datos y funciones a las que
se puede hacer referencia desde el código generado

LIBY
Es una librería asociada a Yacc con la misma utilidad que la anterior

Y.TAB.C
Es el analizador sintáctico generado por Yacc; está constituido, en su parte principal,
por una función escrita en C que realiza las tareas de análisis sintáctico según el
método ascendente LALR (1), basado en tablas

ANLESI
Es el analizador generado; analiza las características lexicográficas y sintácticas
especificadas del lenguaje L; acepta como entrada un programa escrito en L y
comprueba si está codificado según las especificaciones dadas
Programa escrito en el lenguaje L
Conclusión
En conclusión, me queda que es importante la unión de estas herramientas
para la elaboración de analizadores léxicos y sintácticos ya que con esto se
emplea mas a fondo la compilación de los programas, pero también primero
tenemos que tener en cuenta como se esta manejando y bajo que lenguaje
porque esto influye notoriamente en los analizadores.
Bibliografía
http://dc.exa.unrc.edu.ar/staff/fbavera/papers/TesisJTLex-Bavera-Nordio-
02.pdf
http://www.lsi.us.es/docencia/get.php?id=7469
https://www.ecured.cu/Herramientas_para_la_construcci%C3%B3n_de_comp
iladores
file:///C:/Users/luis_/Downloads/245437519-Investigacion-Lex-y-Yacc.pdf
https://es.wikipedia.org/wiki/Analizador_l%C3%A9xico
https://es.wikipedia.org/wiki/Analizador_sint%C3%A1ctico#Lenguajes_de_pro
gramaci%C3%B3n

Das könnte Ihnen auch gefallen