Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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.
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.
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.
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.
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
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.
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
3
14009: PROCESADORES DE LENGUAJES CURSO 2009‐2010
Trabajo Práctico: Especificación Preliminar v1.0
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.
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.
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.
5