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