Sei sulla pagina 1di 5

14009: PROCESADORES DE LENGUAJES    CURSO 2009‐2010 

  Trabajo Práctico: Especificación Preliminar v1.0 

Un compilador para Party 
Party es un sencillo lenguaje basado en clases. En un lenguaje basado en clases, u orientado a
clases, las clases describen objetos. Los objetos son entidades que combinan estado (datos),
comportamiento (procedimientos o funciones, métodos) e identidad (identificación única entre
todos los objetos). La estructura y comportamiento de un objeto se define en una clase, que es la
definición de todos los objetos del mismo tipo. Un objeto debe ser explícitamente creado en base a
una clase, y un objeto así creado se denomina una instancia de dicha clase. Un objeto es similar a
una estructura, pero adicionalmente tiene métodos y control de acceso a los miembros.

Una clase define un tipo de dato identificado por el nombre de la clase.


class NombreDeClase {
// Cuerpo de la clase
}

En Party no hay más tipos de datos que los definidos por las clases y los tipos básicos
integer, boolean, float, char y string.

Un fichero de código fuente en Party contiene una única definición de clase.


Un concepto fundamental en un lenguaje basado en clases es el encapsulamiento.
Lo que se conoce como ocultación de información en Informática es el principio de
segregación de decisiones de diseño en un programa. Los programas cambian, y se trata de proteger
partes del programa de modificaciones extensivas cuando ciertas decisiones de diseño son
modificadas. La protección se logra brindando una interfaz estable que proteja al resto del programa
de cambios en la implementación. El principio de ocultación de información se manifiesta de varias
formas, en particular en el encapsulamiento. G. Booch definió encapsulamiento como el proceso de
compartimentar los elementos de una abstracción que constituyen su estructura y comportamiento
con el propósito de que el mecanismo interno de un componente pueda ser modificado sin impactar
en otros componentes, el componente pueda ser reemplazado por otro que soporte la misma interfaz
pública. Pero también gracias al encapsulamiento se protege la integridad del componente,
prohibiendo que los clientes modifiquen descontroladamente el estado interno (los datos) del
componente llevándolo a un estado inválido o inconsistente.
En Party se dispone de las declaraciones public y private que permiten indicar cuales
elementos pertenecen a la interfaz pública de la clase y cuales no.
class NombreDeLaClase {
public:
// Declaraciones de miembros
private:
// Declaraciones de miembros
}
La cláusulas public y private aparecen siempre en ese orden y siempre se declaran
aunque puedan estar vacías.

La declaración de un miembro que representa datos (un atributo) se realiza de la siguiente


forma:
identificadorDeTipo nombreAtributo;

  1 
14009: PROCESADORES DE LENGUAJES    CURSO 2009‐2010 
  Trabajo Práctico: Especificación Preliminar v1.0 

Las reglas para identificadores y constantes literales son las mismas que en el lenguaje Java.

La declaración de un miembro que representa comportamiento (un método) se realiza


idTipo nombreMetodo(idTipo arg1,…,idTipo argN) {
// Cuerpo del método
}

idTipo nombreMetodo(idTipo arg1,…,idTipo argN) constituye la signatura del


método.

El primer identificador de tipo se corresponde con el tipo de retorno del método si es una
función. Para indicar que el método es un procedimiento, y por tanto no devuelve un valor, se indica
void como identificador especial de tipo. El identificador void sólo puede utilizarse en este punto.
En cualquier caso aparecerán los paréntesis, incluso si el método no tiene argumentos.

En un método se pueden definir variables locales, cuya declaración es igual a la declaración


de un atributo. La declaración de variables locales, si aparece, deberá aparecer en el cuerpo del
método antes de cualquier instrucción.
En el cuerpo de un método el identificador predefinido this que indica al objeto sobre el
cual se ha realizado la llamada para ejecutar el método.

Los métodos especiales de construcción de instancias de la clase que se invocan (sólo) con
la instrucción new tienen por nombre el mismo identificador que da nombre a la clase.

El cuerpo del método está formado por una secuencia, posiblemente vacía de instrucciones.
Las instrucciones que disponibles en Party son:
 Instrucción de asignación,
 Instrucción de envío de mensaje (llamada al método o acceso a un atributo de un objeto ),
 Instrucción if,
 Instrucción while,
 Instrucción de creación de objetos new,
 Instrucción return.

La sintaxis de estas instrucciones es igual que la sintaxis de las mismas en el lenguaje Java.
Con la excepción de la instrucción de asignación, que tiene como característica especial que sólo
pueden utilizarse como parte izquierda en una asignación un identificador que corresponda con el
nombre de un atributo de la clase a la que pertenece el método, o el nombre de una variable local
declarada en el propio método. Otra forma de encapsulamiento en Party al estilo del lenguaje Eiffel.
Las expresiones que se utilizan como parte derecha en una asignación deben corresponder
en tipo con el identificador de la parte izquierda. Party es un lenguaje estática y fuertemente tipado.
Esto indica que no puede ocurrir un error en tiempo de ejecución debido a un error de tipos, por
tanto el compilador debe realizar las comprobaciones apropiadas para que esto sea así. El tipo del
elemento determina las operaciones que se pueden realizar en una expresión.
Con los elementos de tipo integer pueden utilizarse los operadores binarios: +, -, *, \,
%, (suma, resta, multiplicación, división entera y resto de la división entera) y el unario - (opuesto)
Con los elementos de tipo float pueden utilizarse los operadores binarios: +,-, *, / (suma, resta,

  2 
14009: PROCESADORES DE LENGUAJES    CURSO 2009‐2010 
  Trabajo Práctico: Especificación Preliminar v1.0 

multiplicación y división) y el unario - (opuesto)

Con los elementos de tipo boolean pueden utilizarse los operadores binarios: && y || (and,
or) y el unario ! (not).

Con el tipo char puede utilizarse el operador + que concatena un char con otro y produce un
string.

Con el tipo string puede utilizarse el operador + que representa la concatenación de strings
y el operador @ que permite obtener el char que se encuentra en la posición i-ésima (por ejemplo
"abc"@2 es 'b').

Los operadores relacionales <, <=, >, >= están disponibles para todos los tipos básicos.

El operador == compara la igualdad de los elementos. Para el caso de los tipos básicos la
comparación se realiza por valor, y en el caso de los tipos definidos por una clase la comparación se
realiza por referencia, se compara la identidad del objeto.

Esto indica que una variable en el programa que maneja un tipo básico maneja directamente
su valor y una variable de tipo definido por una clase maneja una referencia a un objeto. Una
variable que maneja una referencia a un objeto puede estar conectada válidamente a un objeto o
desconectada. El identificador especial null representa el valor desconectado.

Consecuentemente la asignación se produce por valor en el caso de tipos básicos y por


referencia en el caso de tipos definidos por una clase, y de la misma forma el paso de parámetros en
la llamada a un método.

Con los elementos de tipo definido por una clase (objetos) en una expresión pueden
utilizarse envíos de mensaje que permitan obtener un resultado, acceso a atributos y llamadas a
métodos de tipo función (no void).

A diferencia de los lenguajes orientados a objetos, en Party no hay herencia. Sin embargo,
una característica fundamental de Party es que permite la definición de clases parciales (partial
classes), característica que inspira su nombre. El concepto de partial class fue originalmente
introducido en la definición del lenguaje C# (C sharp). Múltiples declaraciones parciales de una
clase con el mismo nombre se combinan para formar una sola clase. Es decir la definición del tipo
que determina la clase puede estar distribuida en segmentos de programa separados. Esto ofrece
diferentes utilidades, en particular por ejemplo una parte de una clase puede haber sido generada
por un programa, mientras que la otra puede ser escrita manualmente. La separación textual en este
caso protege de posibles conflictos de actualización. Permite el trabajo en equipo distribuido, la
programación orientada a aspectos y facilita cambios en la configuración de los sistemas.

Clase parcial

La declaración de una clase parcial puede estar distribuida en múltiples declaraciones de


clases (diferentes ficheros). La declaración se construye de las partes de acuerdo a las reglas que se
indican en esta sección. Una vez combinadas las partes en tiempo de compilación, durante el resto
del tiempo de compilación y en tiempo de ejecución se trata omo una única declaración.

  3 
14009: PROCESADORES DE LENGUAJES    CURSO 2009‐2010 
  Trabajo Práctico: Especificación Preliminar v1.0 

Una declaración de clase representa una declaración parcial si incluye el modificador


partial:
partial class NombreDeClase {
// Cuerpo de la clase
}
También pueden declararse métodos parciales como se verá más adelante.

Cada parte de una declaración de clase parcial debe incluir el modificador partial. Cada
parte debe tener el mismo nombre que las otras partes. El modificador partial indica que puede
haber en otro fichero partes adicionales de la clase. Sin embargo, la existencia de partes adicionales
no es mandatoria. Puede ser válido que un tipo con un modificador partial resulte finalmente con
una única declaración.

Todas las partes de una clase parcial deben ser compiladas juntas de forma tal que las partes
puedan mezclarse en tiempo de compilación en una única declaración de tipo. No se permite
combinar clases parciales con tipos previamente compilados.

Atributos
Los atributos del tipo definido parcialmente se determina combinando los atributos de cada
una de las partes, sin orden específico. No se permitirá que varias partes contengan atributos del
mismo nombre y tipo diferente o modificador de acceso diferente (public, private). Si tienen el
mismo nombre y el mismo tipo y modificador, se produce la unificación en uno sólo atributo en el
tipo resultante.

Métodos
Con la excepción de los métodos parciales, el conjunto de métodos del tipo definido en
múltiples partes es simplemente la unión de los conjuntos de métodos de cada una de las partes. Es
un error de compilación declarar la misma signatura para un método en más de una parte, a menos
que el método sea un método parcial.

La accesibilidad de cualquier miembro de la clase (atributos o métodos) incluye a todas las


partes de la clase, un miembro private declarado en una parte es accesible desde otra parte.

Métodos parciales
Los métodos parciales pueden definirse en una parte de la declaración de una clase parcial, e
implementados en otra. La implementación es opcional, si finalmente ninguna de las partes
implementa un método parcial, tanto la definición del método como cualquier llamada a él se borran
del tipo resultante. Los métodos parciales deberán ser métodos con modificador de acceso private
y deberán ser métodos de tipo procedimiento, es decir declarados como void.

Hay dos formas de declaración de métodos parciales:


1) partial void metodo(tipo1 arg1,..., tipoN argN);
definición del método parcial (signatura)
2) partial void metodo(tipo1 arg1,..., tipoN argN) { … }
implementación del método parcial, provee un cuerpo del método.

  4 
14009: PROCESADORES DE LENGUAJES    CURSO 2009‐2010 
  Trabajo Práctico: Especificación Preliminar v1.0 

Entre todas las declaraciones parciales de una clase, sólo una puede haber una
implementación del método parcial. Si en una clase parcial se encuentra una implementación de un
método parcial, en al menos una otra debe estar la declaración del método parcial. Las diferentes
declaraciones y la definición de un método parcial deben tener los mismos modificadores de
acceso, mismo nombre, número y tipo de los argumentos.

Se tenga o no finalmente una implementación para el método, éste puede invocarse. Como
un método parcial siempre es private, las invocaciones siempre están en algún método de la
propia clase. Como un método parcial siempre es void, la invocación siempre será una instrucción.
Si ninguna de las partes de la declaración de una clase parcial, contiene una implementación para un
método parcial dado, todas las instrucciones en las que se invoca el método se eliminan del tipo
combinado. Así la instrucción, incluidas todas las expresiones que la constituyen no tendrán efecto
en tiempo de ejecución. El método parcial también se elimina, por lo tanto dicho método no será un
miembro de la declaración del tipo combinado.
Un método parcial sólo puede aparecer en una clase parcial.

Generación de código para Party

Party debe funcionar en la máquina virtual de Java. El compilador de Party a construir,


deberá generar código para la máquina virtual de Java.

  5 

Potrebbero piacerti anche