Está en la página 1de 11

Ingeniería en Sistemas de

Información y Ciencias de la Computación


Boca Del Monte
Plan Sábado

Tema: Tarea No. 1 - Herramientas para Compiladores

Materia: Compiladores
Nombre: Luis Estuardo Patzán López
Carnet: 7690-20-370
Sección: A
Introducción

En este trabajo explicaremos la definición de un compilador y de las herramientas que los


compiladores usan para llevar a cabo esa conversión, también veremos unos ejemplos para el mejor
entendimiento del tema, como pequeña introducción, explicaremos que es un compilador.

Un traductor de idiomas es un programa que traduce programas escritos en una fuente lenguaje a
un programa equivalente en un lenguaje objeto. El idioma de origen suele ser un lenguaje de
programación de alto nivel y el lenguaje objeto suele ser el lenguaje máquina de una computadora
real. Desde el punto de vista pragmático, el traductor define la semántica del lenguaje de
programación, transforma operaciones especificadas por la sintaxis en operaciones del modelo
computacional para alguna maquina real o virtual
Objetivos

Nuestro objetivo con esta investigación es enseñar y aprender de como que es y como funciona un
compilador, que tipo de herramientas se usan con los mismos y dar unos pequeños ejemplos, con
las IDE’s, Netbeans, Eclipse e IntelliJ Idea, para el mejor entendimiento, lo haremos de una manera
resumida, extrayendo lo mas importante de dicho tema.
• ANTLR

ANTLR (Otra herramienta para el reconocimiento de idiomas) es un potente generador de


analizadores para leer, procesar, ejecutar o traducir texto estructurado o archivos binarios. Es
ampliamente utilizado para construir lenguajes, herramientas y marcos. A partir de una gramática,
ANTLR genera un analizador que puede construir y analizar árboles.

Características principales:

Es capaz de generar un analizador léxico, sintáctico o semánticoen varios lenguajes, a partir de


unosficheros escritos en un lenguaje propio.Dicho lenguaje es básicamente unaserie de reglas de
gramática y unconjunto de construcciones auxiliares.

Uso de esta herramienta para compiladores:

Herramienta de generación de compiladores, es multiplataforma por estar desarrollado en Java, y


es multilenguaje por tener la capacidad de generar código para la mayoría de lenguajes orientados
a objetos populares actualmente, incluyendo, pero no limitándose a Java, C#, C++, Python, Ruby,
Javascript, entre otros. Su método de análisis se basa en el LL(k) por lo que soporta el uso de
atributos heredados. Otra característica es la facilidad para generar AST, es decir representaciones
intermedias que permiten crear compiladores o intérpretes de más de una pasada. y la integración
con StringTemplates para transformaciones complejas.

JAVACC

Características principales:

JavaCC es un generador de léxico y analizador para gramáticas LL(k). Usted especifica la descripción
léxica y sintáctica de un idioma en un archivo JJ, luego ejecuta javacc en el archivo JJ. Un breve
ejemplo a continuación en C++
Para el análisis léxico, JavaCC permite otras
secciones además de TOKENy SKIP. También hay
formas de crear tokens "privados" y escribir
expresiones regulares complejas.
Uso de esta herramienta para compiladores:

Es una herramienta para generar programas


escritos en lenguaje Java; acepta como entrada
una especificación de un determinado lenguaje y
produce como salida un analizador para ese
lenguaje. En la manera más simple de
funcionamiento, la especificación proporcionada
define las características sintácticas y lexicográficas
de un lenguaje y se genera un analizador léxico
sintáctico del lenguaje especificado; pero también
es posible completar una especificación léxico-
sintáctica con la inclusión adecuada de código para que el programa generado llegue a ser un
analizador completo del lenguaje

• LEX & YACC

Características principales:

Mediante el uso de las herramientas lex y yacc, puede crear un motor de análisis que procese el
texto de acuerdo con reglas específicas. Luego puede incorporarlo a sus aplicaciones para todo,
desde el análisis de configuración hasta la creación de su propio lenguaje de programación.

Lex es una herramienta de análisis léxico que se puede utilizar para identificar cadenas de texto
específicas de forma estructurada a partir del texto de origen. Yacc es un analizador de
gramática; lee texto y se puede utilizar para convertir una secuencia de palabras en un formato
estructurado para su procesamiento.

Uso de esta herramienta para compiladores:

Lex: Esta herramienta es un componente estándar en la mayoría de los sistemas operativos UNIX.
La herramienta GNU flex proporciona la misma
funcionalidad.

Yacc: Esta herramienta es estándar en la mayoría de


los sistemas operativos UNIX. La herramienta GNU
bison proporciona la misma funcionalidad.

C++ Ejemplo!
• BISON & FLEX (Fast Lexical Analyzer Generator)

Características principales:

Lex y Flex son herramientas para generar escáneres: programas que reconocen patrones léxicos
en el texto. Flex es una versión más rápida de Lex. En este capítulo
Lex/Flex se refiere a cualquiera de las herramientas. El apéndice sobre Lex/Flex es un
condensación de la página del manual “flexdoc” de Vern Paxon.

Lex and Flex are tools for generating scanners: programs which recognize lexical patterns in text.
Flex is a faster version of Lex. In this chapter
Lex/Flex refers to either of the tools. The appendix on Lex/Flex is a
condensation of the manual page “flexdoc” by Vern Paxon

Bison para analizar un idioma, el idioma debe ser descrito por una gramática libre de contexto.

El sistema formal más común para presentar tales


reglas para que los humanos lean es Backus-Naur Form o "BNF", que fue desarrollado
para especificar el lenguaje Algol 60. Cualquier gramática expresada en BNF es una
gramática libre de contexto. La entrada a Yacc/Bison es esencialmente legible por máquina
BNF.

En resumen, esto significa que debe ser posible decir cómo


para analizar cualquier parte de una cadena de entrada con solo un token de anticipación.
Estrictamente hablando, esa es una descripción de una gramática LR(1), y LALR(1)
implica restricciones adicionales que son difíciles de explicar de forma sencilla; pero es raro en
práctica real para encontrar una gramática LR(1) que no sea LALR(1)

Uso de esta herramienta para compiladores:

Flex versus Bison Flex reconoce expresiones regulares, y Bison reconoce gramáticas. Flex divide
el programa fuente en tokens y Bison agrupa esos tokens. Es habitual utilizar Flex y Bison
conjuntamente para desarrollar un compilador. Con Flex se construye el analizador léxico
(morfológico).

Con Bison se desarrolla el analizador sintáctico. Bison construye, a partir de la gramática


especificada por el usuario, un analizador sintáctico que reconoce entradas sintácticamente
correctas para dicha gramática
Flex construye la función yylex() de análisis morfológico a partir del fichero de
especificación correspondiente. La función yylex() lee el fichero de entrada e identifica los
tokens.

Bison construye la función yyparse() de análisis sintáctico a partir del fichero de


especificación correspondiente. La función yyparse() solicita a la función yylex() los tokens
de la entrada y comprueba si forman una construcción válida de acuerdo a las reglas de la
gramática descritas en el fichero de especificación.

Cada vez que la función yylex() devuelve un token al analizador sintáctico, si el token tiene
un valor asociado, éste se guarda en la variable yylval antes de terminar. Por ejemplo, un
identificador de una variable, además de tener un número de token que lo identifica y
distingue de otros tipos de tokens, también tiene asociado como valor o atributo, el lexema
del identificador. Sin embargo, un paréntesis no tiene asociado ningún valor o atributo.

Posteriormente se estudiará cómo la función yyparse() utiliza los valores asociados a los
tokens y cómo definir el tipo de la variable yylval (por defecto es de tipo int)

esta sección contiene sentencias C y funciones adicionales. También podemos compilar estas
funciones por separado y cargarlas con el analizador léxico.
• JFLEX

Características principales:

JFlex es un generador de analizador léxico (también conocido como


generador de escáner) para Java, escrito en Java.

Un generador de analizador léxico toma como entrada una


especificación con un conjunto de expresiones regulares y acciones
correspondientes. Genera un programa (un lexer ) que lee la
entrada, compara la entrada con las expresiones regulares en el
archivo de especificaciones y ejecuta la acción correspondiente si
coincide una expresión regular. Los Lexers suelen ser el primer
paso inicial en los compiladores, ya que combinan palabras clave,
comentarios, operadores, etc., y generan un flujo de token de
entrada para los analizadores. Los Lexers también se pueden
utilizar para muchos otros fines.

Uso de esta herramienta para compiladores:

JFlex lexers se basan en autómatas finitos deterministas (DFA). Son rápidos, sin costosos
retrocesos.

JFlex está diseñado para funcionar junto con el generador de analizadores sintácticos LALR CUP de
Scott Hudson y la modificación de Java de Berkeley Yacc BYacc/J de Bob Jamison. También se
puede usar junto con otros generadores de analizadores como ANTLR o como una herramienta
independiente

Forma de utilizar estas herramientas en los siguientes IDE's de desarrollo (por medio
de plugins o similar)

Netbeans
ATNLR: descargar la herramienta ANTLR y luego elegir un objetivo de tiempo de ejecución a
continuación
JAVACC: Se puede descargar el zip o con con API
LEX AND YACC: Descargando e instalando el complemento
BISON AND FLEX: Con dependencia, codigo o instalada directamente al descargarla
JAVACC: Se puede descargar el zip o con con API
JFLEX: Descargando e instalando el paquete.

Eclipse
ATNLR: org.eclipse.ui/ SHOW_PROGRESS_ON_STARTUP = verdadero
JAVACC: Descargando e instalando el complemento
LEX AND YACC: Descargando e instalando el complemento
BISON AND FLEX: Con dependencia, codigo o instalada directamente al descargarla
JAVACC: Se puede descargar el zip o con con API
JFLEX: Descargandolo desde eclipseMarketplace.

IntelliJ Idea
ATNLR: Java en su archivo pom.xml . La última versión es 4.11.1:<dependencia>
<groupId>org.antlr</groupId> <artifactId>antlr4</artifactId>
<versión>4.11.1</versión></dependencia>
JAVACC: Descargando e instalando el complemento
LEX AND YACC: Descargando e instalando el complemento
BISON AND FLEX: Con dependencia, codigo o instalada directamente al descargarla
JAVACC: Se puede descargar el zip o con con API
JFLEX: Se puede descargar el plugin, el ID es com.github.oowekyala.jflex
Conclusiones

Este trabajo será muy útil a la hora de crear un compilador, ya que detalla cada una de las partes
que lo involucran. Creo que es muy útil a la hora de crear un algoritmo o un programa. La función
de un compilador es leer un programa escrito en un idioma, en este caso el idioma fuente, y
traducirlo a un programa equivalente en otro idioma, el idioma objeto. Por otro lado, entendí que
un compilador requiere de una sintaxis y lenguajes específicos, ya que al igual que el lenguaje
humano, si no lo escribimos correctamente, el compilador no hará lo que queremos. Y que en la
compilación hay dos partes: Análisis y Síntesis. La parte de análisis descompone el programa fuente
en sus elementos componentes y crea una representación intermedia. Aprendí que las herramientas
que muestran tipos de análisis de programas fuente son muy útiles al crear un programa al codificar
un algoritmo, ya que estas herramientas nos ayudan formateando texto, corrigiendo errores,
haciendo sugerencias; para que los programadores seamos más eficientes a la hora de crear una
aplicación.

Recomendaciones

El lenguaje de programación C está definido de tal forma que hay numerosas decisiones que el
compilador adopta de forma automática ante la ausencia de información. En otras palabras, el
compilador toma decisiones sobre cómo traducir el código que el programador no ha escrito en el
código. Esto, en ciertas situaciones, es cómodo, pues hace que los programas puedan ser escritos
más rápido, pero sólo programadores con experiencia suelen aprovechar esta característica. Lo más
recomendable es utilizar una opción en el compilador para que notifique aquellos casos en los que
está tomando decisiones implícitas. En el compilador gcc esta opción es -Wall.

Compilar siempre con la opción -Wall y no considerar el programa correcto hasta que no se hayan
eliminado todas las advertencias.

E-grafía

https://karinav2.wordpress.com/2011/02/02/antlr/

https://docplayer.es/35000888-Javacc-parte-i-1-compiladores-guia-vii-ciclo-facultad-ingenieria-
escuela-computacion-asignatura-compiladores.html

http://arantxa.ii.uam.es/~mdlcruz/docencia/compiladores/2007_2008/construccion_calculadora_
07_08.pdf

http://dlsiisv.fi.upm.es/traductores/Software/Flex-Bison.pdf

También podría gustarte