You are on page 1of 26

UNIVERSIDAD TECNOLOGICA DEL PERU FILIAL

AREQUIPA
FACULTAD DE INGENIERIA
CARRERA DE INGENIERIA DE SISTEMAS E
INFORMATICA

TRABAJO FINAL
TEMA: CONSTRUCCION DE COMPILADOR PARA JAVA.
CICLO
CURSO

: VIII
: COMPILADORES

DOCENTE

: Ing. Kelvin Macedo Ilachoque

AUTOR(S)

Huanca lvarez, Pablo Csar

..
..

2015

INTRODUCCION
"Cmo funciona un compilador? ", es la pregunta de todo aquel que se
hace llamar programador, a grandes rasgos un compilador toma un
programa escrito en un lenguaje de programacin con una gramtica,
sintaxis y semntica definida, revisa que este dentro de las pautas de
definicin del lenguaje, y lo traduce en programa de salida escrito en
lenguaje binario, el cual es entendido por el ordenador y por lo tanto
puede ser ejecutado por el mismo (recordar que un intrprete a
diferencia de un compilador no traduce todo el programa sino que va
realizando la traduccin e interpretacin de la misma paso a paso, sin
crear ningn programa de salida ejecutable). Las partes del proceso de
compilacin se dividen en dos: una llamada fase de Anlisis y otra
llamada fase de Sintaxis, las cuales interactan entre s para la creacin
de la tabla de smbolos y el control del manejador de errores, dentro del
anlisis hay tres etapas llamadas anlisis lxico, anlisis sintctico,
anlisis semntico. Dentro de la fase de Sntesis existen las etapas de
generacin de cdigo intermedio, optimizacin de cdigo intermedio, y
generacin de cdigo.
Al tener que describir cmo funciona un compilador tenemos que tener
en claro en no confundir los trminos compilador y compilacin, se debe
entender que al decir compilador nos referimos al programa, y al decir
compilacin al proceso en s. En esencia ambos trminos cumplen con la
definicin ms simple de un compilador, es decir, sea el programa
compilador o el proceso de compilacin, ambos reciben como entrada
un cdigo escrito en algn lenguaje y producen como salida otro cdigo
escrito en otro lenguaje.

OBJETIVO GENERAL

Comprender el problema al que se enfrenta un compilador.


Comprender los Algoritmos que se utilizan para resolver cada una

de las fases del compilador.


Dominar completamente el proceso para convertir un lenguaje de
alto nivel a un Lenguaje de bajo nivel.

OBJETIVOS ESPECIFICOS

Aplicar el concepto de compiladores como alternativa de solucin

de problemas.
Que nosotros los estudiantes realicemos una aplicacin interactiva

que trabaje conjuntamente con el analizador.


Que el estudiante sea capaz de crear gramticas y de recuperarse

de errores lxicos, sintcticos.


Iniciar el proceso de aprendizaje de herramientas generadoras de
Analizadores Lxicos y Sintcticos.

COMPILADOR Y SUS FASES


COMPILADOR
Es un programa que permite traducir el cdigo fuente de un programa
en lenguaje de alto nivel, a otro lenguaje de nivel inferior (tpicamente
lenguaje de mquina).
De esta manera un programador puede disear un programa en un
lenguaje mucho ms cercano a cmo piensa un ser humano, para luego
compilarlo a un programa ms manejable por un computador.

Esta imagen nos muestra como traduce los textos del


compilador.
Un compilador es un programa informtico que traduce un programa
escrito

en

un

lenguaje

de

programacin

otro

lenguaje

de

programacin, generando un programa equivalente que la mquina ser


capaz de interpretar. Usualmente el segundo lenguaje es lenguaje de
mquina, pero tambin puede ser un cdigo intermedio (bytecode), o
simplemente texto. Este proceso de traduccin se conoce como
compilacin.
El compilador es el que permite traducir el cdigo fuente de un
programa en lenguaje de alto nivel, a otro lenguaje de nivel inferior
(tpicamente lenguaje de mquina). De esta manera un programador
puede disear un programa en un lenguaje mucho ms cercano a cmo
piensa un ser humano, para luego compilarlo a un programa ms
manejable por una computadora.

Diagrama a bloques de la operacin de un buen compilador.

Bsicamente, El programa compilador traduce las instrucciones en un


lenguaje de alto nivel a instrucciones que la computadora puede
interpretar y ejecutar. Para cada lenguaje de programacin se requiere
un compilador separado dos grandes formas de ejecutar

programas:

programas compilados (previamente pasados por un compilador) y


programas interpretados (necesitan pasar por un intrprete para
ejecutarse en tiempo real).
Un compilador es un programa informtico, que se encarga de traducir
el cdigo fuente de una aplicacin que este en desarrollo, es decir
convierte un programa hecho en lenguaje de programacin de alto nivel
a un lenguaje de mquina, el cual es conocido como de bajo nivel, de tal
forma que sea

ms entendible y mucho ms fcil de procesar en el

equipo en el que se est ejecutando.

El proceso de compilacin no siempre es directo. Esto quiere decir que


si partimos de un lenguaje A y queremos traducir a un lenguaje B, no
siempre ser recomendable traducir directamente de A a B, si no que
puede ser conveniente usar un lenguaje intermedio (llammosle X) y
entonces disearamos un traductor de A a X, y otro de X a B. En este
caso, el primer traductor recibe el nombre de front-end mientras que
el segundo se llama back-end. El lenguaje A es el lenguaje fuente y el
lenguaje B es el lenguaje objeto o destino.

Estructura de proceso de compilacin

De igual manera un traductor es el que toma como entrada un texto


escrito y da como salida otro texto en un lenguaje llamado objeto.
Un compilador es un programa que crea una lista de instrucciones de
cdigo mquina basndose en un cdigo fuente resultando en un
programa listo y rpido para usarse. Por otro lado el intrprete es ms
lento puesto que, no produce ningn cdigo sino que lo reconoce.
Ambos son lenguajes de programacin.
Conceptualmente un compilador opera en fases. Cada una de las cuales
transforma el programa fuente de una representacin en otra. En la
imagen 4 se muestra una descomposicin tpica de un compilador. En la
prctica se pueden agrupar fases y las representaciones intermedias
entres las fases agrupadas no necesitan ser construidas explcitamente.
Programa fuente.

Nos muestra una descomposicin tpica de un


compilador.
El programa compilador traduce las instrucciones en un lenguaje de alto nivel a
instrucciones que la computadora puede interpretar y ejecutar.

FASES DE UN COMPILADOR
EL ANLISIS. Es la fase en la cual se trata de la escritura correcta del
cdigo fuente. Esta a su vez comprende varias fases:
1. ANLISIS LXICO: El

analizador lxico, tambin conocido como

scanner, lee los caracteres uno a uno desde la entrada y va formando


grupos de caracteres con alguna relacin entre s (tokens), que
constituirn la entrada para la siguiente etapa del compilador. Cada
tokens representa una secuencia de caracteres que son tratados
como una nica entidad. Por ejemplo, en Pascal un tokens es la
palabra reservada BEGIN, en C: WHILE, etc.
Las tiras especficas slo tienen tipo (lo que representan), mientras que
las tiras no especficas tienen tipo y valor. Por ejemplo, si Contador es
un identificador, el tipo de tokens ser identificador y su valor ser la
cadena Contador. El Analizador Lxico es la etapa del compilador que
va a permitir saber si es un lenguaje de formato libre o no.
Frecuentemente va unido al analizador sintctico en la misma pasada,
funcionando entonces como una subrutina de este ltimo. Ya que es el
que va leyendo los caracteres del programa, ignorar aquellos
elementos innecesarios para la siguiente fase, como los tabuladores,
comentarios, espacios en blanco, etc.
Se encarga de buscar los componentes lxicos (tokens En ingls) o
palabras que componen el programa fuente, segn unas reglas o
patrones. La entrada del analizador lxico podemos definirla como una
secuencia de caracteres.

analizador lxico.

El analizador lxico tiene que dividir la secuencia de caracteres en


palabras con significado propio y despus convertirlo a una secuencia de
terminales desde el punto de vista del analizador sintctico, que es la
entrada del analizador sintctico.
El analizador lxico reconoce las palabras en funcin de una gramtica
regular de manera que sus NO TERMINALES se convierten en los
elementos de entrada de fases posteriores. En LEX, por ejemplo, esta
gramtica se expresa mediante expresiones regulares.

1.1. FUNCIN DEL ANALIZADOR LXICO.


El analizador lxico es la primera fase de un compilador. Su principal funcin
consiste en leer los caracteres de entrada y elaborar como salida una
secuencia de componentes lxicos que utiliza el analizador sintctico para
hacer el anlisis. Esta interaccin, suele aplicarse convirtiendo al analizador
lxico en una subrutina o corrutina del analizador sintctico.

interaccin de un analizador lxico con el analizador sintctico.

Este analizador se encarga de formar los componentes lxicos del


lenguaje fuente. Estos componentes reciben el nombre de token. Un
token es un elemento que puede formar parte del lenguaje fuente.
Para implementar un analizador lxico necesitamos un DTE (diagrama
de transicin de estados) que nos proporcione la especificacin lxica
del lenguaje fuente.
Ejemplo: queremos reconocer como tokens el nmero 0 (cero), el
nmero 1 (uno), la palabra reservada casa (casa) y cadenas formadas
por las letras a y b (cadena). El DTE equivalente podra ser:

Partimos de un estado inicial (e) a partir de la cual vemos que con un


0 o con un 1 directamente

obtenemos

los tokens cero y uno

respectivamente. Si tenemos una c, luego una a, luengo una s y luego


una a obtenemos el token casa. Y si tenemos uno o ms caracteres que
sean a o b, obtenemos el token cadena. Cualquier otra posibilidad no

contemplada en el DTE nos llevara a un error lxico: por ejemplo la


palabra cab, ya que a partir del estado ca no hay ningn arco que se
active con la letra b.

Este anlisis no logra detectar muchos errores por su caracterstica.

1.2. AUTOMATA FINITO


Un autmata finito es un modelo matemtico de una mquina que
acepta cadenas de un lenguaje definido sobre un alfabeto A. Consiste en
un conjunto finito de estados y un conjunto de transiciones entre esos
estados, que dependen de los smbolos de la cadena de entrada. El
autmata finito acepta una cadena x si la secuencia de transiciones
correspondientes a los smbolos de x conduce desde el estado inicial a
un estado final.
Si para todo estado del autmata existe como mximo una transicin
definida para cada smbolo del alfabeto, se dice que el autmata es
determinstico (AFD). Si a partir de algn estado y para el mismo
smbolo de entrada, se definen dos o ms transiciones se dice que el
autmata es no determinstico (AFND).
Formalmente un autmata finito se define como una 5-upla M = <E, A,
, e0, F> donde E: conjunto finito de estados A: alfabeto o conjunto
finito de smbolos de entrada : funcin de transicin de estados, que se
define como - : E x A E si el autmata es determinstico - : E x A
P(E) si el autmata es no determinstico (P(E) es el conjunto potencia de
E, es decir el conjunto de todos los subconjuntos de E) e0: estado inicial;
e0 E F: conjunto de estados finales o estados de aceptacin; F E.
Generalmente se asocia con cada autmata un grafo dirigido, llamado
diagrama de transicin de estados. Cada nodo del grafo corresponde a
un estado. El estado inicial se indica mediante una flecha que no tiene
nodo origen. Los estados finales se representan con un crculo doble.

autmata y lenguajes formales.

Un autmata finito o mquina de estado finito es un modelo


computacional que realiza cmputos en forma automtica sobre una
entrada para producir una salida.

1.3. AUTOMATA DE PILA


Los autmatas de pila, en forma similar a como se usan los autmatas
finitos, tambin se pueden utilizar para aceptar cadenas de un lenguaje
definido sobre un alfabeto A.
Los autmatas de pila pueden aceptar lenguajes que no pueden aceptar
los autmatas finitos. Un autmata de pila cuenta con una cinta de
entrada y un mecanismo de control que puede encontrarse en uno de
entre un nmero finito de estados. Uno de estos estados se designa
como estado inicial, y adems algunos estados se llaman de aceptacin
o finales. A diferencia de los autmatas finitos, los autmatas de pila
cuentan con una memoria auxiliar llamada pila. Los smbolos (llamados
smbolos de pila) pueden ser insertados o extrados de la pila, de
acuerdo con el manejo lats-in-first-out (LIFO).
Las transiciones entre los estados que ejecutan los autmatas de pila
dependen de los smbolos de entrada y de los smbolos de la pila. El
autmata acepta una cadena x si la secuencia de transiciones,
comenzando en estado inicial y con pila vaca, conduce a un estado
final, despus de leer toda la cadena x.

. Esta imagen nos muestra cmo se usa un autmata de pila.

2. ANALIZADOR SINTCTICO
Este analizador se encarga de formar componentes sintcticos del
lenguaje fuente. En definitiva, nos permitir saber si un texto concreto

pertenece al conjunto de posibles textos de un lenguaje.


Para implementar un analizador sintctico necesitamos una gramtica
que nos proporcione la especificacin sintctica del lenguaje fuente.
Una gramtica est formado por una serie de reglas. Cada regla tiene
una parte izquierda y una parte derecha. Si se reconoce la parte
derecha de una regla, se puede sustituir todo por la parte izquierda de
la misma regla. Las reglas estn formadas por dos tipos de smbolos:
-

No terminales: tambin llamados variables y que se


expanden en partes derechas de otras reglas.

Terminales: son tokens de la especificacin lxica.

Ejemplo:

queremos

especificar

la

sintaxis

de

operaciones

aritmticas

de nmeros enteros. Las operaciones en cuestin son la

suma y la resta.
Una primera aproximacin
podra ser: E E + E
EEE
E nint
Los tokens son:
+: el signo ms (suma)
-: el signo menos (resta)
nint: un nmero entero, cuya expresin regular sera [0-9]*
Sin embargo, esta gramtica no es vlida ya que es ambigua. La
ambiguedad es un problema bastante importante ya que implica que
puede haber ms de un rbol de derivacin para encontrar una misma
cadena. No se pueden implementar analizadores mediante gramticas
ambiguas, ya que apareceran conflictos.
Veamos dos rboles de derivacin con la primera gramtica para
formar la expresin 1+1.

La ambiguedad es bastante difcil de detectar. Para ello se definen


una serie de subconjuntos de gramticas, y a la hora de disear el
analizador podemos detectar dicha ambiguedad. En nuestro caso
interesa usar las gramticas SLR a partir de las cuales se pueden
implementar analizadores sintcticos ascendentes.
La gramtica anterior en SLR
sera: E E + T
EE-T
ET
T nint

El anlisis que se realiza es jerrquico es decir en base a rboles de


derivacin que se obtienen de las mismas gramticas.
En teora, se supone que la salida del analizador sintctico es alguna
representacin del rbol sintctico que reconoce la secuencia de tokens
suministrada por el analizador lxico.

2.1. TRADUCTOR SINTCTICO


Un traductor sintctico es un programa que realiza traducciones
parciales del lenguaje fuente al lenguaje destino. Cada regla efecta
una traduccin parcial y la regla inicial del programa se encarga de
proporcionar la traduccin total.
Para implementar un traductor sintctico necesitamos un ETDS
(esquema de traduccin dirigida por la sintaxis) que nos indique las
traducciones parciales de cada regla. Un ETDS es una extensin sobre
una gramtica que contiene:
-

Atributos sintetizados: son valores devueltos por la una


regla una vez que se ha reconocido toda la parte derecha de
una regla

Atributos heredados: son valores pasados de una regla


a otra, y que aparecen a la izquierda de la regla receptora.

Para indicar los valores de los atributos se emplean instrucciones de


asignacin

que aparecen
pueden

entre llaves ({}).

Tambin

se

poner instrucciones tipo C.

Ejemplo: queremos traducir las expresiones de la gramtica anterior


a un lenguaje tipo rbol en el que disponemos de las siguientes
instrucciones:

Suma(a,b
)
Resta(a,
b)

La

traduccin

de

1+2+3

sera

Suma(Suma(1,2),3)
El ETDS resultante
es:
E E + T {E.t = Suma( || E.t || , ||
T.t || )} E E T {E.t = Resta( ||
E.t || , || T.t || )} E T {E.t = T.t}
T nint {T.t =
nint.lexema} Aqu
conviene explicar que:
-

el

operador

||

nos

permite

realizar

concatenaciones
-

Usamos la comilla simple () para distinguir la E de la parte


izquierda de la E de la parte derecha en las dos primeras
reglas

Se supone que el analizador lxico guarda el lexema de


todos los tokens.

2.2. DISEO DE UN COMPILADOR COMPLEJO


Como hemos indicado antes, no siempre traducimos directamente de
un lenguaje A a un lenguaje B si no que empleamos front-ends y backends. Adems, hay que tener en cuenta que los lenguajes objeto de un
compilador suelen ser de bajo nivel, mientras que los lenguajes fuente
suelen ser de alto nivel. Esto implica que en la traduccin se deben
tratar conceptos de alto nivel como clases, objetos,
etc
A la hora de tratar estos conceptos podemos optar o bien por simular
todo en
esta

el lenguaje destino

mediante

rutinas de

librera

(y de

manera obtendramos un ejecutable) o bien delegar en un

intrprete. El caso de C es el primero, es decir, obtenemos un


ejecutable y lo que hacemos es servirnos de rutinas de librera
(entrada / salida, cadenas , etc). Sin embargo, Java sigue el segundo
camino, es decir, el lenguaje objeto de Java es el lenguaje Class, que
es un lenguaje interpretado. Los intrpretes de Class, llamados

intrpretes de la mquina virtual, son los encargados de manejar


conceptos de alto nivel como la creacin de clases, recoleccin de
basura, etc
Otro concepto es el de la optimizacin, ya que muchas el cdigo
generado es redudante y se puede mejorar. Una traduccin ya
optimizada sera bastante costoso y no compensa, es por ello que
normalmente en la fase de traduccin lo que se busca es rapidez y
eficiencia. Luego se suele filtrar la salida con un optimizador. A
continuacin se muestra un diagrama resumen de todo el proceso:

diagrama de bloques del proceso completo.

2.3. MANEJO DE ERRORES SINTCTICOS


Si un compilador tuviera que procesar slo programas correctos, su diseo e
implantacin se simplificaran mucho. Pero los programadores a menudo escriben
programa

incorrectos, y un buen compilador debera ayudar al programador a

identificar y localizar errores. Es ms, considerar desde el principio el manejo de


errores puede simplificar la estructura de un compilador y mejorar su respuesta a los
errores.

Los errores en la programacin pueden ser de los siguientes tipos:


Lxicos, producidos al escribir mal un identificador, una palabra clave o un
operador.
Sintcticos, por una expresin aritmtica o parntesis no equilibrados.
Semnticos, como un operador aplicado a un operando incompatible.
Lgicos, puede ser una llamada infinitamente recursiva.
El manejo de errores de sintaxis es el ms complicado desde el punto de vista
de la Creacin de compiladores. Nos interesa que cuando el compilador
encuentre un error, se recupere y siga buscando errores.
3. ANLISIS SEMNTICO: en esta fase se busca establecer que el cdigo
fuente cumpla con la semntica solicitada por el compilador, es decir que el
cdigo este correctamente escrito para poder ser interpretado. Este anlisis
es ms difcil de formalizar, determina el tipo de los resultados intermedios,
comprobar que los argumentos que tienen un operador pertenecen al
conjunto de operadores posible, y si son compatibles entre s.
Ejemplo:

Suponiendo

que

tenemos

esta

lnea

de

cdigo

en

C:

res=valor1+valor2; El anlisis semntico se va a encargar que tanto el valor1


como el valor2 tengan datos que son compatibles en comn y que adems se
les pueda aplicar dicho operador. En C el smbolo (+) implica una suma de
valores o una unin de las cadenas.

El anlisis semntico utiliza como entrada el rbol sintctico detectado por el


anlisis sintctico para comprobar restricciones de tipo y otras limitaciones
semnticas y preparar la generacin de cdigo.
En compiladores de un solo paso, las llamadas a las rutinas semnticas se
realizan directamente desde el analizador sintctico y son dichas rutinas las
que llaman al generador de cdigo. El instrumento ms utilizado para
conseguirlo es la gramtica de atributos.
En compiladores de dos o ms pasos, el anlisis semntico se realiza
independientemente de la generacin de cdigo, pasndose informacin a
travs de un archivo intermedio, que normalmente contiene informacin sobre
el rbol sintctico en forma lineal izada (para facilitar su manejo y hacer
posible su almacenamiento en memoria auxiliar).

PALABRAS RESERVADAS DE JAVA


const, goto, boolean, byte, short, int, long, char, float, double, package,
import,

public,

protected,

private,

static,

abstract,

final,

native,

synchronized, transient, volatitle, class, extends, implements, void,


throws, this, super, interface, if, else, switch, case, default, while, do,
for, break, continue, return, throw, try, catch, finally, new, instanceof

OTROS TOKENS
TOKEN

DESCRIPCIN

LBRA

RBRA

POINT

PYCOMA

STAR

COMA

LPAR2

RPAR2

=, *=, /=, +=, -=, &=, !=, <<=,


ASSOP
LPAR

>>=,
(

RPAR

DOSP

PPLUS

++

MMIN
PLUS

MINUS

WAVE

NO

SLASH

PERC

LSH

<<

RSH

>>

DRSH

>>>

RELOP

<, >, >=, <=

EQ

==

NEQ

!=

AND

&

HAT

BAR

DAND

&&

DBAR

||

ASK

INTEGER

nmero entero: 0xffl

FP

nmero en coma flotante: 3.2e -2d

BOOL

True false

CHARAC

caracter: 'x'

STRING

cadena de caracteres: "xx"

NULL2

null

IDENT

identificador: a14

IDENTIFICADORES: estn formados por letras (A -Z, a-z, _ y $) y


dgitos (0 -9).
El primer carcter es una letra y el resto pueden ser letras o dgitos.
CARACTERES ESPECIALES: hay que contemplar las secuencias
de escape como posibles caracteres:
\b borrar
\t

tabulador

\n Salto de lnea
\f

Feed-forward

\r

carriage-return

\"

Comillas dobles: "

\'

Comillas simples: '

\\

barra: \

CONCATENACIN DE CADENAS:
La

concatenacin

de

cadenas

se

resuelve

en

tiempo

de

compilacin, de manera que si el compilador procesa una lnea del


estilo String s="ab"+"c" el compilador almacena la cadena
"abc".
TRATAMIENTO DE NMEROS
Notacin prefijo

ejemplo

decimal

14

octal

07

hexadecimal 0x

0xf

Nmeros enteros: por defecto int


precisin sufijo

mximo

int

2147483647

long

lL

9223372036854775808L

Nmeros flotantes: por defecto double


precisin sufijo
float

fF

mximo
3.40282347E+38F

mnimo
1.40239846E -45F

Double

DD

1.79769313486231 570E+308 4.964065645841246544E -324

Tambin estn definidas las constantes Float.NaN y Double.NaN (NaN =


not a number: no es un nmero).

ESPECIFICACIN SINTCTICA Y ANALIZADOR SINTCTICO


El desarrollo de este analizador ha sido realizado con la herramienta
Bison de Linux. Esta herramienta nos permite implementar un traductor
ascendente mediante una notacin similar a la de un ETDS, como se ha
visto en la asignatura Compiladores II. Evidentemente, un traductor que
traduce siempre cadena vaca sera un analizador sintctico.
La gramtica usada es la de la especificacin de Java. Cabe destacar el
hecho de que no hay conflicto en las instrucciones de control (IF - THEN
- ELSE) como suele ocurrir en la mayora de lenguajes de alto nivel.
Java es un lenguaje de programacin

de alto nivel orientado

objetos. Cada fichero java puede contener como mximo una clase
pblica (accesible desde cualquier parte). La estructura bsica de un
programa Java es:
Class MyClass { Public
int a;
Public final static void main( String Args[]) {
System.out.println(This is my class);
}
}
Destacar que tenemos dentro de la clase:

Una variable entera pblica cuyo identificador es a

Un mtodo (funcin) pblico que adems es final y esttico cuyo

identificador es main. Este mtodo representa la funcin principal que


se ejecuta al arrancar el programa. Debe ser siempre esttico y final.
Adems no devuelve nada (void) y recibe como parmetro una array de
cadenas que representa los parmetros especificados en lnea de
comandos.
Java dispone de un repertorio limitado de instrucciones, pero

las

distribuciones

que

de Java

disponen

de

una

serie

de

libreras

aumentan su potencia. Para referenciar a una librera usamos import.


Por ejemplo: import miclase;

La dificultad de compilar Java radica en la necesidad de tener que ir


analizando otros ficheros class con tal de comprobar la sintaxis. No
hacerlo significara disponer de un conjunto final muy reducido.

TRADUCCIN AL FORMATO CLASS


Realizaremos la traduccin de java a class mediante un traductor
sintctico ascendente (SLR), de manera que se siguen los siguientes
pasos:

Comprobaciones lxicas, realizadas por el analizador lxico.


Comprobaciones sintcticas, realizadas por el analizador

sintctico.
Comprobaciones semnticas, implementa das como

acciones a realizar por el traductor.


Traduccin parcial de cada parte del programa reconocida
como una regla de la gramtica, a realizar por el traductor.

Puesto que el formato class se puede representar como una estructura,


la traduccin parcial del programa se efecta aadiendo informacin a
la estructura a medida que se van reconociendo partes del programa.
Dadas sus caractersticas, el uso de la estructura hace innecesario
emplear tablas de smbolos y tablas de tipos.

EL FORMATO CLASS.
Constantes
#define ACC_PUBLIC 0x0001
#define ACC_PRIVATE 0x0002
#define ACC_PROTECTED 0x0004
#define ACC_STATIC 0x0008
#define ACC_FINAL 0x0010
#define ACC_SUPER 0x0020
#define ACC_VOLATITLE 0x0040
#define ACC_TRANSIENT 0x0080
#define ACC_NATIVE 0x010 0
#define ACC_INTERFACE 0x0200
#define ACC_ABSTRACT 0x0400
#define ACC_STRICT 0x0800
#define MAGIC 0xCAFEBABE
Tipos bsicos
Un byte, dos bytes o cuatro bytes.
typedef unsigned char u1;
typedef unsigned char* u2;
typedef unsigned char* u4;
Constant Pool (bufer de constantes)
En este buffer se guarda la informacin de variables y mtodos de
clase. cada

typedef struct
{
u1
tag;
u1 *info;
} cp_info
Informacin de los atributos
typedef struct
{
u2 attribute_name_index; al constant_pool
u4 attribute_length; tamao
u1 *info;
} attribute_info;
Informacin de los campos
typedef struct
{
u2 access_flags; permisos
u2 name_index;
u2 descriptor_index;
u2 attributes_count; tamao
attribute_info *attributes;
} field_info;
Informacin de los mtodos
typedef struct
{
u2 access_flags; permisos
u2 name_index;
u2 descriptor_index;
u2 attributes_count;
tamao attribute_info
*attributes;
} method_info;
Fichero Class
typedef struct {
u4 magic; 0xCAFEBABE (identificador)
u2 minor_version ; M
u2 major_version ;
m la versin es M.m
u2 constant_pool_count; tamao

cp_info *constant_pool;
u2 access_flags; permisos
u2 this_class; puntero a la
clase u2 super_class; puntero
al padre u2 interfaces_count
; tamao
u2 *interfaces; apunta al constant_pool
u2 fields_count; tamao
field_info *fields;
u2 methods_count; tamao
method_info *methods;
u2 attributes_count; tamao
attribute_info *attributes;
} ClassFile;