Você está na página 1de 9

Lenguaje Pascal-1

2. Comentarios Un comentario de bloque queda delimitado por las secuencias de caracteres (* y *). Todos los caracteres entre esos delimitadores son ignorados: Pascal-1 no permite que los comentarios de bloque puedan anidarse. Un comentario de bloque es tratado por el compilador como un carcter de blanco. Los comentarios pueden abarcar una o varias lneas. 3. Tokens Un programa es una secuencia de tokens de varios tipos incluyendo: operadores, delimitadores, identificadores, palabras reservadas y constantes. El analizador lxico reconoce la secuencia de caracteres ms larga cuando busca el siguiente token. Por ejemplo, la secuencia de caracteres abc123 representa un nico token (el identificador abc123) en lugar de dos tokens separados (el identificador abc seguido del entero 123). Dos tokens pueden separarse por un carcter de blanco, un comentario, un operador o un delimitador, 4. Constantes Slo se consideran las constantes booleanas, representadas por las palabras reservadas true y false, y las constantes de cadena, que se encierran entre comillas simples (por ejemplo hola). Las constantes de cadena pueden contener cualquier carcter ASCII. El carcter "\" sirve para destacar caracteres especiales, por ejemplo \n representa carcter un salto de lnea. En la prctica no es necesario contemplar un tratamiento especfico de este tipo de caracteres. Como se ver ms adelante, en Pascal-1 no se considera la declaracin de constantes, sino que stas slo pueden aparecer en expresiones (en el caso de las constantes booleanas) o en sentencias de entrada-salida (en el caso de las constantes de caracteres). 5. Operadores y delimitadores Se consideran los siguientes operadores y delimitadores: Delimitadores ()[],.;* + * mod (resto) < > = <> (distinto) and (y or (o lgico) := . (acceso a campo de registro) [] (acceso a elemento de vector) (suma) (resta) (producto) (menor) (mayor) (igual) lgico)

Operadores aritmticos

Operadores relacionales

Operadores lgicos Operador de asignacin Operadores de acceso

-1-

Obsrvese que no se consideran los operadores + y - unarios, de forma que los nmeros que aparezcan en los programas fuente de Pascal-1 sern siempre sin signo (positivos). As, los nmeros negativos no aparecern en el lenguaje fuente, pero s pueden surgir en tiempo de ejecucin como resultado de evaluar una expresin aritmtica (por ejemplo 14). En funcin del grupo del alumno (A B) y de las partes opcionales es posible que no sea necesario considerar todos los operadores. Es muy importante respetar la precedencia de operadores, sobre todo en operaciones aritmticas. En esta tabla se encuentran agrupados los operadores que tienen la misma prioridad. Segn se desciende en la tabla, desciende la prioridad del grupo: . ( [] * mod and + or > < = <> := Otra observacin es que en Pascal-1 se aplica la evaluacin impaciente de condiciones. As, en una condicin "or", aunque el primer trmino sea cierto se evaluar el resto; de igual modo, aunque el primer trmino de una condicin "and" sea falso, se calcula el resto de trminos aunque sepamos que el resultado ser falso en cualquier caso. 6. Identificadores y palabras reservadas Un identificador consiste en una secuencia de caracteres y dgitos que comienzan obligatoriamente por una letra. Los identificadores son utilizados para nombrar las entidades del programa como las variables o las funciones. El lenguaje no es sensible a las maysculas (case sensitive), lo que significa que dos identificadores compuestos de los mismos caracteres y que difieran nicamente en que algn carcter en uno est en maysculas y otro en minsculas se consideran iguales (por ejemplo, Abc y ABC representan el mismo identificador). La longitud de los identificadores no est restringida. Las palabras reservadas son identificadores que tienen un significado especial, de manera que no pueden ser utilizadas para nombrar otras entidades. A continuacin se enumera la relacin de palabras reservadas en Pascal-1, aunque el alumno debe

-2-

considerar slo las que necesite segn su grupo (A B) y su decisin de realizar partes opcionales. var and while record integer begin or do array boolean program do true if of false then end type else

function procedure

7. Declaracin de variables y tipos de datos Las declaraciones de variables deben ir agrupadas al comienzo de cada bloque, precedidas de la palabra reservada "var". Referenciar una variable que an no ha sido declarada constituye un error. No hay que contemplar la posibilidad de que se use una variable de cualquier tipo antes de darle valor: el compilador mostrar un comportamiento impredecible. Las sentencias de declaracin se construyen de la siguiente forma: VAR nombre1: tipo; nombre2: tipo; nombre3, nombre4: tipo; A la hora de declarar variables y definir tipos de retorno de funciones se consideran dos tipos simples de datos y dos tipos compuestos. 7.1. Tipo entero Las variables de tipo entero se identifican con la palabra reservada "integer". Se les puede asignar una expresin aritmtica, y pueden tomar valores positivos y negativos, aunque ya se dijo antes que en el cdigo de los programas slo aparecern nmeros sin signo (positivos). Ejemplo de declaracin y uso: var x1: integer; ... x1:=1-5+suma(2,3); 7.2. Tipo booleano Las variables de tipo booleano se identifican con la palabra reservada "boolean". Se les puede asignar expresiones lgicas y su valor ser finalmente una de las dos constantes booleanas, "true" o "false". Ejemplo de declaracin y uso: var seleccionado,flag: boolean; ... seleccionado:= 2<3; flag:= false; 7.3. Tipo vector Para definir un vector hay que declararlo de la siguiente forma: type mivector = array [n1..n2] of tipo;

-3-

Donde "mivector" ser el nombre del tipo, "n1" y "n2" sern dos constantes numricas que determinan el rango de posiciones disponibles en el vector, y "tipo" indica el tipo de sus elementos. Para acceder a las posiciones se utilizan los corchetes. Algunos ejemplos: type vec1 = array [0..5] of boolean; vec2 = array [7..41] of integer; var x, y: vec2; begin x[1] := 10; (* error *) x[7] := 10; y := x; (* slo se permite si los dos vectores son del mismo tipo! *) end; Los vectores pueden utilizarse como parmetro de un subprograma. Slo se contempla la definicin de vectores de tipos bsicos (entero y booleano). No se contempla la declaracin de vectores de ms de una dimensin (como por ejemplo matrices). 7.4. Tipo registro Para definir un registro hay que declararlo de la siguiente forma: type miregistro = record campo1: tipo; ... campon: tipo; end; Donde "miregistro" ser el nombre del tipo, "record" es palabra reservada y "campo1" y "campon" representan los nombres que se quiera dar a los distintos campos. Para acceder a estos campos utiliza el delimitador "." (punto). Algunos ejemplos: type ficha = record edad: integer; dni: integer; casado: boolean; end; var juan, david:persona; begin juan.edad := 24; david := juan; (* slo se permite si los registros son del mismo tipo! *) juan.casado := false; end; Los registros pueden utilizarse como argumento de un subprograma. Slo se contempla la definicin de registros de tipos bsicos (entero y booleano). Por tanto no se contempla la anidacin de registros. 8. Procedimientos y funciones

-4-

En Pascal-1 hay dos tipos de subprogramas: funciones y procedimientos. Para llamar a un subprograma, ste debe haber sido declarado con anterioridad en el programa. Tanto las funciones como los procedimientos pueden recibir argumentos, pero slo las funciones devuelven un valor. Hay dos formas de paso de parmetros en Pascal-1: Paso por valor: lo que se pasa es una copia del argumento; as, si se pasa una variable y se modifica su valor en el subprograma, esta modificacin no tendr reflejo en la variable original. Pueden pasarse todo tipo de expresiones y variables. Paso por referencia: lo que se pasa es la direccin de memoria donde est almacenado el parmetro, de forma que las modificaciones que se hagan dentro del subprograma se harn realmente sobre la variable original. En Pascal-1 se sabe que el paso es por referencia si el argumento va precedido de la palabra reservada "var". Aunque el paso de parmetros por referencia permite tambin pasar expresiones, en la prctica slo se contempla el paso de variables. La definicin de un subprograma se realiza como sigue: primero se escribe la cabecera, luego se declaran opcionalmente variables y tipos locales al subprograma, y por ltimo se incluyen las sentencias que constituyen el cuerpo del subprograma, delimitadas por las palabras reservadas "begin" y "end". En el caso de las funciones hay que destacar que existe una variable especial cuyo nombre coincide con el de la funcin y que ser la que represente el valor devuelto. Esta variable no hay que declararla, existe de por s, y su tipo coincide, lgicamente, con el indicado en la cabecera para el valor devuelto. A continuacin se incluyen ejemplos de definicin de funciones y procedimientos: procedure procedimiento1 (x1: integer; var x2: integer; c: boolean); (* el parmetro x2 se pasa por referencia *) (* aqu se declararan opcionalmente tipos, variables y subprogramas locales *) begin (* aqu vendran las sentencias *) end; procedure procedimiento2; (* no recibe argumentos *) (* aqu se declararan opcionalmente tipos, variables y subprogramas locales *) begin (* aqu vendran las sentencias *) end; function mifuncion1 (x: integer): integer; (* devuelve un valor de tipo integer, tiene una variable local l *) var l: integer; (* aqu se declararan opcionalmente tipos, subprogramas locales y otras variables locales*) begin (* aqu vendran sentencias *) mifuncion1:= 4; (* en al menos una sentencia hay que dar valor a la variable de retorno *) (* aqu vendran sentencias *) end;

-5-

function mifuncion2 (x1, x2, x3: integer; var b: boolean): boolean; (* b se pasa por referencia *) (* aqu se declararan opcionalmente tipos, variables y subprogramas locales *) begin (* aqu vendran sentencias *) mifuncion2:= false; (* en al menos una sentencia hay que dar valor a la variable de retorno *) (* aqu vendran sentencias *) end; Es muy importante destacar que los subprogramas en Pascal-1 pueden ser recursivos, es decir, pueden llamarse a s mismos. Adems, a diferencia de lenguajes como C, en Pascal-1 se admite la anidacin de subprogramas, es decir, pueden declararse subprogramas locales a un subprograma dado. Nos remitimos a las secciones 9.3 y 9.4 del libro de teora recomendado para estudiar el alcance de estas dos caractersticas fundamentales del lenguaje. 9. mbitos Cada subprograma es un bloque que determina un mbito. En cada mbito slo estn accesibles algunos nombres (los nombres representan variables, tipos y subprogramas). Concretamente, en el mbito de un subprograma estn accesibles los siguientes nombres: el del propio subprograma (para garantizar la posibilidad de realizar llamadas recursivas), el de sus argumentos, el de sus nombres locales y el de los no locales. Cules son los nombres no locales? Los nombres declarados en un subprograma son no locales para todos los subprogramas definidos en su interior. As, los nombres declarados en el programa principal sern no locales (y por tanto accesibles) para todos los subprogramas sin excepcin. La gestin de mbitos puede resultar confusa: recomendamos plantear muchos ejemplos y visitar tutoriales de Pascal como estos (1 y 2). 10. Sentencias y expresiones El cuerpo de un subprograma est compuesto por un conjunto de sentencias que manejan expresiones. En este apartado se describen las sentencias que deben contemplarse en Pascal-1, y se presenta el concepto de expresin. 10.1. Sentencia de asignacin Para dar valor a las distintas variables se utiliza el operador de asignacin ":=", debiendo ser los tipos de datos compatibles: int1 := 3+7; int2 := 10; boo1 := 3<>4; boo2 := true; 10.2. Sentencia de llamada a procedimiento Para llamar a un procedimiento simplemente hay que escribir su nombre indicando entre parntesis los parmetros, que deben coincidir en nmero y tipo con los definidos en el procedimiento llamado. Por ejemplo: imprimir(x1, true);

-6-

Las funciones no pueden llamarse de esta forma, puesto que devuelven un valor, y por tanto slo formarn parte de expresiones (ver ms adelante). 10.3. Sentencia de control de flujo "if-then-else" Esta construccin puede presentarse de dos formas: if condicin sentencias1; if condicin sentencias1 else sentencias2; Si la condicin es cierta, es decir, resulta igual a "true", se ejecuta el bloque "sentencias1". Si existe "else" y la condicin es falsa, se ejecuta el bloque "sentencias2". Si el bloque de sentencias incluye ms de una, deben rodearse de las palabras "begin" y "end", por ejemplo: if a>5 then b:=10; if a>5 then b:=10 else begin b:=0; c:=1; end; Obsrvese que nunca se pone el delimitador ";" si a continuacin sigue la palabra reservada "else". No se contempla la anidacin de sentencias "if-then-else". 10.4. Sentencia de control de flujo "while-do" La estructura es: while condicin do sentencias1; Si la condicin es cierta (es decir, es igual a la constante "true"), se ejecuta el bloque de sentencias. Despus se comprueba de nuevo la condicin. Este proceso se repite una y otra vez hasta que la condicin sea falsa. Al igual que en el caso de "if-then-else", si el bloque incluye ms de una sentencia deben incluirse entre las palabras "begin" y "end". Ejemplos: while a<5 do a:=a+1; while a<5 do begin a:=a+1; escribir(a); end No se contempla la anidacin de sentencias "while". 10.5. Sentencia de entrada-salida nicamente se considerar el procedimiento "writeln", que admite como nico argumento una expresin o constante de cadena (si el paso de parmetros es por valor) o bien una variable o constante de cadena (si el paso de parmetros es por referencia). El procedimiento escribe el argumento en pantalla seguido de un salto de lnea: writeln('Resultado: '); (* cadena de caracteres *)

-7-

writeln(a); (* variable *) writeln(5 + a - fun(3)); (* expresin *) El subprograma "writeln" puede ser tratado por el alumno de forma diferenciada, ya que es el nico que puede recibir como argumento una cadena de caracteres. El alumno es libre de hacer esta diferenciacin a nivel semntico o sintctico (considerando "writeln" como una palabra reservada ms). 10.6. Expresiones Hemos visto ejemplos concretos de sentencias, pero su formalizacin a nivel de gramtica se facilita enormemente introduciendo el concepto de expresin. Una expresin es una combinacin de operandos y operadores, incluyendo llamadas a funciones. De hecho, una llamada a funcin slo puede ser parte de una expresin. La expresin abarca, por tanto, desde lo ms simple hasta lo ms complejo. Son expresiones aritmticas, por ejemplo: 78 x 5+x1 ((5)+(x1)) suma(1, x1+2) 17*(x1 - x2 mod 3) + suma(13-3,resta(5,x2)) 4+vec[4]-vec[3+vec[7]]*ficha.numero Son expresiones lgicas: true x1 < 10 (x>2) and (x or true) (v1[4*6] and (reg3.esazul or true)) Las expresiones aparecen en casi todas las sentencias: como parte derecha de las sentencias de asignacin, como parmetro en un subprograma y como condicin en una sentencia de control de flujo. Es necesario velar por la coherencia de los tipos en las expresiones. Obsrvese que lo anterior no es del todo cierto si el alumno implementa nicamente el paso de parmetros por referencia: en este caso, como se dijo anteriormente, los parmetros deben ser siempre variables y no expresiones. Ejemplos: function factorial(var n: integer) : integer; (* paso por referencia *) ... x:=factorial(5); (* incorrecto, se pasa una expresin *) x:=factorial(var1 + 2); (* incorrecto, se pasa una expresin *) x:=factorial(var1); (* correcto, se pasa una variable *) 11. Estructura del programa En Pascal-1 un programa consiste en un archivo de extensin p1 (por ejemplo "miprograma.p1" cuya estructura debe ser necesariamente la siguiente: program NombreDelPrograma; (* aqu vendran opcionalmente las definiciones de tipos *) (* aqu vendran opcionalmente las definiciones de variables *) (* aqu vendran opcionalmente las definiciones de subprogramas *)

-8-

begin (* sentencias del programa principal, se empezar a ejecutar por aqu *) end. Obsrvese las similitudes con los subprogramas, y tambin las diferencias: la palabra reservada "program", la ausencia obligada de argumentos, y el delimitador "." al final. Los tipos, variables y subprogramas declarados a nivel de programa sern, como se explic en el apartado 9, visibles para todos los subprogramas sin excepcin. 12. Errores Un aspecto importante en el compilador es la gestin de los errores. Se valorar la cantidad y calidad de informacin que se ofrezca al usuario cuando ste no respete la descripcin de Pascal-1 propuesta en esta seccin. No se pide, sin embargo, abordar la recuperacin de errores, de forma que ante la aparicin de un error el compilador puede detener el proceso. Como mnimo se exige que el compilador indique el tipo de error: lxico, sintctico o semntico, aunque se admite tomar los errores lxicos por sintcticos. Debe indicarse obligatoriamente el nmero de lnea en que ha ocurrido. Por lo dems, se valorarn intentos de aportar ms informacin sobre la naturaleza del error, por ejemplo: Errores lxicos: constante numrica mal construida, identificador mal construido, smbolo no admitido... Errores semnticos: identificador duplicado, tipo errneo de variable, variable no declarada, subprograma no definido, campo de registro inexistente, campo de registro duplicado, demasiados parmetros en llamada a subprograma...

-9-