Tema 1 - Descripción de L-0

Transcripción

Tema 1 - Descripción de L-0
TEMA 1: DESCRIPCIÓN DEL LENGUAJE DE PROGRAMACIÓN L-0
Este tema define los elementos de programación del lenguaje L-0.
1.- PROGRAMA
Desde un punto de vista lógico, un programa en el lenguaje L-0 está definido por un conjunto de
clases. Debe contener una clase no instanciable llamada Programa con un único método
llamado inicio( ) desde éste se crearán los objetos iniciales y se iniciará la ejecución.
Todo programa se define en un fichero de texto independiente con nombre coincidente al del
programa y extensión “mod”.
EJEMPLO: El programa siguiente estaría definido en un fichero llamado “pila.mod”.
modulo pila
inst clase Elemento
{
oculto entero e;
consultar() dev entero
{
dev e;
}
modificar(entero n)
{
e:=n;
}
}
// Pila con 100 elementos como máximo
inst clase Pila
{
oculto formacion 100 Elemento almacen;
oculto entero cima;
iniciar()
{
cima := 0;
}
estaLlena() dev logico
{
si (cima = 100) entonces
dev cierto;
sino
dev falso;
finsi
}
apilar(Elemento elem)
{
si (no estaLlena()) entonces
cima := cima + 1;
almacen[cima] := elem;
finsi
}
estaVacia() dev logico
{
si (cima = 0) entonces
dev cierto;
sino
dev falso;
finsi
}
desapilar() dev Elemento
{
si (no estaVacia()) entonces
cima := cima – 1;
dev almacen[cima+1];
sino
dev almacen[cima];
finsi
}
}
clase Programa
{
inicio()
{
Elemento e;
Pila p;
entero i;
p := crear(Pila);
p.iniciar();
i:=1;
mientras (i<=10) hacer
e := crear(Elemento);
e.modificar(i);
p.apilar(e);
i:=i+1;
finmientras
}
}
En L-0 no se permiten las referencias adelantadas, es decir, no se pueden hacer
referencias a elementos que no hayan sido definidos previamente. Por ejemplo,
si la clase Elemento hubiese sido definida después de la clase Pila, ésta no
podría haber utilizado dicha clase. O también, si el método estaVacia() se
hubiese definido detrás de desapilar(), éste no podría invocarlo.
2.- CLASES
Se distinguen dos tipos, instanciables (admiten creación de objetos) y no instanciables (no
admiten creación de objetos). Las clases instanciables se califican con el lexema inst y
predefinen un procedimiento crear(Nombre_clase_instanciable) para crear objetos. Las
clases no instanciables no se califican y no poseen la capacidad de crear objetos.
No se admite definiciones anidadas de clases.
La declaración de una variable objeto no implica la creación de un objeto. La creación se realiza
a través de la llamada al procedimiento predefinido crear(Nombre_clase_instanciable) (el
programador no programa dicho método, sólo lo usa). No hay destrucción de objetos. Se
supone la existencia en tiempo de ejecución de un recolector de memoria para los objetos
inaccesibles.
Los atributos y métodos aparecen en cualquier orden, pero siempre se debe de tener en cuenta
la imposibilidad de referencias adelantadas en L-0.
Los atributos pueden ser de tipos predefinidos simples, compuestos o de tipo clase.
El estado de un objeto queda determinado por el valor de sus atributos en un instante dado en su
ejecución. El estado de un programa P en un instante dado t de su ejecución es el estado de
todos los objetos existentes en P en el instante t.
Los métodos son abstracciones procedimentales. Se dice que un método tiene comportamiento
funcional si devuelve algo tras su ejecución.
Se dice que un argumento (o parámetros) de un método se interpreta por valor sii éste conserva
su valor de entrada en toda ejecución del método.
Los métodos en L-0 sólo usan argumentos por valor. Si el argumento es de tipo clase entonces
suponemos un paso por valor de la identificación del objeto. La identificación del objeto no podría
variar pero se podría modificar su estado. Las identificaciones de los objetos quedan ocultas al
programador permitiéndose sólo el uso de la identificación nulo.
No se admiten definiciones anidadas de métodos. La implementación de los métodos se
realizará mediante instrucciones simples (asignación, llamada a método, retorno de valores,
instrucciones de entrada/salida) e instrucciones compuestas (condicional e iteración).
Se puede restringir la visibilidad de los atributos y métodos en las clases mediante el uso del
calificador oculto.
3.- TIPOS
(a) Los tipos predefinidos simples en L-0 son: entero, real, logico, caracter.
entero a,b;
real f;
logico l;
caracter c;
//declaración de dos variables enteras a y b
//declaración de una variable real f
//declaración de una variable lógica l
//declaración de una variable tipo carácter c
(b) Los tipos predefinidos compuestos en L-0 son las tablas: formacion
Los elementos de las formaciones deben ser de tipos predefinidos simples o clases.
EJEMPLO: formacion 10,10 entero v; //declaración matriz con 100 enteros
(b) Los tipos no predefinidos en L-0 son las clases: clase
Los tipos predefinidos (simples y compuestos) se interpretan como tipos abstractos de datos,
es decir, como conjuntos de valores y operaciones abstractas.
TAD Entero
Valores: ...,-2,-1,0,1,2 ...,
Funciones: +, -, *, /: entero, entero -> entero
- : entero -> entero
<, >,<=,>=, =, !=: entero, entero -> lógico
entero_a_real: entero -> real
Prioridades (de mayor a menor): {- , entero_a_real}, {*, /}, {+, -}, {<, >,<=,>=, =, !=}
TAD Real
Valores: ..., 1.2, -2.34, ...,
Funciones: +, -, *, /: real, real -> real
- : real -> real
<, >,<=,>=, =, !=: real, real -> lógico
real_a_entero: real -> entero
Prioridades (de mayor a menor): {- , real_a_entero}, {*, /}, {+, -}, {<, >,<=,>=, =, !=}
TAD Lógico
Valores: cierto, falso
Funciones: y, o: lógico, lógico -> lógico
no: lógico -> lógico
=, !=: llógico, lógico -> lógico
Prioridades (de mayor a menor): { =, !=}, no, y, o.
TAD Carácter
Valores: ...,’a’, ‘b’, ...,
Funciones: <, >,<=,>=, =, !=: carácter, carácter -> lógico
Prioridades (de mayor a menor): {<, >,<=,>=, =, !=}
TAD Formación n-dimensional con componentes de tipo predefinido simple o
Clase T
Valores: (opaco)
Funciones: []: formación, entero1, ..., enteroN -> T
=, !=: formación, formación -> lógico
Para los tipo no predefinidos (clases) sólo podremos aplicar los operadores de igualdad (=) y
desigualdad (!=).
4.- INSTRUCCIONES PARA DEFINICIÓN DE MÉTODOS
Asignación
La asignación presenta la forma x := e, donde x es una expresión representando una
localización de memoria (normalmente una variable o atributo) y e es una expresión
representando un valor del mismo tipo que x.
Dado que L-0 define sólo argumentos por valor, éstos no pueden aparecer en la parte
izquierda de las asignaciones.
Ejemplo: cont := cont - cantidad; (siendo cont y cantidad variables de tipo entero)
Devolución de valores
Todo método f con comportamiento funcional devuelve valores al contexto mediante la
instrucción dev e, donde e es una expresión coincidente en tipo con el rango de f.
Ejemplo: dev cantidad;
Activación de método
Existen tres localizaciones desde la que se puede activar un método en L-0:
1. Activación desde un objeto (objeto.método(parametros reales))
2. Activación desde una clase no instanciable (clase.método(parametros
reales)).
3. Activación desde un método de la propia clase (método(parametros reales)).
Ejemplo de activación desde un objeto:
obj.incrementar(2);
Ejemplo de activación desde una clase no instanciable:
D.p( );
Instrucción de Salida
L-0 posee el procedimiento predefinido escribir(expresion) para escribir en la salida
estándar.
Ejemplo: escribir(cont*2);
Instrucción de Entrada
L-0 posee el procedimiento predefinido leer(expresión_con_Lval) para leer desde la
entrada estándar.
Ejemplo: leer(cont);
Condicional
Presenta la forma si (condicion) entonces ... [sino ... ] finsi.
Ejemplo: si (cont>=cant) entonces
cont := cont - cantidad;
finsi
Iteración
Presenta la forma mientras (condicion) hacer ... finmientras.
Ejemplo: mientras (cont<100) hacer
cont := cont - 1;
finmientras

Documentos relacionados