Beruflich Dokumente
Kultur Dokumente
AREQUIPA
FACULTAD DE INGENIERIA
CARRERA DE INGENIERIA DE SISTEMAS E
INFORMATICA
TRABAJO FINAL
TEMA: CONSTRUCCION DE COMPILADOR PARA JAVA.
CICLO
CURSO
: VIII
: COMPILADORES
DOCENTE
AUTOR(S)
..
..
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
OBJETIVOS ESPECIFICOS
de problemas.
Que nosotros los estudiantes realicemos una aplicacin interactiva
en
un
lenguaje
de
programacin
otro
lenguaje
de
programas:
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.
obtenemos
2. ANALIZADOR SINTCTICO
Este analizador se encarga de formar componentes sintcticos del
lenguaje fuente. En definitiva, nos permitir saber si un texto concreto
Ejemplo:
queremos
especificar
la
sintaxis
de
operaciones
aritmticas
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.
que aparecen
pueden
Tambin
se
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
-
el lenguaje destino
mediante
rutinas de
librera
(y de
Suponiendo
que
tenemos
esta
lnea
de
cdigo
en
C:
public,
protected,
private,
static,
abstract,
final,
native,
OTROS TOKENS
TOKEN
DESCRIPCIN
LBRA
RBRA
POINT
PYCOMA
STAR
COMA
LPAR2
RPAR2
>>=,
(
RPAR
DOSP
PPLUS
++
MMIN
PLUS
MINUS
WAVE
NO
SLASH
PERC
LSH
<<
RSH
>>
DRSH
>>>
RELOP
EQ
==
NEQ
!=
AND
&
HAT
BAR
DAND
&&
DBAR
||
ASK
INTEGER
FP
BOOL
True false
CHARAC
caracter: 'x'
STRING
NULL2
null
IDENT
identificador: a14
tabulador
\n Salto de lnea
\f
Feed-forward
\r
carriage-return
\"
\'
\\
barra: \
CONCATENACIN DE CADENAS:
La
concatenacin
de
cadenas
se
resuelve
en
tiempo
de
ejemplo
decimal
14
octal
07
hexadecimal 0x
0xf
mximo
int
2147483647
long
lL
9223372036854775808L
fF
mximo
3.40282347E+38F
mnimo
1.40239846E -45F
Double
DD
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:
las
distribuciones
que
de Java
disponen
de
una
serie
de
libreras
sintctico.
Comprobaciones semnticas, implementa das como
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;