Gramatica Pascal
Short Description
Download Gramatica Pascal...
Description
Sintaxis de Pascal El propósito de esta página es proporcionar un resumen de la sintaxis, expresada en BNF (Formas de Backus-Naur), del subconjunto del lenguaje Pascal contemplado en la asignaturaProgramación I, curso 99/00. Debe quedar claro que estas definiciones tan sólo incorporan la sintaxis básica, y por lo tanto el que un elemento cumpla una definición no significa necesariamente que sea una construcción correcta en Pascal. Por ejemplo, la definición de sentencia de asignación, := no incorpora la información de que el resultado de la evaluación de la expresión debe ser de un tipo de datos compatible con el tipo de la variable. Ese tipo de información corresponde a la semántica del lenguaje, y sólo se incorpora de manera parcial mediante construcciones del tipo Identificador de funcion, que restringen los elementos permitidos en una parte de la definición. Cuando aparezca el símbolo ‡ en la parte derecha de una definición, significa que existe un enlace a una página donde se proporciona información adicional sobre ese elemento (significado, restricciones, etc). Para facilitar la búsqueda de una definición concreta, elija el término en la siguiente lista y pulse "Ver Definicion", o comienze con un elemento de alto nivel como Programa , Unidad o Tipo de dato. Definiciones:
Alternativa_doble
Ver Definicion
• Alternativa doble ::= if then else • Alternativa multiple ::= case of {; } end Alternativa multiple ::= case of {; } else end ‡ • Alternativa simple ::= if then • Bucle con numero fijo de iteraciones ::= for to do Bucle con numero fijo de iteraciones ::= for downto do ‡ • Bucle con salida al final ::= repeat {; } until • Bucle con salida al principio ::= while do • Cabecera de funcion ::= function : ; Cabecera de funcion ::= function ( {; } ) : ; • Cabecera de procedimiento ::= procedure ; Cabecera de procedimiento ::= procedure ( {; } ) ; • Cabecera de programa ::= program ; Cabecera de programa ::= program ( ); • Cabecera de unidad ::= unit ; •
•
Caracter de subrayado ::= _ Caso ::= :
• Comentario ::= { {} } Comentario ::= (* {} *) • Condicion ::= • Conversion de tipo ::= ( ) • Cuerpo de funcion ::= • Cuerpo de procedimiento ::= • Cuerpo de programa ::= • Declaracion de campos ::= {, } : • Declaracion de constante ::= = Declaracion de constante ::= : = • Declaracion de funcion ::= • Declaracion de interfaz ::= | • Declaracion de procedimiento ::= • Declaracion de subprograma ::= | • Declaracion de variables ::= {, } : • Definicion de tipo ::= = •
Digito ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
• Dispositivo ::= input | output | • Elemento de array ::= [ {, } ] • Elemento de estructura ::= | • Elemento de registro ::= . • Estructura alternativa ::= | | • Estructura de control ::= | | • Estructura iterativa ::= | | • Estructura with ::= with do • Expresion ::= | | | | | | Expresion ::= ( ) • Expresion binaria ::= • Expresion unaria ::= • Identificador ::= { | } • Letra ::= | | •
•
• •
• •
Letra mayuscula ::= A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z Letra minuscula ::= a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z Lista de dispositivos ::= {} Literal ::= | | | | | | | Literal de tipo boolean ::= true | false ‡ Literal de tipo caracter ::= ' ' Literal de tipo caracter ::= # {} ‡
• Literal de tipo conjunto ::= [ ] • • •
• • •
•
• • •
• • • • •
• • • • • • • •
•
• • • •
• • •
Literal de tipo conjunto ::= [ ] Literal de tipo entero ::= {} Literal de tipo puntero ::= nil ‡ Literal de tipo real ::= {} . {} Literal de tipo real ::= {} e {} Literal de tipo real ::= {} . {} e {} Literal de tipo string ::= ' {} ' Literal tipo enumerado ::= Llamada a funcion ::= Llamada a funcion ::= ( {; } ) Llamada a procedimiento ::= Llamada a procedimiento ::= ( {; } ) Operador aritmetico entero ::= + | - | * | div | mod ‡ Operador aritmetico real ::= + | - | * | / ‡ Operador binario ::= + | - | * | div | mod | / | and | or | = | | < | > | = | in Operador de conjunto ::= + | - | * | = | | = | in ‡ Operador de string ::= + ‡ Operador logico ::= not | and | or Operador relacional ::= = | | < | > | = Operador unario ::= - | not Parametros actuales ::= | Parametros actuales por valor ::= Parametros actuales por variable ::= Parametros formales ::= | Parametros formales por valor ::= {, } : Parametros formales por variable ::= var {, } : Programa ::= . Rango de literales ::= Rango de literales ::= .. ‡ Rango de literales ::= {, } Rango de valores ::= Rango de valores ::= .. ‡ Rango de valores ::= {, } Sentencia ::= | | | Sentencia compuesta ::= begin {; } end Sentencia de asignacion ::= := ‡ Signo ::= | + | Tipo array ::= Tipo array ::= array[ {, } ] of Tipo conjunto ::= Tipo conjunto ::= set of ‡ Tipo de dato ::= | ‡
• Tipo elemental ::= | • Tipo entero ::= integer | longint ‡ • Tipo enumerado ::= Tipo enumerado ::= ( {, } ) • Tipo estructurado ::= | | | | • Tipo fichero ::= • • • • • • • • • • • • •
• •
• •
• • • •
Tipo fichero ::= text Tipo fichero ::= file of ‡ Tipo indice ::= Tipo ordinal ::= | | Tipo ordinal predefinido ::= | char | boolean Tipo puntero ::= Tipo puntero ::= ^ ‡ Tipo real ::= real ‡ Tipo registro ::= Tipo registro ::= record {; } end Tipo simple ::= | | Tipo string ::= Tipo string ::= string[ ] ‡ Tipo subrango ::= Tipo subrango ::= .. Unidad ::= end. Variable ::= | | Variable dinamica ::= ^ ‡ Zona de declaracion de constantes ::= Zona de declaracion de constantes ::= const {; } ; Zona de declaracion de interfaces ::= {; } ; Zona de declaracion de subprogramas ::= Zona de declaracion de subprogramas ::= {; } ; Zona de declaracion de unidades ::= Zona de declaracion de unidades ::= unit {, } ; Zona de declaracion de variables ::= Zona de declaracion de variables ::= var {; } ; ‡ Zona de declaraciones ::= ‡ Zona de definicion de tipos ::= Zona de definicion de tipos ::= type {; } ; Zona de implementacion ::= implementation Zona de interfaz ::= interface
Elementos de semántica de Pascal
Alternativa Múltiple case of {; } else end Este tipo de estructura tiene las siguientes características: • • • •
La expresión se evalúa una única vez, antes de comenzar la estructura Los casos deben ser excluyentes entre sí, y por lo tanto no es posible que un valor pertenezca a más de un caso. Cuando se ejecuta la sentencia asociada a un caso, la estructura termina. La sentencia asociada a la parte opcional else sólo se ejecuta si el resultado de la expresión no pertenece a ningún caso. En esta última situación, si no existiera la parte else, la estructura terminaría sin ejecutar ninguna sentencia.
Bucle con número fijo de iteraciones for := to do Este tipo de estructura tiene las siguientes características: • • •
•
• •
La variable de control del bucle no puede ser modificada en la(s) sentencia(s) que forman parte del bucle. Las expresiones 1 y 2 se evaluan una única vez, antes de comenzar el bucle. Los resultados de las expresiones 1 y 2 deben garantizar como mínimo una ejecución del bucle. En concreto, el valor de la expresión 1 debe ser menor o igual que el de la expresión 2 en un bucle to, y mayor o igual en un bucle downto. La variable de control del bucle toma todos los valores comprendidos entre entre el valor inicial (el resultado de la evaluacion de la expresion 1) y el valor final (el resultado de la evaluacion de la expresion 2), ambos inclusive. Tras la ejecución del bucle, el valor almacenado en la variable de control del bucle es desconocido. Si N1 y N2 representan los resultados de la evaluación de las expresiones 1 y 2, respectivamente, entonces el bucle se repite (N2 - N1 + 1) veces en el caso de un bucle to, y (N1 - N2 + 1) veces en el caso de un bucle downto.
Literal de tipo boolean El valor false tiene asociado un valor ordinal de 0, y el valor true un valor ordinal de 1. Al comparar valores de tipo boolean se cumple que false < true. Literal de tipo carácter La notación # representa al carácter que se encuentra en esa posición de la tabla de caracteres. Es equivalente, por tanto, a chr(Número). Comparar caracteres es comparar las posiciones que ocupan en la tabla de caracteres del sistema. No existe (todavía) una tabla de caracteres universal, por lo que sólo podemos suponer las siguientes características, comunes a la mayoria de tablas existentes: •
•
Los caracteres correspondientes a dígitos se encuentran antes que los correspondientes a letras mayúsculas, que a su vez son anteriores a las letras minúsculas. Cuando se habla de letras se debe entender que nos referimos al alfabeto anglosajón, y por lo tanto no se incluyen la letra eñe, las vocales acentuadas, ni otros símbolos particulares de nuestro alfabeto. Los grupos de caracteres 0..9, A..Z, a..z ocupan posiciones consecutivas, y siguen el orden alfabetico normal. Nota: Los grupos generalmente no son consecutivos, es decir al carácter 9 no le sigue el caráter A.
Literal de tipo puntero El literal nil es compatible con todos los tipos puntero. Como la dirección representada por nil no puede corresponder a la de ninguna variable dinámica, asignar a un puntero este valor sirve para indicar que el puntero no almacena una dirección válida.
Tipos enteros Los tipos enteros sirven para representar valores numéricos sin parte decimal. Tienen una limitación de rango, es decir sólo pueden representar valores dentro de unos límites determinados. Si alguna operación aritmetica produce un valor fuera de esos limites, se produce un error de desbordamiento. Los límites, para la versión de Turbo-Pascal que utilizamos, son: • •
Tipo integer: -(Maxint+1) .. Maxint Tipo longint: -231 .. (231-1)
Maxint es una constante predefinida que indica el valor máximo que se puede representar en un valor de tipo integer. Nota: Maxint = 215-1 = 32.767, 231 = 2.147.483.648. Los valores se codifican internamente en complemento a dos. Operadores aritméticos enteros Los operadores aritmeticos enteros operan sobre valores de tipo integer y longint. Si un operando es de tipo integer y el otro de tipo longint, el operando de tipo integer se convierte automáticamente a un valor de tipo longint y se pasa a calcular el resultado, que será de tipo longint. En el caso de los operadores cociente (div) y resto (mod), se cumplen las siguientes relaciones: Dados c := a div b, r := a mod b, se tiene que: • • • •
(1) (2) (3) (4)
a = c*b + r |r| < |b| |c| = |a| div |b| |r| = |a| mod |b|
Las ecuaciones (3) y (4) indican que cuando el dividendo y/o el divisor son negativos, los valores absolutos del cociente y el resto proporcionados son iguales a los obtenidos cuando el dividendo y el divisor son positivos, y los signos del cociente y el resto se eligen de manera que se cumpla la ecuación (1). 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. Operadores aritméticos reales Los operadores suma, resta y multiplicación proporcionan un resultado de tipo real cuando alguno de sus operandos es de ese tipo. Si un operando es de tipo integer o longint, se convierte automáticamente a un valor de tipo real y se pasa a calcular el resultado. El operador de división (/), sin embargo, proporciona siempre un resultado de tipo real, incluso cuando ambos operandos son enteros y la división tiene un resultado exacto.
Operadores de conjuntos En la siguiente tabla se muestran los operadores de conjuntos, el tipo de sus argumentos y de su resultado: Operador
Significado
Operando 1
Operando 2
Resultado
+
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
=
Igualdad
Conjunto tipo base T1
Conjunto tipo base T2
Boolean
Desigualdad
Conjunto tipo base T1
Conjunto tipo base T2
Boolean
View more...
Comments