Está en la página 1de 90

Fases del

compilador
INTEGRANTES:

CRISTIAN IVAN HUERTA ROJAS

EL TUTORIAL SIGUE SIENDO EL MISMO,


CLARO
ALGUNAS
COSAS
PUEDEN
CAMBIAR, VEAMOS EL TUTORIAL:
ANTES
DE
EMPEZAR
NECESITAMOS
DESCARGAR EL JAVA DEVELOPMENT KIT O
MEJOR CONOCIDO COMO ELJAVA
JDK DESDE LA PGINA DE JAVA O MEJOR
DICHO DE LA PGINA DE SUN.
DESCARGAR
KIT

JDK JAVA DEVELOPMENT

Una vez descargado dicho archivo, le damos doble clic para


que empiece la instalacin del mismo. Y nos aparecer una
pantalla como esta:

Leemos el contrato
de Usuario Final, y le
damos
Clic
en Accept >

Si queremos cambiar la capeta de


instalacin le podemos dar clic
en Change e instalarla donde
quiera, Yo la dej en la ruta por
default. Y despus le damos Next.

Empezar la instalacin del Java JDK y


tendremos que esperar unos minutos,
dependiendo del rendimiento de tu
equipo de computo.

Al terminar la instalacin del Java JDK,


nos pedir la carpeta de destino
donde se tiene que instalar el JRE de
Java, este es importante instalarlo,
para que se ejecuten los programas
hecho en Java. Yo dej la ruta por
default. Damos Clic en Next >.

Empezar la instalacin de Java JRE y


depender del funcionamiento de
nuestro equipo, cuanto dure esta
instalacin, por lo general dura unos
pocos minutos.

Una vez que haya terminado la


instalacin del Java JRE, le daremos
clic en Finish y terminar la instalacin
de Java JDK y Java JRE.

Todava aqu no termina esto, si no que hay que configurar las


variables de entorno para que podamos compilar desde la
Consola de Comandos de Windows 7.
Damos Clic Derecho a Mi PC y nos vamos a Propiedades. Y nos
aparecer una ventana donde aparece la informacin de
nuestro sistema, Damos clic en Configuracin Avanzada del
Sistema, que se encuentra a la izquierda. Y nos debe de
aparecer una ventana como esta:

Nos vamos a la pestaa de Opciones


Avanzadas y damos clic en Variables
de Entorno

Buscamos en las Variables del sistema,


la variable llamada Path y le damos
clic en Editar

Se abrir una nueva ventana y le agregamos


esto: ;C:\Program Files\VERSION DE TU JAVA\binsi es que
dejamos la ruta por default del instalador, si lo metiste en
otra carpeta, debers poner la direccin donde se
encuentra instalado el JDK. Y damos Clic en Aceptar.

Despus ahi mismo en Variables del Sistema, crearemos una


nueva variable llamada Classpath y tendr la direccin de
nuestro src.zip en este caso sera esta: ;C:\Program
Files\Java\VERSION DE TU JAVA\src.zip y le damos clic
en Aceptar.
Le damos Clic en Aceptar en Variables de Entorno y en la
Ventana de Opciones Avanzadas.

Ahora nos iremos a la Consola de


Comandos de Windows 7, o al famoso
CMD, una vez abierto escribimos javac
y deber mostrar este contenido.

Y si se muestra esto, qued


instalado el Java JDK en
nuestro sistema de Windows
7, y podemos crear los
programas y compilarlos desde
la consola de comandos. O lo
que es mejor, instalar un IDE
como Netbeans o JCreator. En
lo personal uso el Netbeans.

NetBeans, que
encontraremos en
www.netbeans.org

Si hacemos clic en "Download", se nos llevar a la pgina de descargas,


en la que tenemos varias versiones para elegir. Lo razonable "para un
novato" es descargar la versin para "Java SE" (las alternativas son otros
lenguajes, como PHP o C++, versiones profesionales como Java EE Enterprise Edition-, o una versin que engloba todas estas posibilidades).
Es fcil que tambin podamos escoger el Espaol como idioma, en vez
del ingls.

La instalacin no ser posible si no hemos instalado Java


antes, pero si lo hemos hecho, debera ser simple y
razonablemente rpida:

Y al final quiz se nos pregunte si queremos permitir que se


recopile estadsticas sobre nuestro uso:

Todo listo. Tendremos un nuevo programa en nuestro men


de Inicio. Podemos hacer doble clic para comprobar que
se ha instalado correctamente, y debera aparecer la
pantalla de carga:

Y despus de un instante, la pantalla "normal" de


NetBeans:

Ya estaramos listos para empezar a crear


nuestro primer programa en Java, pero eso
queda para la siguiente leccin...

Qu es un compilador?
Un compilador es un pequeo programa informtico, que se
encarga de traducir (compilar) el cdigo fuente de cualquier
aplicacin que se est desarrollando. En pocas palabras, es
un software que se encarga de traducir el programa hecho en
lenguaje de programacin, a un lenguaje de mquina que pueda
ser comprendido por el equipo y pueda ser procesado o ejecutado
por este.
Un concepto un poco ms elaborado es el siguiente: Un compilador
es un programa que convierte o traduce el cdigo fuente de un
programa hecho en lenguaje de alto nivel, a un lenguaje de bajo
nivel (lenguaje de mquina).

Estructura de un compilador

Anlisis sintctico
Comprueba los valores unitarios del
programa (tokens):
Palabras reservadas(do, while, if, )
Palabras no especificas(identificadores,
constantes)
Formados por tipo y lexema

Anlisis Sintctico

Recibe los tokens del analizador lxico


y comprueba que estn ordenados
conforme a la gramtica

Anlisis Semntico
Comprueba la validez del programa
Comprobacin de tipos en
operadores

Generacin de cdigo intermedio

Codifica el lenguaje fuente en un


lenguaje intermedio entre el lenguaje
objeto
Permite la separacin entre front-end y
back-end
Utilizacin de cdigo de 3 direcciones
(A=B+C)
Instrucciones condicionales y saltos

Optimizacin de cdigo intermedio


Permite realizar mejoras en el cdigo
intermedio
Eliminacin de saltos consecutivos
Factorizaciones
Eliminar cdigo intil
Optimizacin de bucles

Generacin de cdigo objeto


Generar una secuencia de instrucciones
en cdigo ensamblador o mquina a
partir del cdigo intermedio
A=B+C
LOAD B
ADD C
STORE A

Tabla de smbolos
Tabla donde se registran los
identificadores, constantes, funciones
y otros objetos especificados en el
programa fuente
El compilador desarrolla funciones
comunes de acceso a ella

Manejo de errores
Mensajes de error que el compilador emite cuando
encuentra una inconsistencia en cualquiera de las
fases de compilacin
Normalmente en una compilacin no se muestran
todos los errores producidos:
Ocultacin de otros errores
Avalancha de errores

Se puede
Pararse al encontrar cualquier error
Intentar recuperar todos los errores de una pasada

Especificacin lxica:
Tokens mediante expresiones regulares

Especificacin sintctica:
Gramticas independientes del
contexto

Especificacin semntica:
Lenguaje natural

Anlisis lxico

es la primera fase de un compilador

consistente en un programa que recibe como entrada el


cdigo fuente de otro programa (secuencia de caracteres) y
produce una salida compuesta de tokens (componentes
lxicos) o smbolos.

La especificacin de un lenguaje de programacin a


menudo incluye un conjunto de reglas que definen el lxico.
Estas reglas consisten comnmente en expresiones regulares
que indican el conjunto de posibles secuencias de caracteres
que definen un token o lexema.

En algunos lenguajes de programacin es necesario


establecer patrones para caracteres especiales (como el
espacio en blanco) que la gramtica pueda reconocer sin
que constituya un token en s.

Esta etapa est basada usualmente en una


mquina de estados finitos. Esta mquina
contiene la informacin de las posibles
secuencias de caracteres que puede conformar
cualquier token que sea parte del lenguaje (las
instancias individuales de estas secuencias de
caracteres son denominados lexemas). Por
ejemplo, un token de naturaleza entero puede
contener cualquier secuencia de caracteres
numricos.

JFLEX

Qu es?

es una herramienta JAVA que permite actuar


sobre aquellas cadenas de un fichero de texto
que encajan en una expresin regular

Flex es un meta compilador que permite generar


rpidamente analizadores lxicos que se integran
con Java.

Para qu sirve?

Para generar escneres: programas que


reconocen patrones lxicos en un texto. flex lee
los ficheros de entrada dados, o la entrada
estndar si no se le ha indicado ningn nombre
de fichero, con la descripcin de un escner a
generar. La descripcin se encuentra en forma
de parejas de expresiones regulares y cdigo C,
denominadas reglas. Flex.

El programa jflex produce cdigo Java a partir


de esta especificacin, en concreto, produce un
archivo de nombre Yylex.java, con la definicion
de la clase Yylex, que encapsula el cdigo de
anlisis lxico

Su descarga

Creamos en (c:) una carpeta que


se llame JFlex

Descomprimimos el archivo
descargado en la carpeta que
creamos dentro de C:

Abrimos nuestro Netbeans y


vamos a tools o herramientas y
seleccionamos libreras

Ahora en la ventana que nos apareci le


damos clic en nueva librera y en la ventana
que nos aparece escribimos JFlex y
presionamos ok

Ahora precionamos en el
botn add JAR/Folder

Seleccionamos el archivo JFlex.jar ubicado en


"C:\JFlex\jflex-1.6.0\lib\JFlex.jar"

Ms o menos se encuentra en esa ruta, jflex-1.6.0


puede variar dependiendo cual se descargue y
le damos add JAR/FOLDER

Por ultimo presionamos OK

**Concepto

Obtiene la secuencia de Lexemas con sus respectivos token,


proporcionada por el Anlisis Lxico y comprueba que los
token formen una expresin vlida y estn ordenados de
forma correcta.

Declarar Atributo de clase: MAcceso + PalabraR+ Tdato+ Nombre del


Atributo + ;
Ejemplo: public static int n1;
ER= (M | S | T | N | E) donde:
M -> public, private, protected
S -> static
T -> double, int, string, char, etc
N -> L | LN | LD
L -> [A.Z | az]
D -> [09]
E -> ;

**Manejo de errores
Lxicos: producidos al escribir mal un identificador, una
palabra clave o un operador.
Sintcticos,
parntesis.

Expresin aritmtica mal especificada, falta

Semnticos, como un operador aplicado a un operando


incompatible.
Lgicos, puede ser una llamada infinitamente recursiva.

Por lo tanto el manejador de errores de un analizador sintctico


debe tener como objetivos:
Indicar los errores de forma clara y precisa. Aclarar el tipo de
error y su localizacin.
Recuperarse del error, para poder seguir examinando la
entrada.
No ralentizar significativamente la compilacin.

**Estrategias de
correccin
Ignorar el problema (Panic mode ): Consiste en ignorar el
resto de la entrada hasta llegar a una condicin de
seguridad. (por ejemplo un ; o un END).A partir de este
punto se sigue analizando normalmente.

Recuperacin a nivel de frase: Intenta recuperar


el error una vez descubierto. En el caso anterior,
por
ejemplo,
podra
haber
sido
lo
suficientemente inteligente como para insertar
el token ; .

Inserta el ;en el momento que descubre el error

Reglas de produccin adicionales para el control


de errores: La gramtica se puede aumentar con
las reglas que reconocen los errores ms comunes.
En el caso anterior, se podra haber puesto algo
como:

JCUP

Cup es una herramienta ampliamente utilizada para la


programacin de sistemas informticos ya que permite
generar
compiladores
a
travs
de
gramticas
independientes.

Cup es un generador de analizadores sintcticos en Java, el


cual recibe de entrada un archivo con la estructura de la
gramtica y su salida es un parser, escrito en Java, listo para
usarse.

Descarga

La carpeta que interesa


es java_cup

Ahora la instalacin de la librera CUP a


netBeans.
Abrimos
netBeans
y
seleccionamos
herramientas
-bibliotecas

En la ventana que aparece


seleccionamos nueva biblioteca.

Escribimos el nombre de JCUP,


seguido de aceptar

Presionamos el botn de
Agregar archivo JAR

Buscamos la ruta donde se encuentra el


archivo Jcup.jar y oprimimos el botn
de agregar archivo JAR

Observamos que la librera ya aparece,


presionamos aceptar. Y con este paso
damos por terminada la instalacin de
la librera CUP

Estructura de un archivo.cup

Imports Java:

Cdigo del usuario para el parser: podemos declarar mtodos y variables


que pensamos usar en la clase resultante. Si se declaran variables o
mtodos pblicos en esta seccin estos podrn ser accedidos por otras
clases.

Anlisis semntico

Adems de controlar que un programa cumple


con las reglas de la gramtica del lenguaje, hay
que comprobar que lo que se quiere hacer tiene
sentido. El anlisis semntico dota de un
significado coherente a lo que hemos hecho en
el anlisis sintctico.

El chequeo semntico se encarga de que los


tipos que intervienen en las expresiones sean
compatibles o que los parmetros reales de una
funcin sean coherentes con los parmetros
formales: p.ej. no suele tener mucho sentido el
multiplicar una cadena de caracteres por un
entero.

Atributos y
acciones
semnticas

Los atributos son informacin personalizada


(semntica) de los smbolos. Por lo que cada tipo
de smbolo (terminal o no terminal) puede tener
atributos diferentes. Esta informacin viaja a
travs del rbol de anlisis sintctico adjunta a
cada smbolo. Las acciones semnticas se
encargan de manipular el contenido de los
atributos para verificar que existe un significado
correcto en la relacin de los smbolos entre si.

La estructura de datos formada por los smbolos y


sus atributos es parecida a una estructura de
registro. Cada tipo de smbolo es un tipo de
registro y cada atributo es un campo del registro.
A la vez, cada atributo puede ser de un tipo
concreto.

Por ejemplo, supongamos que tenemos el


smbolo de una variable de tipo entero.
Posiblemente, necesitaremos un atributo para
guardar informacin sobre la direccin en
memoria en donde se guardara el valor que
tome la variable, tambin necesitaremos saber el
tipo de la misma y alguna informacin mas.

Hay dos tipos de terminales, los que estn definidos


en el anlisis lxico como fijos y los que siguen un
patrn definido, por lo que representan a una
variedad de posibles lexemas.

Para poder llenar la tabla de smbolos con la


informacin necesaria de cada smbolo, es preciso
que los diferentes atributos tengan sus valores
establecidos. Algunos valores vienen dados por la
fase de anlisis lxico, como son el contenido de los
lexemas, pero hay otros valores que se deben
calcular en el proceso de traduccin dirigida por la
sintaxis. Una vez que conocemos los valores de los
atributos, ya podemos realizar el anlisis semntico.

Pero para calcular los valores de los atributos, es


preciso incluir las llamadas acciones semnticas,
que no son mas que trozos de cdigo en un
lenguaje de programacin concreto, que
manipulan los smbolos y sus atributos.

Por ejemplo, en el caso anterior, debemos incluir


en la tabla de smbolos la direccin de la variable
declarada y adems su tipo. La direccin la
podemos calcular a partir de la informacin que
hay en la tabla de smbolos y de informacin
global que utilicemos, pero el tipo solo lo
podemos obtener de la propia gramatica.

Reglas para la utilizacin de atributos en


acciones semnticas:
1.

Las acciones semnticas en las que intervengan


atributos de la parte izquierda de una regla se
pondrn al final de la regla.

2.

Solo se podrn incluir acciones semnticas en que


intervengan atributos de un smbolo detrs del
smbolo en la regla.

Tipos de
atributos

Una traduccin dirigida por la sintaxis, en realidad


se esta construyendo un rbol de anlisis sintctico
y dotando cada nodo de una serie de
caractersticas, llamadas atributos. Este proceso de
anlisis recorre la cadena de componentes lxicos
de entrada e ir construyendo su rbol de anlisis
sintctico y despus se recorre el rbol y se van
ejecutando las acciones semnticas
correspondientes.

A los arboles de anlisis sintctico en los que sus


nodos se guardan atributos se les suele llamar
arboles adornados y a las gramticas como
gramticas atribuidas.

Tipos de atributos

Atributos sintetizados: Se calculan a partir de los


valores de los atributos de sus nodos hijos en el
rbol adornado

Atributos heredados: se calculan a partir de los


atributos de los nodos hermanos o padres del
rbol adornado.

Los arboles adornados se utilizan para pasar


informacin entre diferentes reglas de la
gramtica.

Cada nodo del rbol representa una instancia


del smbolo gramatical de que se trata y, por
tanto, tiene valores propios para sus atributos, es
decir dos arboles que son iguales en cuanto a su
estructura, no tienen por que tener los mimos
valores en los atributos de sus nodos.

Lo terminales no tienen atributos heredados sino


solo sintetizados ya que sus valores vienen dados
por etapas anteriores del anlisis y no cambian.

Analizador
semntico con
Jflex y CUP.

Para poder llevar a


cabo un analizador
semntico
necesitaremos de un
archivo con extensin
.Jflex y otro archivo con
extensin .CUP.

Ambos deben ser


ejecutados de la
siguiente manera para
realizar nuestro
analizador semntico:

Para comenzar abrimos CMD y ah debemos


dirigirnos a la carpeta donde se encuentran los
archivos con extensin .CUP y .Jflex

Ahora hay que escribir el comando JFlex para


generar el archivo Yylex o el archivo que contiene
las reglas lxicas.

Se genero un archivo con nombre Yylex.java

Ahora hay que generar los archivos parser.java y


sym.java, para ello en CMD escribimos el
siguiente comando Java java_cup.Main <
archivo1.cup

A continuacin hay que compilar el archivo


parser.java con el comando javac parser.java

Si no hay errores simplemente hay que escribir el


comando java parser y se ejecutara el analizador
semntico.

Y escribiremos una instruccin como la siguiente

5+4*8;

Observamos que la instruccin es correcta e


incluso devuelve el resultado de esta operacin.

Ahora si queremos comprobar que detecta algn


error semntico hacemos lo siguiente: