Sie sind auf Seite 1von 48

Compilador

Introduccin

En las siguientes paginas veremos cmo se detalla la parte tcnica del proyecto de curso de Algortmica III, ente lo que podemos sealar como resaltante este el hecho de ver cmo se explica la lgica que ha sido utilizada para el correcto funcionamiento del compilador, as como tambin veremos una descripcin de lo que es la interfaz grafica que es lo que permite al usuario el poder ver el comportamiento del compilador y corroborar su correcto funcionamiento de acuerdo a las reglas establecidas por el proyecto en s y por el pseudocdigo aqu tambin presentado. Es importante sealar que este documento es un complemento al documento ya entregado, en donde se hacan la mayora de especificaciones tericas del proyecto, cabe resaltar que tambin se harn ciertas referencias tericas en este caso.

Algortmica III

Pgina 1

Compilador

Informe Final del Proyecto de Algortmica 3

2.1 Objetivos tcnicos del proyecto:

Como objetivos tcnicos podemos sealar: El programa diseado para emular el comportamiento de un compilador, es decir recibe un lenguaje (en este caso pseudocdigo) y lo lleva a otro lenguaje (java). Esto lo hace gracias a patrones de correspondencia establecidos por el cdigo inicial con respecto del cdigo al que ser llevado. Podemos sealar que como objetivo encontramos el hecho de mostrar la complejidad de un compilador, que se define como un traductor, es decir, un programa que nos permite pasar informacin de un lenguaje a otro. Por ejemplo, un compilador de C nos permite traducir ficheros escritos en lenguaje C a un lenguaje legible para la mquina (ensamblador). El proceso de compilacin no siempre es directo. Uno de los objetivos principales es hacer entender lo que es y lo importante que es un compilador, las funciones que desempea en el entorno de trabajo de un programador. Es gracias a los compiladores que es posible el que se pueda programar en lenguajes como java o C++. Otro objetivo tcnico del proyecto a destacar es el trabajo en equipo, es decir, la complejidad de la meta de este proyecto har necesaria una ptima participacin de cada uno de los miembros del equipo, aplicando todo lo aprendido en ciclos anteriores y mostrando sus habilidades propias en el campo de la programacin. Por ltimo podemos sealar como objetivo tcnico del proyecto intentar de encontrar una comunin entre lo antes aprendido y los nuevos conocimientos adquiridos con el fin de desarrollar una aplicacin que cumpla de manera optima los requerimientos mnimos de este proyecto y tratar de optimizarlo lo mas que sea posible.

Algortmica III

Pgina 2

Compilador

2.2 Marco Teorico


Estructuras de datos Para poder realizar el compilador, fue necesario el uso de varias estructuras de datos, en esta parte daremos una breve teoria acerca de las estructuras que fueron utilizadas y tambien sealaremos las funciones que cumple cada una de ellas.

Lista
Se uso para guardar las palabras dentro del compilador Una lista enlazada, tambin llamada lista encadenada, es una estructura de datos lineal que no presenta las limitaciones que presenta un array. Sin embargo, son menos eficientes en el uso de memoria que los arrays, y algunas operaciones que en un array requieren un tiempo constante (por ejemplo, el acceso a una posicin cualquiera del array dado su ndice), en una lista enlazada tienen complejidad lineal. Por tanto, dependiendo del problema concreto, resultara ms adecuado utilizar un array o una lista enlazada. Una lista enlazada es una estructura de datos lineal compuesta por nodos, en la cual cada nodo almacena un dato y una referencia al nodo que le sigue en la estructura. En la siguiente figura se representa grficamente un ejemplo de lista enlazada.

La lista contiene una referencia al primer nodo de la misma. A partir de este, cada nodo tiene una referencia al siguiente, hasta el ltimo, cuya referencia al siguiente nodo tiene Pgina 3

Algortmica III

Compilador valor null. En problemas en los cuales el acceso al ltimo nodo debe ser eficiente, no solo se almacena una referencia al primer nodo, sino tambin al ltimo. En una lista enlazada el acceso al primer y ltimo nodo es muy eficiente. Sin embargo, el acceso a un nodo intermedio requiere recorrer la lista desde el principio hasta la posicin de dicho nodo. En muchos problemas, sin embargo, solo es necesario acceder a las posiciones de los extremos, por lo que esto no supone una limitacin.

Pila Se uso para guardar los arboles AVL Una pila (stack en ingls) es una lista ordinal o estructura de datos en la que el modo de acceso a sus elementos es de tipo LIFO (del ingls Last In First Out, ltimo en entrar, primero en salir) que permite almacenar y recuperar datos. Se aplica en multitud de ocasiones en informtica debido a su simplicidad y ordenacin implcita en la propia estructura. Para el manejo de los datos se cuenta con dos operaciones bsicas: apilar (push), que coloca un objeto en la pila, y su operacin inversa, retirar (o desapilar, pop), que retira el ltimo elemento apilado. En cada momento slo se tiene acceso a la parte superior de la pila, es decir, al ltimo objeto apilado (denominado TOS, Top of Stack en ingls). La operacin retirar permite la obtencin de este elemento, que es retirado de la pila permitiendo el acceso al siguiente (apilado con anterioridad), que pasa a ser el nuevo TOS. Por analoga con objetos cotidianos, una operacin apilar equivaldra a colocar un plato sobre una pila de platos, y una operacin retirar a retirarlo. Las pilas suelen emplearse en los siguientes contextos:

Evaluacin de expresiones en notacin postfija (notacin polaca inversa). Reconocedores sintcticos de lenguajes independientes del contexto Implementacin de recursividad.

Algortmica III

Pgina 4

Compilador

Cola

Las colas son secuencias de elementos caracterizadas porque las operaciones de insercin y borrado se realizan sobre extremos opuestos de la secuencia. La insercin se produce en el "final" de la secuencia, mientras que el borrado se realiza en el otro extremo, el "inicio" de la secuencia. Las restricciones definidas para una cola hacen que el primer elemento que se inserta en ella sea, igualmente, el primero en ser extraido de la estructura. Si una serie de elementos A, B, C, D, E se insertan en una cola en ese mismo orden, entonces los elementos irn saliendo de la cola en el orden en que entraron. Por esa razn, en ocasiones, las colas se conocen con el nombre de listas FIFO (First In First Out, el primero que entra es el primero que sale). Las colas, al igual que las pilas, resultan de aplicacin habitual en muchos problemas informticos. Quizs la aplicacin ms comn de las colas es la organizacin de tareas de un ordenador. En general, los trabajos enviados a un ordenador son "encolados" por ste, para ir procesando secuencialmente todos los trabajos en el mismo orden en que se reciben. Cuando el ordenador recibe el encargo de realizar una tarea, sta es almacenada al final de la cola de trabajos. En el momento que la tarea que estaba realizando el procesador acaba, ste selecciona la tarea situada al principio de la cola para ser ejecutada a continuacin.

Cola

Todo esto suponiendo la ausencia de prioridades en los trabajos. En caso contrario, existir una cola para cada prioridad. Del mismo modo, es necesaria una cola, por ejemplo, a la hora de gestionar eficientemente los trabajos que deben ser enviados a una impresora (o a casi cualquier dispositivo conectado a un ordenador). De esta manera, el ordenador controla el envio de trabajos al dispositivo, no enviando un trabajo hasta que la impresora no termine con el anterior. Anlogamente a las pilas, es necesario definir el conjunto de operaciones bsicas para especificar adecuadamente una estructura cola. Estas operaciones seran: Algortmica III Crear una cola vaca. Determinar si la cola est vaca, en cuyo caso no es posible eliminar elementos. Acceder al elemento inicial de la cola. Insertar elementos al final de la cola. Pgina 5

Compilador Eliminar elementos al inicio de la cola. Para determinar correctamente cada una de estas operaciones, es necesario especificar un tipo de representacin para las cola.

Arbol Binario

Los rboles son una de las estructuras de datos no lineales ms utilizada. Sirve para representar estructuras de informacin jerrquicas y direcciones o etiquetas de una manera organizada. Dentro de la ciencia de la computacin, los rboles tienen muchas aplicaciones como por ejemplo: organizar tablas de smbolos en compiladores representar tablas de decisin asignar bloques de memoria de tamao variable ordenar buscar solucionar juegos probar teoremas

Los rboles permiten representar situaciones de la vida diaria como son: organizacin de una empresa rbol genealgico de una persona organizacin de torneos deportivos

Arbol Binario

Los rboles binarios son el caso particular ms simple. Son usados para representar ciertos tipos de expresiones algebraicas, algoritmos, bsquedas y ordenamientos. Algortmica III Pgina 6

Compilador Definicin formal: Un conjunto T de elementos (nodos) es un rbol binario si: 1. T es vaco, o 2. T est particionado en 3 conjuntos disjuntos a) un solo elemento R, llamado la raz b) 2 conjuntos que son rboles binarios, llamados subrboles izquierdo y derecho de R de esta forma: T es un rbol binario si 1. T no tiene nodos, o 2. T es de la forma: donde n es un nodo y TI y TD son rboles binarios.

Arbol AVL

El rbol AVL toma su nombre de las iniciales de los apellidos de sus inventores, AdelsonVelskii y Landis. Lo dieron a conocer en la publicacin de un artculo en 1962: "An algorithm for the organization of information" ("Un algoritmo para la organizacin de la informacin"). Los rboles AVL estn siempre equilibrados de tal modo que para todos los nodos, la altura de la rama izquierda no difiere en ms de una unidad de la altura de la rama derecha. Gracias a esta forma de equilibrio (o balanceo), la complejidad de una bsqueda en uno de estos rboles se mantiene siempre en orden de complejidad O(log n). El factor de equilibrio puede ser almacenado directamente en cada nodo o ser computado a partir de las alturas de los subrboles. Para conseguir esta propiedad de equilibrio, la insercin y el borrado de los nodos se ha de realizar de una forma especial. Si al realizar una operacin de insercin o borrado se rompe la condicin de equilibrio, hay que realizar una serie de rotaciones de los nodos.

Algortmica III

Pgina 7

Compilador

Tabla Hash

Una tabla hash o mapa hash es una estructura de datos que asocia llaves o claves con valores. La operacin principal que soporta de manera eficiente es la bsqueda: permite el acceso a los elementos (telfono y direccin, por ejemplo) almacenados a partir de una clave generada (usando el nombre o nmero de cuenta, por ejemplo). Funciona transformando la clave con una funcin hash en un hash, un nmero que la tabla hash utiliza para localizar el valor deseado.

Las tablas hash se suelen implementar sobre vectores de una dimensin, aunque se pueden hacer implementaciones multi-dimensionales basadas en varias claves. Como en el caso de los arrays, las tablas hash proveen tiempo constante de bsqueda promedio O(1),[1] sin importar el nmero de elementos en la tabla. Sin embargo, en casos particularmente malos el tiempo de bsqueda puede llegar a O(n), es decir, en funcin del nmero de elementos. Comparada con otras estructuras de arrays asociadas, las tablas hash son ms tiles cuando se almacenan grandes cantidades de informacin. Las tablas hash almacenan la informacin en posiciones pseudo-aleatorias, as que el acceso ordenado a su contenido es bastante lento. Otras estructuras como rboles binarios auto-balanceables son ms rpidos en promedio (tiempo de bsqueda O(log n)) pero la informacin est ordenada en todo momento. Algortmica III Pgina 8

Compilador

Automatas finitos Un autmata finito (AF) o mquina de estado finito es un modelo matemtico que realiza cmputos en forma automtica sobre una entrada para producir una salida. Este modelo est conformado por un alfabeto, un conjunto de estados y un conjunto de transiciones entre dichos estados. Su funcionamiento se basa en una funcin de transicin, que recibe a partir de un estado inicial una cadena de caracteres pertenecientes al alfabeto (la entrada), y que va leyendo dicha cadena a medida que el autmata se desplaza de un estado a otro, para finalmente detenerse en un estado final o de aceptacin, que representa la salida. La finalidad de los autmatas finitos es la de reconocer lenguajes regulares, que corresponden a los lenguajes formales ms simples segn la Jerarqua de Chomsky.

Definicion formal Formalmente, un autmata finito (determinista) es una 5-tupla (Q, , q0, , F) donde: Q es un conjunto finito de datos es un alfabeto finito q0 Q, es el estado inicial : Q x Q, es una funcion de transicion F es un subconjunto de S, que contiene los estados finales o de aceptacion

Como funciona? En el comienzo del proceso de reconocimiento de una cadena de entrada, el AF se encuentra en el estado inicial y a medida que procesa cada smbolo de la cadena va cambiando de estado de acuerdo a lo determinado por la funcin de transicin. Cuando se ha procesado el ltimo de los smbolos de la cadena de entrada, el autmata se detiene. Si el estado en el que se detuvo es un estado de aceptacin, entonces la cadena pertenece al

Algortmica III

Pgina 9

Compilador lenguaje reconocido por el autmata; en caso contrario, la cadena no pertenece a dicho lenguaje. Note que el estado inicial q0 de un AF siempre es nico, en tanto que los estados finales pueden ser ms de uno, es decir, el conjunto F puede contener ms de un elemento. Tambin puede darse el caso de que un estado final corresponda al mismo estado inicial.

Representaciones 1. diagramas de estados Este autmata finito est definido sobre el alfabeto ={0,1}, posee dos estados s1 y s2, y sus transiciones son (s1,0)=s2, (s1,1)=s1, (s2,0)=s1 y (s2,1)=s2. Su estado inicial es s1, que es tambin su nico estado final. El lenguaje regular que reconoce puede expresarse mediante la expresin regular (00 | 11 | (01 | 10)(01 | 10)) * . Los autmatas finitos se pueden representar mediante grafos particulares, tambin llamados diagramas de estados finitos, de la siguiente manera:

Los estados se representan como vrtices, etiquetados con su nombre en el interior. Una transicin desde un estado a otro, dependiente de un smbolo del alfabeto, se representa mediante una arista dirigida que une a estos vrtices, y que est etiquetada con dicho smbolo. El estado inicial se caracteriza por tener una arista que llega a l, proveniente de ningn otro vrtice. El o los estados finales se representan mediante vrtices que estn encerrados a su vez por otra circunferencia.

Algortmica III

Pgina 10

Compilador

2. Tabla de transicin de estados Otra manera de describir el funcionamiento de un autmata finito es mediante el uso de tablas de transicin de estados. Dos posibles tablas para el ejemplo de la imagen anterior podran ser las siguientes:

Autmata finito no determinista Un autmata finito no determinista (abreviado AFND) es aquel que, a diferencia de los autmatas finitos deterministas, posee al menos un estado q Q, tal que para un smbolo a del alfabeto, existe ms de una transicin (q,a) posible. Haciendo la analoga con los AFDs, en un AFND puede darse cualquiera de estos dos casos:

Que existan transiciones del tipo (q,a)=q1 y (q,a)=q2, siendo q1 q2; Que existan transiciones del tipo (q,), siendo q un estado no-final, o bien un estado final pero con transiciones hacia otros estados.

Cuando se cumple el segundo caso, se dice que el autmata es un autmata finito no determinista con transiciones vacas o transiciones (abreviado AFND-). Estas

Algortmica III

Pgina 11

Compilador transiciones permiten al autmata cambiar de estado sin procesar ningn smbolo de entrada. Formalmente, se distingue de la 5-tupla que define a un autmata finito determinista en su funcin de transicin. Mientras en un AFD esta funcin se define de la siguiente manera:

en un AFND se define como:

Para el caso de los AFND-, se suele expresar la funcin de transicin de la forma:

donde P(Q) es el conjunto potencia de Q. Esto significa que los autmatas finitos deterministas son un caso particular de los no deterministas, puesto que Q pertenece al conjunto P(Q). La interpretacin que se suele hacer en el cmputo de un AFND es que el automta puede estar en varios estados a la vez, generndose una ramificacin de las configuraciones existentes en un momento dado. Otra interpretacin puede ser imaginar que la mquina "adivina" a qu estado debe ir, eligiendo una transicin entre varias posibles. Note finalmente que en un autmata finito no determinista podemos aceptar la existencia de ms de un nodo inicial, relajando an ms la definicin original.

Ejemplos: 1. AFND con transiciones (q0,b)=q0 y (q0,b)=q1, que acepta el lenguaje regular sobre el alfabeto {a,b} conformado por todas las palabras que terminan en b; es decir, que equivale a la expresin regular (a|b)*b+.

Algortmica III

Pgina 12

Compilador a. AFND- a cuyo estado 2 se puede acceder pasando por el estado 3, sin procesar smbolos de entrada.

Algortmica III

Pgina 13

Compilador

2.3 Descripcin del Proyecto:


El proyecto realizado es una aplicacin que tiene como principal meta el mostrar el funcionamiento de un compilador, emulando su comportamiento. Para ello utilizamos los conceptos definidos dentro de un compilador, Anlisis Lxico, Anlisis Sintctico y Anlisis Semntico. Cada uno de ellos fue analizado e implementado en el lenguaje java, haciendo uso de distintas herramientas lgicas, entre ellas los autmatas, la cual fue esencial para el desarrollo de cada uno de los Analizadores, as como tambin fueron indispensables los conocimientos adquiridos en cursos anteriores, sobre todo los conocimientos en Programacin Orientada a Objetos, no solo para el correcto manejo del lenguaje java sino tambin para el manejo de pseudocdigo OLoop. Podemos sealar que el uso de disco pseudocdigo fue alterado en cierta medida, a continuacin ilustraremos los cambios, as como tambin daremos algunas definiciones necesarias para el mejor entendimiento de este proyecto:

2.3.1

Pseudocdigo Empleado:

A.- DEFINICIONES:
1. Tokens Un token es el elemento ms pequeo de un programa que es significativo para el compilador. Cuando se compila un programa, el compilador analiza el texto, reconoce y elimina los espacios en blanco y comentarios y extrae tokens individuales. Los tokens resultantes se compilan traducindolos, que es independiente del sistema e interpretable dentro de un entorno. Los tokens pueden subdividirse en categoras: Identificadores, palabras clave, operadores y separadores. a.) Identificadores Los identificadores son tokens que representan nombres asignables a variables, mtodos y clases para identificarlos de forma nica ante el compilador y darles nombres con sentido para el programador. Todos los identificadores de Java diferencian entre maysculas y minsculas (Java es Case Sensitive o Sensible a maysculas) y deben comenzar con una letra, un subrayado (_) o smbolo de dlar($). Los caracteres posteriores del identificador pueden incluir las cifras del 0 al 9. Como nombres de identificadores no se pueden usar palabras claves de Java.

Algortmica III

Pgina 14

Compilador Sin entrar en ms detalle en la siguiente lnea de cdigo se puede apreciar la declaracin de una variable entera: alturaMedia b.) Palabras clave Las palabras claves son aquellos identificadores reservados para un objetivo determinado y se usan slo de la forma limitada y especfica. Las siguientes palabras son palabras reservadas:

booleano Repetir Para Retornar hacer fmientras hasta CArreglo


d.) Operadores

Caso real Si VERDAD desde fpara Metodos

carcter sino entero Mientras Metodo fclase Alternativas

Clase viene_de ejemplar_de cadena fsi vale Atributos

otro FALSO NULO Objeto fmetodo fcaso entonces

Conocidos tambin como operandos, indican una evaluacin o computacin para ser realizada en objetos o datos, y en definitiva sobre identificadores o constantes. Los operadores admitidos son:

+ NO = ] )

<= >= [ MOD

++ . DIV

< * O <>

Y > (

As por ejemplo el siguiente fragmento de cdigo incrementa el valor de una variable en dos unidades, mediante la utilizacin del operador aritmtico + que se utiliza para la suma: miNumero 0 miNumero miNumero + 2 Algortmica III Pgina 15

Compilador e.) Comentarios y espacios en blanco El compilador reconoce y elimina los espacios en blanco, tabuladores, retornos de carro y comentarios durante el anlisis del cdigo. Los comentarios se pueden presentar en formatos distintos: Formato /*comentario*/ //comentario Uso Se ignoran todos los caracteres entre /* */. Se ignoran todos los caracteres detrs de // hasta el fin de lnea.

Por ejemplo la siguiente lnea de cdigo presenta un comentario: alturaMinima 150 // No menos de 150 centmetros 2. Expresiones Los operadores, variables y las llamadas a mtodos pueden ser combinados en secuencias conocidas como expresiones. El comportamiento real de un programa se logra a travs de expresiones, que se agrupan para crear sentencias. Una expresin es una serie de variables, operadores y llamadas a mtodos (construida conforme a la sintaxis del lenguaje) que se evala a un nico valor. Por ejemplo, la siguiente sentencia es una expresin: contador1 contador++ 3. Bloques y mbito El codigo fuente est dividido en partes separadas por bloques. Cada bloque existe independiente de lo que est fuera de l, agrupando en su interior sentencias (expresiones) relacionadas. Desde un bloque externo parece que todo lo que est dentro de los bloques se ejecuta como una sentencia. Pero, qu es un bloque externo? Esto tiene explicacin si entendemos que existe una jerarqua de bloques, y que un bloque puede contener uno o ms subbloques anidados. El concepto de mbito est estrechamente relacionado con el concepto de bloque y es muy importante cuando se trabaja con variables en Java. El mbito se refiere a Pgina 16

Algortmica III

Compilador cmo las secciones de un programa (bloques) afectan el tiempo de vida de las variables. Toda variable tiene un mbito, en el que es usada, que viene determinado por los bloques. Una variable definida en un bloque interno no es visible por el bloque externo. Las palabras de separacin(entonces-fsi, hacer-fmientras, hacer-fpara, etc) son importantes no slo en un sentido lgico, ya que son la forma de que el compilador diferencie dnde acaba una seccin de cdigo y dnde comienza otra, sino que tienen una connotacin esttica que facilita la lectura de los programas al ser humano. As mismo, para identificar los diferentes bloques se utilizan sangras. Las sangras se utilizan para el programador, no para el compilador. La sangra (tambin denominada indentacin) ms adecuada para la esttica de un programa son dos espacios: Metodo // Bloque externo x 1 Si // Bloque interno invisible al exterior y 2 fsi x y // Da error: Y fuera de mbito fmetodo

B.- TIPOS DE DATOS:


A. Tipos de datos simples Es uno de los conceptos fundamentales de cualquier lenguaje de programacin. Estos definen los mtodos de almacenamiento disponibles para representar informacin, junto con la manera en que dicha informacin ha de ser interpretada.

Algortmica III

Pgina 17

Compilador Para crear una variable (de un tipo simple) en memoria debe declararse indicando su identificador que la identificar de forma nica. La sintaxis de declaracin de variables es la siguiente: Identificador1 Identificador2 Esta sentencia indica al compilador que reserve memoria para dos variables con nombres Identificador1 e Identificador2. Los tipos de datos en Java pueden dividirse en dos categoras: simples y compuestos. Los simples son tipos nucleares que no se derivan de otros tipos, como los enteros, de coma flotante, booleanos y de carcter. Los tipos compuestos se basan en los tipos simples, e incluyen las cadenas, las matrices y tanto las clases como las interfaces, en general. Cada tipo de datos simple soporta un conjunto de literales que le pueden ser asignados, para darles valor. En este apartado se explican los tipos de datos simples (o primitivos), as como los literales que soporta (sintaxis de los valores que se les puede asignar). a.) Tipos de datos enteros Se usan para representar nmeros enteros con signo.

Tipo entero

Tamao 4 Bytes (32 bits)

La declaracin de variables enteras es muy sencilla. Un ejemplo de ello sera: Numero 12 b.) Tipos de datos en coma flotante Se usan para representar nmeros con partes fraccionarias.

Tipo real

Tamao 8 Bytes (64 bits)

Tabla 6: Tipos de datos numricos en coma flotante


La declaracin de variables de coma flotante es muy similar a la de las variables enteras. Por ejemplo: Algortmica III Pgina 18

Compilador miPi 3.1416 // Aproximadamente

c.) Tipo de datos booleanos

Se usa para almacenar variables que presenten dos estados, que sern representados por los valores VERDAD y FALSO. Representan valores bi-estado, provenientes del denominado lgebra de Boole. reciboPagado FALSO // Aun no nos han pagado?!
d.) Tipo de datos carcter

Se usa para almacenar caracteres Unicode simples. Debido a que el conjunto de caracteres Unicode se compone de valores de 16 bits, el tipo de datos caracter se almacena en un entero sin signo de 16 bits. Las variables de tipo carcter se declaran de la siguiente forma: letraMayuscula 'A' // Observe la necesidad de las ' '.

B. Vectores y Matrices
Una matriz es una construccin que proporciona almacenaje a una lista de elementos del mismo tipo, ya sea simple o compuesto. Si la matriz tiene solo una dimensin, se la denomina vector. A Dimension [14,18,19] ejemplar_de CArreglo C. Cadenas Se tratan como una clase especial llamada cadena. Las cadenas se gestionan internamente por medio de una instancia de la clase String. Una instancia de la clase String es un objeto que ha sido creado siguiendo la descripcin de la clase. Cadenas constantes Representan mltiples caracteres y aparecen dentro de un par de comillas dobles. Vemos un ejemplo de cadena declarada: capitalUSA "Washington D.C." nombreBonito "Amelia"

Algortmica III

Pgina 19

Compilador

C.- OPERADORES
A. Introduccin Los operadores son un tipo de tokens que indican una evaluacin o computacin para ser realizada en objetos o datos, y en definitiva sobre identificadores o constantes. Adems de realizar la operacin, un operador devuelve un valor, ya que son parte fundamental de las expresiones. El valor y tipo que devuelve depende del operador y del tipo de sus operandos. Por ejemplo, los operadores aritmticos devuelven un nmero como resultado de su operacin. Los operadores realizan alguna funcin sobre uno, dos o tres operandos. Los operadores que requieren un operando son llamados operadores unarios. Por ejemplo, el operador "++" es un operador unario que incrementa el valor de su operando en una unidad. Los operadores unarios en Java pueden utilizar tanto la notacin prefija como la posfija. La notacin prefija indica que el operador aparece antes que su operando. ++contador // Notacin prefija, se evala a: contador+1 La notacin posfija indica que el operador aparece despus de su operando: contador++ // Notacin posfija, se evala a: contador Los operadores que requieren dos operandos se llaman operadores binarios. Por ejemplo el operador "" es un operador binario que asigna el valor del operando del lado derecho al operando del lado izquierdo. Todos los operadores binarios en Java utilizan notacin infija, lo cual indica que el operador aparece entre sus operandos. operando1 operador operando2 B. Operadores aritmticos Se soporta varios operadores aritmticos para los nmeros enteros y en coma flotante. Se incluye + (suma), - (resta), * (multiplicacin), DIV (divisin), y MOD (mdulo, es decir, resto de una divisin entera). Por ejemplo:

Algortmica III

Pgina 20

Compilador sumaEste + aEste //Suma los dos enteros

divideEste MOD entreEste; //Calcula el resto de dividir 2 enteros

Operador Uso Descripcin + op1 + op2 Suma op1 y op2 op1 - op2 Resta op2 de op1 * op1 * op2 Multiplica op1 por op2 DIV op1 DIV op2 Divide op1 por op2 MOD op1 MOD op2 Calcula el resto de dividir op1 entre op2
El tipo de los datos devueltos por una operacin aritmtica depende del tipo de sus operandos; si se suman dos enteros, se obtiene un entero como tipo devuelto con el valor de la suma de los dos enteros. Estos operadores se deben utilizar con operandos del mismo tipo, o si no realizar una conversin de tipos de uno de los dos operandos al tipo del otro. Los operadores + y - tienen versiones unarias que realizan las siguientes operaciones:

Operador + -

Uso +op -op

Descripcin Convierte op a entero si es un byte, o char Niega aritmticamente op

El operador - realiza una negacin del nmero en complemento A2, es decir, cambiando de valor todos sus bits y sumando 1 al resultado final: 42 -> 00101010 -42 -> 11010110 Existen dos operadores aritmticos que funcionan como atajo de la combinacin de otros: ++ que incrementa su operando en 1, y -- que decrementa su operando en 1. Ambos operadores tienen una versin prefija, y otra posfija. La utilizacin la correcta es crtica en situaciones donde el valor de la sentencia es utilizado en mitad de un clculo ms complejo, por ejemplo para control de flujos:

Algortmica III

Pgina 21

Compilador

Operador Uso ++ ++ --op++ ++op op---op

Descripcin Incrementa op en 1; se evala al valor anterior al incremento Incrementa op en 1; se evala al valor posterior al incremento Decrementa op en 1; se evala al valor anterior al incremento Decrementa op en 1; se evala al valor posterior al incremento

C. Operadores de comparacin y condicionales Un operador de comparacin compara dos valores y determina la relacin existente entre ambos. Por ejemplo, el operador <> devuelve verdadero (true) si los dos operandos son distintos. La siguiente tabla resume los operadores de comparacin del Pseudocodigo :

Operador Uso > op1 > op2 >= op1 >= op2 < op1 < op2 <= op1 <= op2 = op1 = op2 <> op1 <> op2

Devuelve verdadero si op1 es mayor que op2 op1 es mayor o igual que op2 op1 es menor que op2 op1 es menor o igual que op2 op1 y op2 son iguales op1 y op2 son distintos

Los operadores de comparacin suelen ser usados con los operadores condicionales para construir expresiones complejas que sirvan para la toma de decisiones. Un operador de este tipo es Y, el cual realiza la operacin booleana and. Por ejemplo, se pueden utilizar dos operaciones diferentes de comparacin con Y para determinar si ambas relaciones son ciertas. La siguiente lnea de cdigo utiliza esta tcnica para determinar si la variable index de una matriz se encuentra entre dos lmites (mayor que cero y menor que la constante NUMERO_ENTRADAS): ( 0 < index ) Y ( index < NUMERO_ENTRADAS ) Se debe tener en cuenta que en algunos casos, el segundo operando de un operador condicional puede no ser evaluado. En caso de que el primer operando del operador Y valga falso, Java no evaluar el operando de la derecha: (contador < NUMERO_ENTRADAS) Y (valor <> -1 ) Si contador es menor que NUMERO_ENTRADAS, el valor de retorno de Y puede ser determinado sin evaluar el operando de la parte derecha. En este caso la otra expresin no ser evaluada. De la misma manera se relacionan el operador O para la exclusin lgica (OR). Pgina 22

Algortmica III

Compilador

Operador Y O NO

Uso

Devuelve verdadero si...

op1 Y op2 op1 y op2 son verdaderos, condicionalmente evala op2 op1 Oop2 op1 o op2 son verdaderos, condicionalmente evala op2 NO op op es falso

D. Operadores de asignacin El operador de asignacin bsico es el , que se utiliza para asignar un valor a otro. Por ejemplo: contador 0 Inicia la variable contador con un valor 0. Java adems proporciona varios operadores de asignacin que permiten realizar un atajo en la escritura de cdigo. Permiten realizar operaciones aritmticas, lgicas, de bit y de asignacin con un nico operador. Supongamos que necesitamos sumar un nmero a una variable y almacenar el resultado en la misma variable, como a continuacin: i i + 2 E. Prioridad de operadores Cuando en una sentencia aparecen varios operadores el compilador deber de elegir en qu orden aplica los operadores. A esto se le llama precedencia o proridad. Los operadores con mayor prioridad son evaluados antes que los operadores con una prioridad relativa menor. Cuando en una sentencia aparecen operadores con la misma prioridad:

Los operadores de asignacin son evaluados de derecha a izquierda. Los operadores binarios, (menos los de asignacin) son evaluados de izquierda a derecha.

Se puede indicar explcitamente al compilador cmo se desea que se evale la expresin con parntesis balanceados ( ). Para hacer que el cdigo sea ms fcil de leer y mantener, es preferible ser explcito e indicar con parntesis que operadores deben ser evaluados primero. La siguiente tabla muestra la prioridad asignada a los operadores.

Algortmica III

Pgina 23

Compilador

Tipo de operadores Multiplicacin pioridad:2 Suma pioridad:1 AND pioridad:1 OR lgico pioridad:2

Operadores de este tipo * DIV MOD +Y O

Por ejemplo, la siguiente expresin produce un resultado diferente dependiendo de si se realiza la suma o divisin en primer lugar: x + y DIV 100 Si no se indica explcitamente al compilador el orden en que se quiere que se realicen las operaciones, entonces el compilador decide basndose en la prioridad asignada a los operadores. Como el operador de divisin tiene mayor prioridad que el operador de suma el compilador evaluar y DIV 100 primero. As: x + y DIV 100 Es equivalente a: x + (y DIV 100)

D.- ESTRUCTURAS DE CONTROL:


A. Introduccin El Pseudocdigo soporta las estructuras de control:

Sentencia Toma de decisin Bucle Miscelneo

Clave Si-sino, Caso-Alternativa Para, Mientras, Repetir-hasta Retornar

Algortmica III

Pgina 24

Compilador B. Las sentencias condicionales: Si y Caso a.) La sentencia Si-sino La sentencia Si-sino dota a los programas de la habilidad de ejecutar distintos conjuntos de sentencias segn algn criterio. La sintaxis de la sentencia Si-sino es: Si( condicin ) entonces // Bloque de cdigo a ejecutar si la condicin es cierta sino // Bloque de cdigo a ejecutar si la condicin es falsa fsi La parte del sino es opcional, y un bloque de cdigo puede ser simplemente la sentencia vaca; para representar que en ese caso no se ha de ejecutar nada. b.) La sentencia Caso Mediante la sentencia Caso se puede seleccionar entre varias sentencias segn el valor de cierta expresin. La forma general de Caso es la siguiente: Caso ( expresin Multivalor ) vale Alternativa valor1 : conjuntoDeSentencias Alternativa valor2 : conjuntoDeSentencias Alternativa valor3: conjuntoDeSentencias otro: conjuntoDeSentencias fcaso La sentencia Caso evala la expresin Multivalor y ejecuta el conjuntoDeSentencias que aparece junto a la clusula case cuyo valor corresponda con el de la expresin Multivalor.

Algortmica III

Pgina 25

Compilador Cada sentencia case debe ser nica y el valor que evala debe ser del mismo tipo que el devuelto por la expresin Multivalor de la sentencia Caso. Finalmente, se puede usar la sentencia otro para manejar los valores que no son explcitamente contemplados por alguna de las sentencias Alternativa. C. Sentencias de iteracin o bucles: Para, Repetir, Mientras a.) Bucle Mientras El bucle Mientras es el bucle bsico de iteracin. Sirve para realizar una accin sucesivamente mientras se cumpla una determinada condicin. La forma general del bucle Mientras es la siguiente: Mientras ( expresin Booleana ) hacer // sentencias fmientras Las sentencias se ejecutan mientras la expresin Booleana tenga un valor de verdadero. b.) Bucle Repetir-hasta El bucle Repetir-hasta es similar al bucle Mientras, pero en el bucle Mientras la expresin se evala al principio del bucle y en el bucle Repetir-hasta la evaluacin se realiza al final. La forma general del bucle Repetir-hasta es la siguiente: Repetir // sentencias

hasta ( expresinBooleana ) La sentencia Repetir-hasta es el constructor de bucles menos utilizado en la programacin, pero tiene sus usos, cuando el bucle deba ser ejecutado por lo menos una vez.

Algortmica III

Pgina 26

Compilador c.) Bucle Para Mediante la sentencia Para se resume un bucle Repetir-hasta con una iniciacin previa. Es muy comn que en los bucles Mientras y Repetir-hasta se inicien las variables de control de nmero de pasadas por el bucle, inmediatamente antes de comenzar los bucles. Por eso el bucle Para est tan extendido. La forma general de la sentencia Para es la siguiente: Para valor desde iniciacin hasta terminacin hacer // sentencias fpara La iniciacin es una sentencia que se ejecuta una vez antes de entrar en el bucle. La terminacin es una expresin que determina cundo se debe terminar el bucle. Esta expresin se evala al final de cada iteracin del bucle. Cuando la expresin se evala a falso, el bucle termina. D. Sentencias de salto: Retornar a.) Sentencia Retornar La sentencia Retornar, que puede usar para salir del mtodo en curso y retornar a la sentencia dentro de la cual se realiz la llamada. Para devolver un valor, simplemente se debe poner el valor (o una expresin que calcule el valor) a continuacin de la palabra Retornar. El valor devuelto por Retornar debe coincidir con el tipo declarado como valor de retorno del mtodo. contador 0 Metodo Numero.devuelveContadorIncrementado Retornar ++contador fmetodo

Algortmica III

Pgina 27

Compilador

E.- CLASES Y OBJETOS


A. Introduccin Clase MiClase Atributos nombre_de_atributo1 nombre_de_atributo2 Metodos metodo1 metodo2 fclase Metodo MiClase.mtodo1( lista_de_parmetros ) cuerpo_del_mtodo1 fmetodo Metodo MiClase.mtodo2( lista_de_parmetros ) { cuerpo_del_mtodo2; fmetodo B. Definicin de una clase, Atributos, Metodos a.) Introduccin Clase MiPunto Atributos X Y Metodos

Algortmica III

Pgina 28

Compilador suma(paramX,paramY) fclase Metodo MiPunto.suma(paramX,paramY) Retornar ( paramX + paramY ) fmetodo C. La instanciacin de las clases: Los objetos a.) Referencias a Objeto e Instancias Objeto p ejemplar_de MiPunto b.) Constructores Metodo MiPunto.Constructor x -1 y -1 fmetodo Este constructor denominado constructor por defecto, por no tener parmetros, establece el valor -1 a las variables de instancia x e y de los objetos que construya. Este otro constructor, sin embargo, recibe dos parmetros: Metodo MiPunto.Constructor(paraX, paraY) x paraX y paraY fmetodo D. Acceso al objeto a.) El operador punto (.) El operador punto (.) se utiliza para acceder a las variables de instancia y los mtodos contenidos en un objeto, mediante su referencia a objeto: Objeto p6 ejemplar_de MiPunto

Algortmica III

Pgina 29

Compilador p6.x 10 p6.y 20

F.- LA HERENCIA
A. Introduccin La verdadera potencia de la programacin orientada a objetos radica en su capacidad para reflejar la abstraccin que el cerebro humano realiza automticamente durante el proceso de aprendizaje y el proceso de anlisis de informacin. B. Jerarqua La herencia es el mecanismo fundamental de relacin entre clases en la orientacin a objetos. Relaciona las clases de manera jerrquica; una clase padre o superclase sobre otras clases hijas o subclases.

Los descendientes de una clase heredan todas las variables y mtodos que sus ascendientes hayan especificado como heredables, adems de crear los suyos propios. La caracterstica de herencia, nos permite definir nuevas clases derivadas de otra ya existente, que la especializan de alguna manera. As logramos definir una jerarqua de clases, que se puede mostrar mediante un rbol de herencia. En todo lenguaje orientado a objetos existe una jerarqua, mediante la que las clases se relacionan en trminos de herencia. En Java, el punto ms alto de la jerarqua es la clase Object de la cual derivan todas las dems clases. C. Declaracin Para indicar que una clase deriva de otra, heredando sus propiedades (mtodos y atributos), se usa el trmino viene_de, como en el siguiente ejemplo: Clase SubClase viene_de SuperClase // Contenido de la clase fclase Algortmica III Pgina 30

Compilador

Por ejemplo, creamos una clase MiPunto3D, hija de la clase ya mostrada MiPunto: Clase MiPunto3D viene_de MiPunto Atributos Z Metodos Constructor fclase Metodo MiPunto3D.Constructor x = 0 // Heredado de MiPunto y = 0 // Heredado de MiPunto z = 0 // Nuevo atributo fmetodo La palabra clave viene_de se utiliza para decir que deseamos crear una subclase de la clase que es nombrada a continuacin, en nuestro caso MiPunto3D es hija de MiPunto.

Algortmica III

Pgina 31

Compilador

2.3.2 Autmatas Empleados:


En el proyecto fueron empleados Autmatas con la finalidad de permitir el manejo de analizadores reconocer las cadenas correctas para cumplir las reglas establecidas por el pseudocdigo que acaba de ser explicado, a travs de los analizadores lxico y semntico vemos que sean ingresadas las cadenas correctas y en el orden correcto, y luego sean revisadas por el analizador semntico que se encargara de verificar que el tipo de dato ingresado sea correcto, as a continuacin presentamos, de manera grafica, los autmatas empleados en el proyecto: 1. Analizador Lxico: Autmata Lxico:

Algortmica III

Pgina 32

Compilador

2.

Analizador Sintctico:

Autmata de declaracin de Clases:

Autmata del Cuerpo de una Clase:

Algortmica III

Pgina 33

Compilador

Autmata del Sector de Atributos de una Clase:

Autmata del Sector de Mtodos de una Clase:

Algortmica III

Pgina 34

Compilador

Autmata del cuerpo de un mtodo:

Autmata del proceso de Asignacin:

Algortmica III

Pgina 35

Compilador

Autmata de Declaracin de un Arreglo:

Autmata de Declaracin de un Objeto:

Algortmica III

Pgina 36

Compilador

Autmata de la Estructura de control Si:

Autmata de la Estructura de Control Caso:

Algortmica III

Pgina 37

Compilador

Autmata de la Estructura de Control Mientras:

Autmata de la Estructura de Control Para:

Algortmica III

Pgina 38

Compilador

Autmata de la estructura de Control Repetir:

Como dato podemos agregar que el proyecto tambin consta de una interface que permite la interaccin del usuario con la lgica aqu referenciada. Todo lo referente a la interfaz grafica ser visto en la parte Gua de Usuario. En dicha interface el usuario podr verificar la reglas establecidas por el pseudocdigo lneas arribas definidas y vera la aplicacin completa de los autmatas al ingresar cdigo y ejecutarlo. Podr ver como se sealan los errores y como se muestra el resultado final del programa, una traduccin del pseudocdigo al lenguaje java.

Algortmica III

Pgina 39

Compilador

2.4 Conjuntos de Datos de Prueba de Entrada y Salida del Sistema:


Ejemplo 1 Entrada: Clase Punto Atributos x y Metodos dameX dameY suma(x2,y2) fclase Clase Circulo viene_de Punto Atributos R Metodos area fclase Metodo Punto.dameX x1 vx Si x<0 entonces v0 m7 p7 fsi Algortmica III Pgina 40

Compilador Retornar v fmetodo Metodo Punto.dameY Retornar y fmetodo Metodo Punto.suma(x2,y2) Objeto p ejemplar_de Punto p.xx+x2+1 p.yy+y2+1 Retornar p fmetodo Metodo Circulo.area s0 Pi3 Para i desde 1 hasta R5 hacer ss+Pi*R fpara Retornar s fmetodo

Algortmica III

Pgina 41

Compilador

Salida:

class Punto{ int x; int y; public int dameX(){ int v; x=1; v=x; if(x<0){ int m; int p; v=0; m=7; p=7; } return v; } public void dameY(){ return y; } public Punto suma(int x2,int y2){ Punto p; Punto p= new Punto(); p.x=x+x2+1; Pgina 42

Algortmica III

Compilador p.y=y+y2+1; return p; } }

public class Circulo extends Punto{ int R; public int area(){ int Pi; int i; int s; s=0; Pi=3; for(int i=1;i<R=5;i++){ s=s+Pi*R; } return s; } }

Algortmica III

Pgina 43

Compilador Ejemplo 2 Entrada: Clase CNumero Atributos F Dimension [1...100] ejemplar_de CArreglo Metodos fibonacci(n) init fclase Metodo CNumero.fibonacci(n) fibo0 Si n+0<=1 entonces fibo1 Sino F[1]1 F[2]1 Para i desde 2 hasta n hacer F[i]F[i-1]+F[i-2] fpara fiboF[n] fsi Retornar fibo fmetodo Metodo CNumero.init fibonacci(10) fmetodo Algortmica III Pgina 44

Compilador

Salida:

class CNumero{ CArreglo F[]= new CArreglo[100]; public int fibonacci(int n){ int fibo; fibo=0; if(n<=1){ fibo=1; }else{ F[1-1]=1; F[2-1]=1; for(int i=2;i<n;i++){ int i; F[i-1]=F[i-1-1]+F[i-2-1] fpara; fibo=F[n-1]; } return fibo; } public void init(){ fibonacci(10) } }

Algortmica III

Pgina 45

Compilador

2.5 Gua de referencia de las bibliotecas de clases:

Algortmica III

Pgina 46

Compilador

2.6 Bibliografa: Libros: - Compiladores e intrpretes (teora y prctica), Manuel Alfonseca Moreno, Marina de la Cruz Echandia, Alfonso Ortega de la Puente, Estrella Pulido Caabete, Pearson Prentice Hall. Pginas Web: - http://www.monografias.com/trabajos44/pilas-listas-expresiones/pilas-listasexpresiones2.shtml - www.jc-info.blogspot.com - www.tecnologiaalrojovivo.blogspot.com - http://www.programacion.com/articulo/java_3d_169/8 - http://www.sc.ehu.es/sbweb/fisica/cursoJava/fundamentos/clases1/string.htm - http://www.flexerasoftware.com/products/installshield.htm - http://decsai.ugr.es/~jfv/ed1/tedi/cdrom/docs/tablash.html - http://www.sc.ehu.es/sbweb/fisica/cursoJava/fundamentos/clases1/string.htm - http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=jsmooth - http://decsai.ugr.es/~jfv/ed1/tedi/cdrom/docs/Ej_AVL3.htm - http://todojava.awardspace.com/ejemplos - http://www.lcc.uma.es/~galvez/Compiladores.html

Algortmica III

Pgina 47

Compilador

2.7 Conclusiones y Recomendaciones

Como conclusiones podemos sealar: Que el proyecto ha sido de gran utilidad para el desarrollo de nuestras habilidades de programacin, nos ha permitido no solo mejorar la lgica sino tambin entender de mejor manera la funcin que corresponde a un compilador. Esto era necesario puesto que un compilador cumple con una importante funcin en los programas de la actualidad. El proyecto tambin ha sido importante para que se muestren nuestras habilidades de trabajo en grupo. La Cooperacin ha sido un elemento fundamental en el desarrollo de este proyecto. La divisin de trabajo fue un punto esencial al momento de desarrollarlo y as mismo la colaboracin entre miembros del equipo fue fundamental. Otra conclusin que nos deja el proyecto es que, fueron indispensables, los conocimientos adquiridos en los cursos anteriores sobre todo los desarrollados en los cursos de Algortmica y ms aun los que nos permitieron el manejo de la Programacin Orientada a Objetos, y no solo para el desarrollo en si del programa sino tambin para el desarrollo del Pseudocdigo de manera de hacerlo lo ms manejable posible para el usuario. Como conclusin final podemos sealar, que el proyecto ha sido un verdadero reto para el grupo de alumnos participantes de este equipo de de trabajo, nos obligo a aprender nuevos conceptos como el de autmata y el de lo que es en s un compilador, as como tambin entender lo que realmente significa el trabajo en equipo, ya que fue absolutamente necesaria la participacin activa de cada uno de los miembros, cada uno de ellos aportando un poco en cada etapa del desarrollo del proyecto.

Como recomendacin podemos sealar: Como una nica recomendacin, podemos sealar que aunque el proyecto fue importante en el desarrollo de nuestras habilidades y en el hecho de haber aprendido lo que es realmente un compilador, hubiera sido ms recomendable un proyecto con mayor relacin con el curso, es decir un proyecto en donde podamos aplicar de manera indispensable lo aprendido hasta ahora en el curso.

Algortmica III

Pgina 48