Gramatica Pascal
Gramatica Pascal
Gramatica Pascal
Ver Definicion
Alternativa_doble
Definiciones:
Tipos reales
Los tipos reales sirven para representar valores numéricos con parte decimal. La representación de valores
tiene las siguientes limitaciones:
• El desbordamiento superior sucede cuando el valor a representar es mayor, en terminos
absolutos (sin tener en cuenta el signo), que el valor máximo representable. En Turbo-Pascal este
máximo vale aproximadamente 1,7*1038. Cualquier operación en la que se obtenga un resultado
absoluto mayor da un error.
• El desbordamiento inferior sucede cuando el valor a representar esta más cerca de cero que un
determinado límite. En Turbo-Pascal este límite vale aproximadamente 2,9*10-38. Cualquier
operación en la que se obtenga un resultado absoluto menor da como resultado cero (no se produce
error).
• La perdida de precisión sucede cuando se necesita representar un valor con más dígitos
significativos (precisión) de la que es capaz el método de codificación. En Turbo-Pascal los valores
de tipo real almacenan los 11 dígitos decimales más significativos (es decir, sin tener en cuenta los
ceros iniciales y/o finales).
Esta última limitación indica que, salvo casos especiales, los valores de tipo real no son una representación
exacta del valor real, sino tan solo una aproximación. Por lo tanto, es necesario evitar en lo posible
comparaciones de igualdad y desigualdad con valores de tipo real, ya que pueden dar lugar a resultados
inesperados. Por ejemplo, la comparación 3*(1/3) = 1.0 da como resultado false.
+ Unión Conjunto tipo base T1 Conjunto tipo base T2 Conjunto tipo base T3
* Intersección Conjunto tipo base T1 Conjunto tipo base T2 Conjunto tipo base T3
- Diferencia Conjunto tipo base T1 Conjunto tipo base T2 Conjunto tipo base T3
• Ser el mismo tipo. En este caso el tipo T3 será el mismo que T1 y T2.
• Que T1 sea un subrango de T2. El tipo resultado T3 será igual a T2.
• Que T2 sea un subrango de T1. El tipo resultado T3 será igual a T1.
• Que T1 y T2 sean subrangos del mismo tipo, posiblemente con límites distintos. En este caso
T3 será el menor subrango cuyos límites incluyen a los de T1 y T2. Por ejemplo, si T1 = 1..5 y T2 =
4..10, T3sería 1..10.
Los tipos de datos T1 y T2 pueden ser cualquier tipo string (independientemente de su número máximo de
caracteres) o char. El resultado es un valor de tipo string[n], donde n es el tamaño mínimo del string que
puede almacenar la cadena resultante.
En Turbo-Pascal, si la cadena resultante tiene más de 255 caracteres, no se tienen en cuenta aquellos
situados tras la posición 255.
Rango de valores
La definición de un rango de valores se utiliza en la sentencia case (los límites son literales) y en el
constructor de conjuntos (los limites son expresiones). Suponiendo la siguiente definición común a ambos
casos:
<Valor N1>..<Valor N2>
Sentencia de asignación
<Variable de tipo T1> := <Expresión de tipo T2>
Evaluación de expresiones
El orden de evaluación de los elementos de una expresión sigue las siguientes normas:
• Cualquier elemento encerrado entre paréntesis se evalúa primero.
• Si la expresión es una llamada a función, se evaluan los parámetros actuales por valor, se asignan
esos valores a las variables parámetros formales de la función, se ejecuta la funcíon y la expresión
se resuelve con el ultimo valor asignado a la variable asociada a la función.
• Si en la expresión aparecen varios operadores, se ejecuta primero el operador con
mayor precedencia. En el caso de operadores con la misma precedencia, se ejecuta primero el
operador situado más a la izquierda en la expresión.
Para que una expresión pueda evaluarse se deben dar las siguientes condiciones:
• En el caso de operadores, los operandos deben ser del tipo requerido y/o cumplir las reglas
de compatibilidad entre tipos.
• En el caso de llamadas a funciones, el tipo de los parametros actuales (valores que se envián)
deben ser compatibles según las normas de la asignación con el tipo de los parámetros formales
(variables de la función que reciben los valores).
• No se produzcan problemas de desbordamiento u operaciones no permitidas (dividir por cero, por
ejemplo).
Nota: En el caso de parámetros por variable, el tipo de datos de la variable parámetro actual y el tipo de
datos de la variable parámetro formal debe ser exactamente el mismo.
Precedencia de operadores
Los niveles de precedencia de los operadores de Pascal son los siguientes:
Tipo conjunto
El tipo de datos conjunto tiene las siguientes características especiales:
• El tipo base debe ser un ordinal, y en Turbo-Pascal existe la limitación de que su cardinalidad
(número de valores distintos que pertenecen al tipo) debe ser menor de 256, y en el caso de tipos
base numéricos no están permitidos los valores negativos.
• Existen literales de tipo conjunto (ver Literal de tipo conjunto).
• Existen operadores que se aplican a conjuntos (ver Operadores de conjuntos).
• Son compatibles los valores conjunto cuyo tipo base sea compatible, aunque su definición de tipo
sea distinta.
• A diferencia del resto de tipos estructurados, los conjuntos no almacenan valores del tipo base, sino
la información sobre si un valor, en un momento determinado, pertenece o no al conjunto.
Tipo fichero
Los ficheros, al representar datos externos al programa y tener un acceso secuencial, tienen un tratamiento
distinto al de los otros tipos estructurados. Algunas de esas características especiales son:
Definición de ficheros:
• Las variables tipo fichero (denominadas ficheros lógicos, en contraposición con los ficheros físicos,
los ficheros reales) no almacenan los datos del fichero, sino que sirven de intermediario para poder
acceder a un determinado fichero físico.
• El tipo base de un fichero no puede ser a su vez un tipo fichero, puesto que no tiene sentido
almacenar ficheros lógicos.
• No se puede asignar a una variable tipo fichero el contenido de otra variable tipo fichero. No tiene
sentido el tener dos variables con la misma información de acceso a un fichero físico.
Consecuentemente, tampoco es posible que varias variables tipo fichero tengan asignado y abierto,
simultaneamente, el mismo fichero físico.
• Debido a lo anterior, al pasar un fichero como parámetro a un subprograma siempre es necesario
hacerlo por variable (un paso por valor es equivalente a una asignación).
Uso de ficheros:
• El acceso a los datos de un fichero se debe hacer mediante una serie fija de etapas (asignación de
un fichero físico a un fichero lógico, apertura del fichero para lectura o creación-escritura,
comprobación de fin de fichero-lectura de datos o escritura de datos, y cierre del fichero) que
requieren la utilizacion de subprogramas predefinidos para acceso a ficheros.
• Un fichero sólo se puede abrir o bien para lectura o bien para creación-escritura. No se puede leer y
escribir simultaneamente en un fichero.
• Abrir un fichero para escritura supone crear un fichero físico nuevo y vacío. Si previamente existía
un fichero físico con el mismo nombre, los datos que contenía se pierden al abrirlo para escritura.
Por lo tanto no es posible añadir datos nuevos al final de un fichero abriendolo para escritura, es
necesario usar otros medios (usar ficheros auxiliares, por ejemplo).
• No es posible conocer anticipadamente el número de elementos de un fichero físico. Por lo tanto,
antes de cualquier lectura de un dato es necesario haber comprobado que realmente quedan datos
por leer en el fichero (mediante la fúncion eof).
• Cualquier fichero puede estar vacío, por lo tanto no es posible aplicar directamente tecnicas de
lectura adelantada sobre ficheros.
• Cualquier modificación del contenido de un fichero físico requiere la utilización de ficheros auxiliares.
Tipos de datos
La tabla siguiente muestra características de los tipos de datos predefinidos de Turbo-Pascal:
Tipo puntero
La definición de un tipo puntero tiene dos partes diferenciadas:
Tipo puntero ::= ^ <Tipo de dato asociado>
• El acento circumflejo (^) significa que las variables de este tipo de datos son punteros, y por lo tanto
almacenarán direcciones de memoria.
• El tipo de datos asociado no tiene nada que ver el tipo puntero que se esta definiendo: Tan sólo
sirve para indicar el tipo de datos que almacenaría una hipotetica variable dinámica cuya dirección
estuviera almacenada en una variable de este tipo puntero.
Las variables de tipo puntero almacenan direcciones de memoria. No es necesario que conozcamos qué
es exactamente una dirección de memoria, sino tan solo que mediante esos valores es posible hacer
referencia a variables dinámicas.
La dirección almacenada en un puntero puede ser, en un momento dado, válida o no válida. Es válida
cuando represente la dirección de una variable dinámica existente.
Una variable dinámica existe cuando ha sido creada mediante una llamada al procedimiento new, y todavia
no ha sido destruida mediante una llamada al procedimiento dispose.
Es necesario tener en cuenta que los valores de tipo puntero son un mero intermediario para permitir el
trabajar con variables dinámicas, y que no guardan más relación con ellas que las de almacenar su
dirección.