SERIE SPECTRUM Y CP/M Algol-M I. DESCRIPCION DEL LENGUAJE ALGOL-M A. Caracteristicas del ALGOL-M Si bien el ALGOL-M fue modelado en base al ALGOL-60, nunca se intento hacerlo un sub juego formal del ALGOL-60. Esto fue intencional con el fin de proveer un lenguaje mejor adecuado para las necesidades de los programadores de aplicaciones en sistemas micro. Aun asi, la estructura basicadel ALGOL-M es muy similar al ALGOL-60 lo que permite la conversion de programas simples de una version a la otra. Esto fue considerado particularmente importante en vista de los hechos de que el lenguaje de publicacion estandar es ALGOL-60. Ademas, existe una gran fuente de programas de aplicaciones y librarias de procedimientos que pueden ser facilmente convertidos para ser ejecutados con ALGOL-M. 1. Tipo de declaraciones ALGOL-M soporta tres tipos de variables: enteros, decimales, y cadenas. Los enteros pueden ser cualquier valor entre -16,383 y +16,383. Los decimales pueden ser declarados con hasta 18 digitos de precision y las cadenas pueden ser declaradas con un largo de hasta 255 caracteres. La precision por defecto para los decimales es de 10 digitos y el largo por defecto para las cadenas es 10 caracteres. El largo de las variables decimales y de cadena puede ser variables enteras con valores asignados en tiempo de ejecucion. Otra forma de declaracion en ALGOL-M es la declaracion de matrices. Las matrices pueden tener hasta 255 dimensiones con cada dimension en el rango desde 0 a +16,383. El maximo espacio de direcciones del microprocesador 8080 es de 63k, que limita el tamaño practico de las matrices a algo menor a dicho maximo. Los limites de una dimension son variables enteras con valor asignado en tiempo de ejecucion. Las matrices pueden ser de tipo entero, decimal o cadena. 2. Procesamiento Aritmetico La aritmetica decimal de enteros y binarios es soportada por ALGOL-M. Los enteros pueden ser usados en expresiones decimales y convertidos a decimales en tiempo de ejecucion. Las comparaciones enteras y decimales de menor que (<), mayor que (>), igual a (=), no igual (<>), menor igual (<=), y mayor igual (>=) han sido proveidas. Adicionalmente, los operadores logicos AND, OR y NOT estan disponibles. 3. Estructuras de Control Las estructuras de control en ALGOL-M consisten de BEGIN, END, FOR, IF THEN, IF THEN ELSE, WHILE, CASE y GOTO. Las llamadas a funciones y procedimientos son tambien usadas como estructuras de control. ALGOL-M es un lenguaje estucturado en bloques con un bloque normalmente con BEGIN y END. Los bloques pueden ser anidados dentro de otros bloques hasta 9 niveles. Las variables que son declaradas dentro de un bloque pueden ser referenciadas solamente dentro de ese bloque o un bloque anidado en ese bloque. Una vez el control del programa procede fuera de un bloque en el cual la variable ha sido declarada, esa variable no puede ser referenciada y de hecho, el espacio de almacenamiento en tiempo de ejecucion para dicha variable no existe mas. Las funciones, cuando son llamadas, devuelven un valor entero, decimal o cadena, dependiendo del tipo de funcion. Los procedimientos no devuelven ningun valor cuando se las llama. Tanto las funciones y procedimientos pueden tener ninguno o mas parametros que son llamados por su valor y pueden ser invocados recursivamente. 3. Input/Output (entrada/salida) La sentencia WRITE de ALGOL-M causa salida a la consola con nueva linea. La salida deseada es especificada en una lista dentro de parentesis. Las constantes de cadena pueden ser usadas en una lista y se caracterizan por estar dentro de marcas de comilla. Cualquier combinacion de variables o expresiones enteras, decimales y de cadena pueden tambien ser usadas en una lista. Una sentencia WRITEON es similar a WRITE excepto que continua en la misma linea del WRITE o WRITEON anterior. Cuando un total de 80 caracteres ha sido escrito en la consola, una nueva linea es hecha automaticamente. Una opcion TAB puede tambien ser usada en la lista causando que el sigte. elemento de la lista sea espaciado a la derecha en un monto especificado. El acceso a la Consola es mediante la sentencia READ seguida de una lista de una combinacion de valores enteros, decimales y cadenas dentro de parentesis. Si se requieren espacios en el acceso de entrada de una variable de cadena, la entrada debe estar entre comillas. READ provocara que el programa se detenga en tiempo de ejecucion hasta que los valores a ingresar sean tipeados en la consola y un retorno de carro se envie. Si los valores tipeados en la consola concuerdan con la lista en numero y tipo, la ejecucion del programa continua. Si se da un error por numero o tipo, la ejecucion del programa se detiene hasta que los valores correctos sean reingresados en la consola. 5. Acceso a Discos Un programa de ALGOL-M puede leer datos (desde) o escribir (a) uno o mas ficheros de disco que pueden estar en una o mas unidades de disco. Cuando se desea el ingreso o salida a un fichero, las sentencias apropiadas READ o WRITE son modificadas poniendo un identificador nombre de fichero inmediatamente despues de READ o WRITE. El nombre real del fichero puede ser asignado al nombre identificador cuando el programa es escrito o en tiempo de ejecucion. Varias unidades de disco son referenciadas por las letras de la A a la Z. Una unidad puede ser especificada prefijando el nombre real del fichero con la letra de la unidad deseada seguida de ":". Adicionalmente, si se desea acceder aleatoriamente al fichero, el nombre identificador puede ser seguido de una coma y una constante o variable entera. Este valor entero especifica el registro dentro del fichero que sera usado para entrada/salida. Antes de usar un nombre identificador en una sentencia READ o WRITE, el nombre identificador debe aparecer en una sentencia de declaracion de fichero. El nombre identificador solo puede ser referenciado dentro del mismo bloque (o uno mas abajo) de la declaracion. Los ficheros normalmente son tratados como ficheros secuenciales no en bloque. Pero, si un fichero en bloque es deseado, el largo del registro puede ser opcionalmente especificado entre llaves despues del nombre identificador en la sentencia de declaracion del fichero. II - MANUAL de REFERENCIA del ALGOL-M Esta seccion describe los diversos elementoos del ALGOL-M. El formato del elemento es mostrado, seguido de una descripcion y ejemplos de su uso. La sigte. notacion es utilizada: Llaves {} indican una entrada opcional. La barra vertical bar | indica elecciones alternas, una de las cuales debe aparecer. Las elipses "..." indican que el elementoo precedente puede ser optionalmente repetido. Las palabras reservadas se muestran en letras mayusculas. Las palabras reservadas y otros signos especiales deben de aparecer tal como son mostrados. Los elementos del lenguaje que aparecen en minusculas son definidos y explicadsos en otro apartado del manual. ELEMENTO: expresion aritmetica FORMATO: entero decimal variable {(} expresion aritmetica operador binario {)} {(} operador unario {)} DESCRIPCION: Los operadores en ALGOL-M tienen una precedencia implicada que es usada para determinar la forma como los operadores y operandos son agrupados. A-B/C hace que el resultado de B dividido por C sea restado de A. En este caso, B es considerado atado al operador "/" en vez de "-" lo que causa que la division se lleve a cabo primero. La precedencia implicada ata los operandos al operador adyacente de mas alta precedencia. Y esta es... unario: -,+ ** *,/ +,- Las parentesis pueden ser usadas para cancelar la precedencia implicada en la misma forma que se usan en algebra comun. Asi la expresion (A-B)/C causara que B sea restado de A y el resultado dividido entre C. EJEMPLOS: (X + Y) * (Z * Y + X) ** 2 X + Y + Z * X * Y * Z / 5.456 + I ELEMENTO: declaracion de ARRAY (matrices) FORMATO: INTEGER|DECIMAL|STRING {(expr)} ARRAY identificador ... lista de pares enlazados {,identificador} DESCRIPCION: La declaracion de matrices dinamicamente genera sitio para las matrices. La expresion opcional entera indica la longitud de cada elementoo de la matriz. Para las cadenas, el largo maximo es de 255 caracteres y para los decimales el maximo es 18 digitos. El largo de un entero no es especificado ya que el espacio adecuado para representar todos los valores enteros entre -16,383 y +16,383 es automaticamente hecho. Las matrices no son automaticamente initializadas a cero. EJEMPLO: INTEGER ARRAY X[0:5,0:5]; DECIMAL(10) ARRAY X,Y[3:6,5:10]; STRING ARRAY WORDS[Y+3:12]; STRING(20) WORD[0:X+5,5:10,15:20]; ELEMENTO: sentencia de asignacion FORMATO: variable := {variable :=} ... expresion DESCRIPCION: La expresion es evaluada y almacenada en la variable. Los tipos de asignacion permitibles son indicados por la tabla sigte.: expresion entero decimal cadena entero si no no variable decimal si si no cadena no no si Multiples asignaciones son permitidas con la expresion siendo asignada a todas las variables listadas. EJEMPLO: X := Y + Z; Y[1] := Y[2] := 50; ELEMENTO: asignacion al vuelo FORMATO: ( variable := { variable := } ... expresion ) DESCRIPCION: Algol-m permite una forma especial de la sentencia de asignacion conocida como asignacion al vuelo. Esta forma de sentencia de asignacion puede ser usada en cualquier parte donde una expresion es permitida. La expresion a la derecha de := es evaluada y entonces almacenada en la variable a su izquierda. El valor de toda la expresion es la misma que la de mitad derecha. La unica diferencia es el efecto secundario de guardar el resultado intermedio en la variable a la izq. Estos resultados inter medios pueden entonces ser usados al ultimo en el programa sin recalcularlas todas. EJEMPLO: A:= (B:=C + 5) * 2; IF (B:=C:=D+5) > 10 THEN WRITE(B); ELEMENTO: declaración equilibrada FORMATO: {definicion de etiqueta} sentencia simple {definicion de etiqueta} IF expresion booleana THEN declaración equilibrada ELSE declaración equilibrada DESCRIPCION: Si la expresion booleana es verdadera, la declaración equilibrada a la izq. de ELSE es ejecutada. Si la expresion booleana es falsa, la declaración equilibrada a la der. de ELSE es ejecutada. EJEMPLO: IF A < B THEN A := 1 ELSE A := 2; IF B = C THEN BEGIN WRITE(B); B := B + 1; END ELSE BEGIN WRITE(C); C := C + 1; END; NOTA: el punto y coma no esta permitido tras la sentencia que le precede inmediatamente a ELSE. ELEMENTO bloque FORMATO: BEGIN {declaracion;} ... sentencia; ... END; DESCRIPCION: El bloque es la fundacion del ALGOL-M. Cada vez que un nuevo bloque es entrado, nuevas variables pueden ser declaradas. Estas variables son unicas en el sentido de que una variable X declarada en dos bloques diferentes representa dos diferentes variables. Todo el almacenamiento dentro de un bloque es dinamico y asignado cuando el bloque es entrado y desasignado cuando el bloque es dejado. Un bloque puede ser usado en cualquier parte donde una sentencia simple puede ser usada. EJEMPLO: BEGIN X := 1; Y := 2; END; IF X = Y THEN BEGIN INTEGER X,Y; X := 3; Y := 4; END; NOTA: las declaraciones pueden no aparecer en bloques de casos. El ultimo END, que corresonde al BEGIN del inicio del programa, no es seguido de ningun pto. y coma. ELEMENTO: expresion booleana FORMATO: NOT expresion booleana expresion booleana OR expresion booleana expresion booleana AND expresion booleana {(} expresion =|<|>|>=|<=|<> expresion {)} DESCRIPCION: Las comparaciones entero-entero, decimal-entero, decimal- decimal, entero-decimal y cadena-cadena son permitidas en ALGOL-M. Para las comparaciones entero-decimal y decimal-entero, el valor entero es convertido a decimal previamente a la comparacion. El resultado de una comparacion de valores numericos esta basado en el tamaño de los numeros. El resultado de una comparacion de valores de cadena depende de una comparacion caracter por caracter donde la primera instancia de un caracter no igual establece el resultado booleano. La secuencia de clasificación del juego de caracteres ASCII es usado para la comparacion de cadenas. Generalmente, los numeros son seguidos de letras mayusculas que a su vez son seguidas de las minusculas. EJEMPLO: X > Y OR Y < Z; (X = Y) AND (Y = Z OR Z = 10); IF NOT X = 1 THEN WRITE("HELLO"); ELEMENTO: lista de pares enlazados FORMATO: [expresion : expresion{,expresion : expresion} ...] DESCRIPCION: Las expresiones en la lista de pares enlazados debe ser de tipo entero y mayor que o igual a cero. No puede tener mas de 255 dimensiones. EJEMPLO: [1:7,0:5] [3:6,x:y] [y*3:z,1:12] ELEMENTO: Sentencia CASE FORMATO: CASE expresion OF BEGIN sentencia; ... END; DESCRIPCION: La sentencia CASE permite al programador elegir una de varias sentencias a ejecutar. La sentencia elegida depende del valor de la expresion entera. La primera sentencia es ejecutada si la expresion evaluada es cero. Si el valor de la expresion es mayor que el numero de sentencias en el bloque de casos, el resultado de la accion es indefinido. EJEMPLO: CASE X+Y OF BEGIN WRITE("CASE 0"); WRITE("CASE 1"); END; ELEMENTO: constante FORMATO: entero|decimal|cadena DESCRIPCION: Una constante puede ser ya sea un entero, decimal o cadena. Las constantes enteras son numeros sin punto decimal en un rango de -16383 a +16383. Las constantes decimales son numeros con un punto decimal y no pueden exceder los 18 digitos. Las constantes de cadena pueden estar compuestas de cualquier combinacion de caracteres alfanumericos y signos especiales y pueden ser de hasta 255 caracteres de largo. Las cadenas entradas de una consola o disco pueden estar ya sea dentro de comillas o delimitadas con comas. Las cadenas usadas como constantes en el programa deben estar entre comillas. EJEMPLO: 10 10.5678 "EJEMPLO UNO" ELEMENTO: declaracion DESCRIPCION: Ver declaracion FILE (fichero), declaracion ARRAY(matrices), declaracion simple, declaracion de procedimientos y declaracion de funciones. ELEMENTO: expresion FORMATO: expresion booleana|aritmetica DESCRIPCION: Ver expresion aritmetica y expresion booleana. ELEMENTO: Declaracion de FILE (fichero) FORMATO: FILE identificador {(expresion)} {,identificador {(expresion)}} ... DESCRIPCION: Los identificadores usados en la declaracion FILE son identificadores de fichero que hacen referencia a nombres de fichero reales. Los nombres de fichero reales pueden ser asignados en tiempo de compilacion o en tiempo de ejecucion. La expresion opcional entera que le sigue al identificador de fichero es usado para especificar la longitud del registro en bytes para los bloques de registros. EJEMPLO: FILE TAPE1, TAPE2(128); NOTA: Los registros en bloque no estan implementados. ELEMENTO: Sentencia FOR FORMATO: {definicion de etiqueta} FOR sentencia de asignacion STEP expresion UNTIL expresion DO sentencia simple DESCRIPCION: La ejecucion de todas las sentencias dentro de la sentencia simple son repetidas hasta que la variable indice es mayor que o igual al valor de la expresion UNTIL. La variable indice es incrementada por el monto especificado en la expresion de STEP y debe ser incrementada por un monto positivo. Las expresiones UNTIL y STEP son evaluadas en cada bucle. EJEMPLO: FOR I := 1 STEP 1 UNTIL 10 DO X := Y; FOR INDEX := X+Y STEP 2 UNTIL X*Y DO BEGIN A := A + B; WRITE(A); END; ELEMENTO: invocar funcion FORMATO: identificador {(expresion {,expresion} ...)} DESCRIPCION: Las funciones aparecen como elementos primarios en aritmetica o expresiones booleanas. El paso de parametros es por valor. Las funciones pueden ser llamadas recursivamente sin ningun limite al numero de llamadas recursivas permitidas. EJEMPLO: X := RAND; Y := SQRT(5.6); C := FUNC * RND(2); ELEMENTO: declaracion de funcion FORMATO: INTEGER|DECIMAL|STRING FUNCTION identificador {(identificador {,identificador} ...)} {declaracion; ...} sentencia simple; DESCRIPCION: Una declaracion de funcion puede o no incluir parametros. Si los parametros son incluidos, deben ser declarados antes de la sentencia simple que representa el cuerpo de la funcion. Los parametros son pasados por valor y pueden ser de tipo entero, decimal o cadena. Las funciones retornan un valor al punto de llamada. El valor devuelto es asignado al nombre de la funcion (el cual es usado como una variable simple dentro de la funcion) previo al final de la misma. Las funciones pueden ser llamadas recursivamente sin limite alguno igual que el numero de llamadas recursivas que pueden hacerse. Las variables pueden ser declaradas dentro de funciones y son consideradas locales a la funcion. EJEMPLO: INTEGER FUNCTION VALUE(X); INTEGER X; BEGIN X := (X * 5) + (X * 2 ); VALUE := X; END; ELEMENTO: Sentencia GOTO FORMATO: definicion de etiqueta GO TO identificador|entero definicion de etiqueta GOTO identificador|entero DESCRIPCION: La ejecucion continua con la sentencia etiquetada con el identificador o entero que le sigue a la sentencia GOTO o GO TO. EJEMPLO: NEXT: GO TO 100; 100: GOTO NEXT; NOTA: Las sentencias GOTO solo pueden ser usadas para salir de dentro del bloque en curso o a un bloque externo. Las sentencias GOTO para salir fuera de subrutinas pueden causar resultados desconocidos. ELEMENTO: identificador FORMATO: letra {letra|numero} ... DESCRIPCION: Los identificadores empiezan con una letra y son seguidos de cualquier caracter alfanumerico. Si bien los identificadores de hasta 255 caracteres pueden ser usados, solo los primeros 31 caracteres son realmente usados para distinguir dichos identificadores. EJEMPLO: A NAME COUNTER1 ELEMENTO: Sentencia IF DESCRIPCION: Ver sentencia equilibrada o sentencia no equilibrada. ELEMENTO: expresion IF FORMATO: IF expresion booleana THEN expresion ELSE expresion DESCRIPCION: La expresion IF permite una expresion condicional de evaluacion. Si la expresion booleana es verdadera, el valor de la expresion IF es el valor de la expresion siguiente a THEN. Si la expresion booleana es falsa, el valor de la expresion IF es el valor de la expresion sigte. a ELSE. EJEMPLO: WRITE( IF A > B THEN A ELSE B ); A:= IF B=C THEN B ELSE D; ELEMENTO: definicion de etiqueta FORMATO: identificador|entero : DESCRIPCION: Las definiciones de etiquetas son opcionales en todas las sentencias ya sean estas equilibradas o no. EJEMPLO: FINISH: 100: ELEMENTO: invocacion a procedimiento FORMATO: identificador {(expresion {,expresion} ...)} DESCRIPCION: Los procedimientos pueden ser llamados con o sin parametros. El paso de parametros es por valor. Los procedimientos pueden ser llamados recursivamente sin limite fijado al numero de llamadas recursivas. EJEMPLO: COMPUTE; COMPARE("AAA", WORD); COUNT(1, 2, 3); ELEMENTO: declaracion de procedimiento FORMATO: PROCEDURE identificador {(identificador {,identificador} ...)} {declaracion; ...} sentencia simple DESCRIPCION: Una declaracion de procedimiento puede o no incluir parametros. Si los parametros son incluidos, deben ser declarados antes de la sentencia simple que representa el cuerpo del procedimiento. Los parametros son pasados por valor y pueden ser de tipo entero, decimal o cadena. Los procedimientos nunca devuelven un valor al punto de llamada. Pueden ser llamados recursivamente. Son considerados bloques separados dentro del que las variables locales pueden ser declaradas. EJEMPLO: PROCEDURE OUTPUT; WRITE ("HELLO"); PROCEDURE COMPARE(X,Y); INTEGER X,Y; BEGIN WRITE("THE LARGEST INTEGER IS "); IF X > Y THEN WRITE(X); ELSE WRITE(Y); END; ELEMENTO: Sentencia READ FORMATO: READ {file identificador}(variable {,variable} ...) {ONENDFILE bloque} DESCRIPCION: Si la forma de la sentencia READ es READ(, entonces el dispositivo de entrada es la consola. Del contrario una opcion de fichero debe ser especificada y el dispositivo de entrada es el disco. Una sentencia READ lee una o mas variables a la vez. La opcion ONENDFILE indica la accion a tomar cuando el final del fichero especificado es alcanzado. EJEMPLO: READ(WORDONE, X, VALUE2); READ FILE3 (WORDONE, X, VALUE2); NOTA: La seccion ONENDFILE actualmente no esta implementada. El identificador de fichero debe tener un nombre de fichero CP/M asignado antes de leer de dicho fichero. Cuando el nombre de este fichero es asignado en una sentencia de asignacion el fichero es abierto. Todos los ficheros son cerrados auto maticamente al terminar el bloque en que son declarados. Un error de cierre de fichero ocurre si el fichero es declarado pero nunca es abierto. ELEMENTO: lista de palabras reservadas FORMATO: letra {letra} ... DESCRIPCION: Las palabras reservadas de ALGOL-M y que no pueden ser usadas como identificadores son: AND ARRAY BEGIN CASE CLOSE DECIMAL DO ELSE END FILE FUNCTION GO GOTO IF INTEGER NOT OF ONENDFILE OR PROCEDURE READ STEP STRING TAB THEN TO UNTIL WHILE WRITE WRITEON Estas palabras reservadas deben ser precedidas y seguidas por ya sea un caracter especial o un espacio. Los espacios no deben ser incrustados dentro de las palabras reservadas. ELEMENTO: sentencia simple FORMATO: bloque|sentencia de asignacion|sentencia for| sentencia case||sentencia goto| sentencia while|sentencia read|sentencia write| llamada a procedimiento|identificador DESCRIPCION: Todas las sentencias de ALGOL-M son de formato libre y deben estar separados por pto. y coma. ELEMENTO: declaracion simple FORMATO: INTEGER|DECIMAL|STRING {(identificador|entero)} identificador {,identificador} ... DESCRIPCION: Las variables enteras simples pueden ser cualquier valor entre -16,383 y +16,383. Las variables decimales simples pueden ser especificadas de cualquier longitud desde 1 a 18 digitos con un largo por defecto de 10 digitos. Las variables de cadena simple pueden ser especificadas con longitud de 1 a 255 caracteres con un largo por defecto de 10 caracteres. EJEMPLO: INTEGER X; DECIMAL(15) X,Y; STRING(33) WORDONE, WORDTWO, WORDTHREE; ELEMENTO: caracteres especiales DESCRIPCION: Los sigtes. caracteres especiales son usado por ALGOL-M: ( abre parentesis ) cierra parentesis * asterisco + mas - menos : dos putos ; pto. y coma < menor que > mayor que = igual , coma [ abre corchete ] cierra corchete := asignador igual ** exponenciacion % porcentaje Cualquier caracter especial del juego de caracteres ASCII puede aparecer en una cadena. Los caracteres especiales, aparte de los arriba listados, causa una condicion de error si es usado fuera de una cadena. ELEMENTO: TAB FORMATO: TAB expresion DESCRIPCION: TAB es usado opcionalmente en una sentencia WRITE para causar espaciado en la linea de salida. El monto de espaciado es especificado por la expresion entera que sigue a TAB. EJEMPLO: WRITE("NEXT NAME", TAB 5, NAME[I]); ELEMENTO: sentencia no equilibrada FORMATO: {definicion de etiqueta} IF expresion booleana THEN sentencia {definicion de etiqueta} IF expresion booleana THEN sentencia equilibrada ELSE sentencia no equilibrada DESCRIPCION: A diferencia de las sentencias equilibradas que siempre tienen una sentencia balanceada ya sea al lado del ELSE en una estructura IF THEN ELSE, una sentencia no equilibrada puede no incluir la parte ELSE de la sentencia. EJEMPLO: IF S > Y THEN WRITE(X); IF X < Y THEN IF Z > Y THEN WRITE(Z) ELSE WRITE(X); NOTA: El pto. y coma no esta permitido tras la sentencia inmediata que precede a un ELSE. ELEMENTO: variable FORMATO: identificador {[lista de pares enlazados]} DESCRIPCION: Una variable en ALGOL-M pueden ser simple o con subindice y de tipo INTEGER (entero), DECIMAL, o STRING (cadena). EJEMPLO: X VALUE[2] Z[1,X * Y] ELEMENTO: Sentencia WHILE FORMATO: WHILE expresion booleana DO sentencia simple DESCRIPCION: Las sentencias WHILE continuan ejecutando la sentencia simple que sigue a DO mientras la expresion booleana sea verdadera. EJEMPLO: WHILE I > 0 DO I := I - 1; WHILE X > 5 AND Y <> 8 DO BEGIN X := X / 3; WRITE(X); END; ELEMENTO: Sentencia WRITE FORMATO: WRITE|WRITEON {opcion de fichero} (expresion|tab expresion|cadena {,expresion|tab expresion|pic definicion|cadena} ...) DESCRIPCION: La opcion WRITE indica que la salida empezara a imprimir en una nueva linea, mientras la opcion de WRITEON continua imprimiendo en la misma linea. Si la forma de la sentencia es WRITE( o WRITEON(, el dispostivo de salida es la consola. De lo contrario, una opcion de fichero debe ser especificada y el dispostivo de salida es el disco. EJEMPLO: WRITE(X); WRITE("THE NUMBER IS",X + Y); WRITE("ANSWER", TAB 5, X * Y); WRITE FILE("hello"); III - MENSAJES DE ERROR iii.1 -MENSAJES DE ERROR DEL COMPILADOR AS Funcion/Procedimiento a la izq. de la sentencia de asignacion. BP subtipo incorrecto de pares enlazados (debe ser entero). DE error de disco; ninguna accion correctiva puede ser tomada por el programa. DD Doble declaracion de identificador, etiqueta, variable etc. FP sentencia incorrecta de fichero abierto. IC caracter especial no valido. ID Subtipos incompatibles (valores decimales no pueden ser asignados a variables enteras). IO Entero desbordado. IT Identificador no declarado como una variable simple o funcion. NG No se encontro el fichero ALG. NI Subtipo es no entero. NP No existe produccion aplicable. NS Subtipo es no cadena. NT las expresiones de las clausulas FOR, Step expresion y Until no son del mismo subtipo (todas deben ser enteros o decimales). PC el numero de parametros en la llamada al procedimiento no encaja con el numero de la declaracion de dicho procedimiento. PD parametro no declarado. PM el tipo del parametro no encaja con el tipo declarado. SO desbordamiento de la pila. SI el subindice de la matriz no es de subtipo entero. TD Subtipo tiene que ser entero o decimal. TM Subtipos no encajan o son incompatibles. TO tabla de simbolos desbordada. TS variable con subindice no declarada. UD identificador no declarado. UF fichero/funcion no declarados. UL etiqueta no declarada. UP procedimiento no declarado. US variable simple no declarada. VO tabla de Var. desbordada. Posiblemente causado por demasiados identificadores largos. iii.2 - MENSAJES DE ERROR DEL INTERPRETE AB subindice de matriz fuera de sus limites. CE error de cierre de fichero en disco. DB el largo del campo de entrada es mayor al tamaño del buffer. DW error de escritura de fichero en disco. ER error de escritura del tamaño del bloque de Variables. IO debordamiento entero(el valor es mayor que 16383). IR numero de registro incorrecto o fichero random no inicializado. ME error de creacion de fichero en disco. NA No se encontro fichero AIN en el directorio. OV el registro Decimal se desbordo durante operacion aritmetica o de carga. RE se intento leer mas alla del fin de registro en fichero en bloque. RU se intento el acceso random a un fichero no en bloque. SK desbordamiento de la pila (no hay mas memoria disponible). iii.3 - MENSAJES DE ADVERTENCIA AZ se intento asignar un decimal nulo o cadena nula, por defecto el sistema usa 10 digitos/caracteres. DO desbordamiento Decimal durante operacion de almacenamiento. El valor de la variable es fijado a 1.0 y la ejecution continua. La asignacion del tamaño de la variable debe ser incrementada en su sentencia de declaracion. DI error de formato de variable en fichero de disco. DZ division decimal por cero, el resultado es puesto a 1.0. EF fin de fichero en lectura. IA suma/resta de enteros desbordada o reducida, el resultado es puesto a 1. II la entrada por consola no es valida. Intente de nuevo. IR numero de registro incorrecto o fichero random no inicializado. IZ division entera por cero. El divisor es puesto a 1 y la division es completada. NX exponencial negativo. La exponenciacion no es hecha. SO caracteres pedrdidos durante el almacenamiento de la cadena. (c)2022 zx_if1@hotmail.com