Pro Yec to Micro Ada

20
Universidad Nacional de San Agustín Escuela Profesional de Ingeniería de Sistemas Compiladores M.Sc. Percy Huertas Niquén Proyecto Final Micro ADA Generalidades Este resumen presenta las principales características de µADA que hay que implementar para el Proyecto de la asignatura de Compiladores. No es necesario considerar los elementos de ADA no mencionados en este resumen. Entre corchetes se dan indicaciones sobre la obligatoriedad u opcionalidad de algunas partes del lenguaje. Con el fin de facilitar la implementación del compilador, las características mostradas en esta página pueden no coincidir al 100% con el estándar del lenguaje, por lo que, en caso de duda, se deberá implementar el comportamiento aquí descrito. µADA es un lenguaje en el que se diferencian las minúsculas y las mayúsculas (es case sensitive). También es un lenguaje de formato libre, es decir, que se admiten espacios, tabuladores, saltos de línea y comentarios en cualquier parte del código. Cada instrucción puede ocupar una o varias líneas. Las sentencias y declaraciones terminan siempre en un punto y coma (;) Las palabras clave que tiene el lenguaje son reservadas, aunque cada grupo de alumnos sólo ha de tener en cuenta las palabras asignadas a su grupo. µADA es un lenguaje con estructura de bloques que se definen mediante la utilización de las llaves { } y, por

description

compilador basado en ADA

Transcript of Pro Yec to Micro Ada

Universidad Nacional de San Agustn

Escuela Profesional de Ingeniera de Sistemas

CompiladoresM.Sc. Percy Huertas NiqunProyecto FinalMicro ADAGeneralidades

Este resumen presenta las principales caractersticas de ADA que hay que implementar para el Proyecto de la asignatura de Compiladores. No es necesario considerar los elementos de ADA no mencionados en este resumen. Entre corchetes se dan indicaciones sobre la obligatoriedad u opcionalidad de algunas partes del lenguaje. Con el fin de facilitar la implementacin del compilador, las caractersticas mostradas en esta pgina pueden no coincidir al 100% con el estndar del lenguaje, por lo que, en caso de duda, se deber implementar el comportamiento aqu descrito.

ADA es un lenguaje en el que se diferencian las minsculas y las maysculas (es case sensitive). Tambin es un lenguaje de formato libre, es decir, que se admiten espacios, tabuladores, saltos de lnea y comentarios en cualquier parte del cdigo. Cada instruccin puede ocupar una o varias lneas. Las sentencias y declaraciones terminan siempre en un punto y coma (;)

Las palabras clave que tiene el lenguaje son reservadas, aunque cada grupo de alumnos slo ha de tener en cuenta las palabras asignadas a su grupo.

ADA es un lenguaje con estructura de bloques que se definen mediante la utilizacin de las llaves { } y, por tanto, maneja los conceptos de nombres globales y locales. Los nombres declarados fuera de cualquier funcin son globales y pueden ser utilizados desde cualquier funcin. Los declarados en el interior de una funcin son locales a dicha funcin.

En ADA es necesario declarar los identificadores antes de que se utilicen. Adems, hay que implementar el Compilador de ADA considerando que es un lenguaje con recursividad, por lo que cualquier funcin puede ser recursiva. No se permite la definicin de funciones anidadas. El paso de parmetros es por valor, salvo para cadenas y vectores, que es por referencia.

Estructura de un Programa

Para el Proyecto de Compiladores debe considerarse que un programa en ADA estar compuesto por un nico fichero que ha de tener una serie de funciones, siendo una de ellas la funcin principal. Adems, fuera de las funciones se podrn declarar variables globales y tipos de datos.

Programa Principal

El programa principal (el que se ejecutar al arrancar el programa) ser una funcin especial que recibe el nombre de principal, que no puede llevar argumentos y tiene que ser de tipo vacio:

vacio principal (vacio)

{

implementacin_de_la_funcin_principal;

}

Comentarios

En ADA los comentarios se indican con los caracteres /* para abrir el comentario, y con los caracteres */ para cerrarlo. No se admiten comentarios anidados. Los comentarios pueden ocupar ms de una lnea y pueden ir colocados en cualquier parte del cdigo donde pueda ir un espacio:

/* Comentario con apertura y cierre */Constantes

El lenguaje dispone de varios tipos de constantes, de las cuales solamente habr que tener en cuenta las siguientes:

Enteros

Las constantes enteras se escribirn en notacin decimal sin signo (por ejemplo, 159, 0). El ensamblador que se utilizar dispone de nmeros enteros de 2 bytes (con signo), por lo que el mximo entero ser el 32767.

El lenguaje tambin dispone de constantes enteras en notacin octal (usando como prefijo un cero: 052) y en notacin hexadecimal (usando como prefijo un cero y una equis: 0x1E4). [La implementacin de la notacin octal y hexadecimal es opcional.]

Cadenas de Caracteres

Las constantes de cadena consisten en una secuencia de caracteres encerrados entre comillas ("Hola, mundo!"). Las cadenas utilizan el carcter nulo (cuyo cdigo ASCII es 0) como carcter de fin de cadena. Puede aparecer cualquier carcter imprimible en la cadena. Para representar caracteres especiales se utiliza una secuencia de escape, que comienza mediante el carcter barra inversa y va seguido de un carcter. Algunos de estos caracteres especiales son el salto de lnea (\n), el tabulador (\t), el carcter nulo (\0), las comillas dobles (\") o el carcter de barra inversa (\\). Por ejemplo, la constante "Hola, \"Compiladores\"!" representa a la cadena Hola, "Compiladores"!. [Esta implementacin de las secuencias de escape es opcional.]

Lgicas

En ADA no hay constantes lgicas propiamente dichas. Cualquier expresin que se evale como 0 se considera como falso, y cualquier expresin que se evale con un valor distinto a 0 se considera verdadera.

Operadores

Este lenguaje presenta un conjunto de operadores con los que escribir distintas expresiones. Adems, se pueden utilizar los parntesis para agrupar subexpresiones.

Operadores Aritmticos

Son los operadores que permiten realizar la suma, resta, producto, divisin y mdulo: +, -, *, / y % [obligatorio implementar al menos uno]. Se aplican sobre datos enteros, proporcionando un resultado entero.

Tambin existen los operadores ms y menos unarios: +, - [implementacin opcional].

Operadores de Relacin

Son los operadores que permiten realizar las comparaciones de igual, distinto, menor, mayor, menor o igual, mayor o igual: ==, !=, , = [obligatorio implementar todos los operadores]. Se aplican sobre datos enteros y proporcionan un resultado lgico (0 si es falso, 1 si es verdadero).

Operadores Lgicos

Representan las operaciones de conjuncin, disyuncin y negacin: &&, || y ! [obligatorio implementar los operadores]. Se aplican sobre datos lgicos y devuelven un resultado lgico (0 si es falso, 1 si es verdadero).

Operadores de Incremento y Decremento

Permiten auto-incrementar o auto-decrementar el valor de una variable entera: ++ y -- (pueden actuar como prefijos o como sufijos) [algunos grupos tienen que implementar al menos uno de los cuatro]. Se aplican sobre variables enteras y devuelven un resultado entero modificando tambin el valor de la variable. Ejemplo:

a = j++; /* si j vala 5, ahora a == 5 y j == 6 */

a = ++j; /* si j vala 5, ahora a == 6 y j == 6 */Operadores de asignacin

Permiten realizar asignaciones simples o realizando simultneamente una operacin: =, +=, -=, *=, /= y %= [todos los grupos tienen que implementar la asignacin simple (=) y algunos grupos debern implementar uno de los otros operadores]. Ejemplo:

n += m;/* es equivalente a n = n + m; */Operador Condicional

Permiten obtener un valor basndose en una condicin: condicin ? exp1: exp2 [implementacin obligatoria]. Si la condicin es cierta, devuelve exp1, en caso contrario, devuelve exp2. Ejemplo:

max = (a > b) ? a : b;/* Si a > b entonces max == a, en otro caso, max == b */Operador de Acceso a Campos de una Estructura

El operador punto permite utilizar los campos de un registro o estructura: . Ejemplo:

reg.campo /* accede al campo de la estructura reg */Operador de Acceso a Elementos de un Vector

El operador corchete permite utilizar los elementos de un vector: [ ] [implementacin obligatoria]. Ejemplo:

a= v[i+1]; /* accede al elemento i+1 del vector v y copia su valor en a */Precedencia de Operadores

En la tabla siguiente se muestra la precedencia de los operadores con el siguiente significado: los operadores del mismo grupo tienen la misma precedencia y, conforme se desciende por la tabla, la precedencia disminuye. En cualquier caso, el uso de parntesis permite alterar el orden de evaluacin de las expresiones [es obligatorio para todos los grupos implementar el uso de parntesis y tener en cuenta las precedencias de sus operadores].

Precedencias de los Operadores

OperadoresSignificadoAsociatividad

.()[]Referencia a campo de estructuraLlamada a funcinReferencia a elemento de vectorIzquierda a derecha

!++--+-Negacin lgicaAutoincrementoAutodecrementoMs unarioMenos unarioDerecha a izquierda

*/%ProductoDivisinMduloIzquierda a derecha

+-SumaRestaIzquierda a derecha

>>=< 65;

if (qq.jubilado)

qq.sueldo= R() / 2;

}

vacio P (vacio)

{

yo.edad= 20; /* modifica el campo edad de yo */

yo.mujer= 0;

yo.jubilado= 0;

yo.sueldo= 300;

tu.mujer= !yo.mujer;

Q (yo, tu);

if (tu.mujer)

puts ("Hola, seora");

else

puts ("Hola, seor");

puts ("\nHas nacido en ");

putw (2007 - yo.edad);

if (!tu.jubilado)

{

puts ("Tu sueldo es "); putw (tu.sueldo);

puts (" euros al mes\n");

}

}Instrucciones de Entrada/Salida

La funcin putw (expresin_entera) evala la expresin e imprime en pantalla su resultado. Por ejemplo:

a= 50; putw (a * 2 + 16); /* imprime: 116 */La funcin puts (cadena) imprime en pantalla la cadena. La cadena puede ser una constante de tipo cadena [obligatorio para todos los grupos] o una variable de tipo cadena [obligatorio para todos los grupos]. Por ejemplo:

a= "Adis"; puts ("Hola"); puts (a); /* imprime HolaAdis */La funcin putl () imprime en pantalla un salto de lnea. Por ejemplo:

a=50; putw(a * 2 + 16); puts(" Euros"); putl(); /* imprime: 116 Euros y salta de lnea */La funcin getw () lee un nmero entero del teclado y devuelve su valor. Por ejemplo:

a= getw (); putw (a * a); /* imprime el cuadrado del nmero ledo */La funcin gets (variable_cadena) lee una cadena del teclado, asignndose el valor ledo a la variable recibida como parmetro [obligatoria para todos los grupos]. Por ejemplo:

gets (a); puts (a); /* imprime la cadena leda */Sentencias

De todo el grupo de sentencias del lenguaje ADA, se han seleccionado para ser implementadas en el Proyecto las que aparecen a continuacin [opcional u obligatoriamente, segn se indique en cada caso]:

Sentencias de Asignacin

Existe una sentencia de asignacin en ADA, mediante el operador de asignacin = [es obligatorio implementar la sentencia de asignacin]. Su sintaxis general es la siguiente: identificador, igual y expresin: asigna al identificador el resultado de evaluar la expresin (los datos deben ser de tipos compatibles):

i= 8 + 6;Tambin se permite que a la izquierda de la asignacin aparezca un elemento de un vector o un campo de una estructura.

Sentencia de Llamada a una Funcin

Esta sentencia permite invocar la ejecucin de una funcin previamente definida [implementacin obligatoria].

La llamada a una funcin se realiza mediante el nombre de la funcin seguida de los argumentos actuales (separados por comas) entre parntesis si existen (si no tiene argumentos, hay que poner los parntesis):

p1 (5); /* llamada a una funcin con un argumento entero */

p2 (); /* llamada sin argumentos a una funcin */

p3 (b, i - 8); /* llamada con dos argumentos a una funcinLos parmetros actuales en la llamada tienen que coincidir en nmero y tipo con los parmetros formales de la declaracin de la funcin. Si la funcin devuelve un valor, tambin podr incluirse una llamada a una funcin dentro de cualquier expresin; si la llamada no se realiza en una expresin, el valor devuelto se perder:

b= fun1 (9); /* llamada a una funcin con un argumento entero */

c= b + fun2 (b, fun3() - 8); /* llamada con dos argumentos a una funcin,

siendo fun3, una llamada a otra funcin sin argumentos */

fun2 (5, c); /* el valor devuelto por fun2 se pierde */Sentencia de Retorno de una Funcin

ADA dispone de la sentencia retorno para finalizar la ejecucin de una funcin y volver al punto desde el que fue llamada [implementacin obligatoria]. Si la funcin es del tipo vacio, sta terminar cuando se ejecute la instruccin retorno o al llegar al final del cuerpo de la funcin. Si la funcin no es de tipo vacio, sta finalizar su ejecucin, devolviendo el valor obtenido al evaluar la expresin que acompae a la sentencia retorno; en este caso, el tipo de la expresin de la sentencia retorno debe coincidir con el tipo de la funcin.

SumaAlCuadrado (int a, int b) /*funcin entera*/

{

int j; /* variable local a SumaAlCuadrado */

j= a + b;

retorno j * j;

/* Como es una funcin entera, tiene que llevar una expresin entera. *

* La funcin finaliza y devuelve el valor de la expresin */

}

vacio pro (int x)

{

x= SumaAlCuadrado (x - 1, x);

/* x contendr el valor devuelto por la funcin: (x+x-1)^2 */

if (x > (194/2))

retorno; /* como es un procedimiento, no puede llevar expresin;

finaliza la ejecucin del procedimiento */

putw (SumaAlCuadrado (x, x));

} /* finaliza la ejecucin del procedimiento */Sentencia Condicional

Selecciona la ejecucin de una de las secuencias de sentencias que encierra, dependiendo del valor correspondiente de una condicin de tipo lgico. Tiene dos formatos [implementacin obligatoria]:

if (condicin) sentencias1 if (condicin) sentencias1 else sentencias2Si la condicin se evala como cierta (distinto de cero) se ejecutan las sentencias1; en caso contrario, se ejecutan las sentencias2 (si el programador las ha escrito). Cada uno de estos grupos de sentencias podr ser bien un bloque de sentencias encerradas entre llaves o bien una nica sentencia:

if (a > b)

c= b;

else

{

c= a;

if (fin)

puts ("adis");

}Sentencia Repetitiva mientrasEsta sentencia permite repetir la ejecucin de unas sentencias basndose en el resultado de una expresin lgica [implementacin obligatoria]. La sintaxis es: mientras (condicin) sentencias.

Se evala la condicin y, si resulta ser cierta (distinta de 0), se ejecutan las sentencias (que puede ser una nica sentencia o bien un bloque de sentencias encerradas entre llaves). Este proceso se repite hasta que la condicin sea falsa (se evale como 0):

mientras (n 1)

return x * factorial (x - 1);

else

return 1;

}

vacio Suma (int aux [], int fin)

/* se define el procedimiento Suma que recibe un vector

por referencia y un entero por valor */

{

for (i= 1; i < fin; i= i + 2)

aux [i]= factorial (aux [i - 1]);

}