Curso de Cobol y PowerCobol

Guía del metalenguaje de COBOL

Capítulo 30: El metalenguaje de COBOL

Empecemos con un tema bastante importante para entender mejor las posibilidades sintácticas que tenemos con todo sobre el lenguaje COBOL. Se trata del metalenguaje COBOL.

¿Qué es el metalenguaje de COBOL?

El metalenguaje de COBOL es solo una forma de expresar la sintaxis de COBOL con una notación en concreto. Conociéndola, podrás ver que cosas se pueden utilizar con una palabra COBOL, que cosas son opcionales, etc.

Ahora que ya sabes bastantes cosas sobre el funcionamiento de COBOL, es buen momento para que entiendas este tema.

¿Por qué aprender este metalenguaje?

Sencillamente, porque cuando lo conoces, te ayuda a tener una visión panorámica del uso de ciertas cosas de COBOL. Este metalenguaje, es como una mini referencia super reducida.

Además, empezaremos a utilizarlo en los siguientes capítulos y muchas explicaciones que encontrarás de COBOL, a parte de las mías, llevan este metalenguaje.

Metalenguaje COBOL de COMPUTE

Como ejemplo para empezar a entender este metalenguaje, te voy a poner el de COMPUTE.

La siguiente imagen, puede parecer una locura, sin embargo, es más fácil de entender que lo que aparenta este diagrama.

Se trata del metalenguaje correspondiente a COMPUTE:

Metalenguaje compute de COBOL

En esta imagen tienes la leyenda para que tengas unas indicaciones claras de cada elemento.

Metalenguaje de COBOL

Todos los metalenguajes de cobol que encuentres de COBOL, van a ser en blanco y negro con gran sencillez. Sin embargo, contienen los mismos elementos que mis diagramas, yo solo le añado colores para que sea más fácil de entender.

Si tienes algún problema para visualizar los colores, no te preocupes, ya que los elementos del metalenguaje, van indicados igual que en los diagramas clásicos.

De todas formas, si algo no te queda claro, te invito a que me dejes un comentario para que te de una ayuda. Siempre estoy a tiempo de añadir nuevas cosas según las dudas que os queden.

Partes del metalenguaje subrayadas

Las partes en color rojo (las que contienen cosas subrayadas), como COMPUTE, ROUNDED, SIZE ERROR son palabras reservadas del lenguaje COBOL.

Estas, al estar subrayadas, indican que son obligatorias en la estructura.

Por ejemplo, para declarar un COMPUTE, obviamente, debemos utilizar primero, la palabra reservada COMPUTE.

Llaves en el metalenguaje de COBOL

Las llaves ({ }), indican que los elementos que encierran, nos dan una opción a elegir obligatoriamente. Si solo hay una como en el caso de las primeras llaves, hay que elegir esa opción si o si.

A veces, como en este caso, se encierran elementos entre llaves de esta forma, con una sola opción a elegir, para añadir el elemento de repetición (los puntos suspensivos que ahora explicaré).

Partes del metalenguaje con identificadores

La parte de color rosa (la que pone "Identificador#i"), es una palabra o identificador que escribe la persona que programa. Un identificador, es un nombre de por ejemplo, una variable.

Lo que escribimos después del COMPUTE, será siempre un identificador (variable).

Al ser un elemento propio (que no es reservado del lenguaje), se indica con la convención propia de nombres propios. Primera letra en mayúscula y el resto en minúsculas.

Sufijos de identificadores

¿Qué representa el símbolo #i?

Se trata de los sufijos de identificadores o del tipo de dato admitido por el identificador.

Los sufijos de identificadores se escriben para expresar el tipo de dato que se espera para un identificador.

Sufijo Descripción
$i Dato alfanumérico o alfabético
#i Dato numérico
$#i Dato alfanumérico, alfabético o numérico
$il Dato alfanumérico, alfabético o numérico o string (literales)
#il Dato numérico o numérico literal
$#il Dato numérico, alfabético o alfanumérico. Se incluye el uso de literales de estos tipos.

Si te fijas en esta tabla, el tipo de dato que puede llevar el identificador del COMPUTE, es numérico.

Probemos todo lo que llevamos hasta ahora.

COMPUTE.

Si no utilizamos la parte de las llaves, el COMPUTE sin el identificador, da este error: "Error de sintaxis, punto inesperado."

syntax error, unexpected .

¿Te has fijado que hay varios tipos de sufijos para los datos numéricos?

El primero (#i) sería el acertado, pero, ¿por qué los otros no?

La respuesta, es que después del COMPUTE, pasarás un identificador de tipo numérico, no puedes pasarle un número literal (#il) y tampoco uno alfanumérico o alfabético ($#i), por lo tanto, lo correcto es '#i'.

COMPUTE Resultado.

Si dejamos el identificador sin ninguna operación aritmética, nos dará el mismo error de antes:

syntax error, unexpected .

La parte opcional del metalenguaje COBOL

Después de poner el identificador, nos encontramos con unos corchetes ([ ]), estos indican, que todos los elementos que haya entre ellos, se pueden utilizar de manera opcional, por ejemplo el uso de ROUNDED que no es obligatorio en un COMPUTE.

Entonces, ¿por qué está ROUNDED subrayado? ¿No indica esto que es obligatorio?

La respuesta es que sí. ROUNDED es obligatorio, pero en su propio contexto. Es obligatorio si decides utilizar su parte opcional.

Esto no tiene mucho sentido aquí, ya que es el único elemento de su contexto, pero en los siguientes ejemplos, lo encontrarás.

La parte obligatoria de un COMPUTE

Finalmente, obligatoriamente, debes poner la expresión aritmética. Este sería un COMPUTE con los elementos mínimos obligatorios:

COMPUTE Resultado = 10 + 5.

Parte de repetición del metalenguaje COBOL

Te habrás fijado, que después de las primeras llaves, hay unos puntos suspensivos (...). Esto indica que la parte entre las llaves, se puede repetir tantas veces como queramos.

Aquí tienes un ejemplo de su uso:

⁠⁠       IDENTIFICATION DIVISION.
       PROGRAM-ID. Capitulo30.

       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       SPECIAL-NAMES.
      *> Especificamos que el punto decimal es una coma.
           DECIMAL-POINT IS COMMA.
       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
       77  Resultado1 PIC 99V99 VALUE ZEROS.
       77  Resultado2 PIC 99 VALUE ZEROS.
       77  Resultado3 PIC 99V99 VALUE ZEROS.

       PROCEDURE DIVISION.
       Calcula.

       COMPUTE Resultado1 ROUNDED, Resultado2 ROUNDED,
       Resultado3 = 9 + 5,8387.

       DISPLAY Resultado1.
       DISPLAY Resultado2.
       DISPLAY Resultado3.

       STOP RUN.
       END PROGRAM Capitulo30.

En la consola, podemos apreciar lo que ocurre. Si quieres obtener diferentes resultados de una misma operación con diferentes PICTURE, lo puedes hacer con esta repetición de Identificador + ROUNDED tantas veces como quieras.

14,84
15
14,83

En el primer resultado, se hace redondeo, en el segundo también (siempre teniendo en cuenta el tamaño de los PICTURE) y finalmente, el tercer resultado, es el que no se redondea.

El metalenguaje indica que podemos almacenar redondeado el resultado en diferentes variables, pero no que podemos realizar múltiples operaciones aritméticas con el mismo COMPUTE. De ahí, que los puntos suspensivos estén antes de la expresión aritmética en el metalenguaje y no después.

No puedes hacer algo como esto:

COMPUTE Resultado1 ROUNDED = 9 + 5,8387, 
Resultado2 ROUNDED = 1 + 1.

El error dice: "Error de sintaxis, identificador inesperado".

Esto nos dice, que el nombre del identificador "Resultado2" no se acepta después de la operación aritmética.

syntax error, unexpected Identifier

¿Ves la cantidad de cosas que nos indica el metalenguaje? Solo llevamos la primera parte, y ya nos ha dado una gran cantidad de indicaciones.

Si decidimos usar la parte opcional de abajo, nos encontramos con unas llaves. Estas llaves, tal como he indicado, obligan a utilizar el código que hay en ellas (si decidimos utilizar esta parte opcional). Si las llaves tienen más de una opción, debemos elegir solo una.

Sin embargo, los símbolos (<>) que son de mi propia invención (es lo único que no verás en cualquier metalenguaje COBOL), indican algo que no se estaba indicando en el metalenguaje clásico

Lo que se indica, es que podemos repetir la elección de lo que hay en las llaves, pero una sola vez por opción. Es decir, en este caso, se puede usar ON SIZE ERROR y poner NOT ON SIZE ERROR. Después de esto, no se puede repetir de nuevo una de estas elecciones.

Aquí tienes un ejemplo donde se contempla una salida concreta para cuando no hay error de tamaño de PICTURE y otra para cuando si lo hay.

⁠⁠       IDENTIFICATION DIVISION.
       PROGRAM-ID. Capitulo30.

       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       SPECIAL-NAMES.
      *> Especificamos que el punto decimal es una coma.
           DECIMAL-POINT IS COMMA.
       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
       77  Resultado PIC 99 VALUE ZEROS.

       PROCEDURE DIVISION.
       Calcula.

       COMPUTE Resultado ROUNDED = 10 
       NOT ON SIZE ERROR DISPLAY "No hay error de tamaño." 
       ON SIZE ERROR DISPLAY "Ha ocurrido un error de tamaño.".

       DISPLAY Resultado.
       
       STOP RUN.
       END PROGRAM Capitulo30.
No hay error de tamaño.
10

En el caso de que el PICTURE es pequeño y el valor no cabe, saca el otro mensaje o acción que tuviera en su lugar.

Ha ocurrido un error de tamaño.
0
¡Atención! El uso de estas dos opciones a la vez, funciona en cualquier orden con el estándar de COBOL 2014, parece que en el 2002 también y puede que con alguno más. Más si empleas el estándar COBOL 85, esto no funcionará en cualquier orden.

El error que recibirás en OpenCOBOLIDE, será este:

El error, lo que quiere decir, es que en el estándar COBOL85, no se puede emplear NOT ON SIZE ERROR antes que ON SIZE ERROR.

NOT ON SIZE ERROR before ON SIZE ERROR does not conform to COBOL85.

Entonces, solo tienes que invertir el orden y cumplirás con los diferentes estándares de COBOL. Sigue el orden que he puesto en el metalenguaje.

COMPUTE Resultado ROUNDED = 10 
ON SIZE ERROR DISPLAY "Ha ocurrido un error de tamaño."
NOT ON SIZE ERROR DISPLAY "No hay error de tamaño.".

Por último, indicarte, que la instrucción en cada una de las opciones, es obligatoria si se usa la opción.

El END-COMPUTE no es obligatorio. Se puede finalizar la estructura con un punto, o con un END-COMPUTE o incluso, la puedes dejar en ciertos casos sin finalizar (nada recomendable).

El metalenguaje COBOL de DISPLAY

Metalenguaje display de COBOL

Antes de finalizar, veamos un metalenguaje más sencillo, el de un DISPLAY. Así me aseguro de que entiendas mejor este tema y que además, te quedes con información extra sobre un elemento que hemos tocado en casi todos los capítulos del curso.

Tenemos como obligatorio el DISPLAY.

Lo siguiente que debemos elegir, es entre añadir un valor literal o un valor mediante un identificador. Los valores de estos serán de tipo ($#il). DISPLAY admite todos los tipos de identificadores o literales.

Esta elección, es repetible, podemos dar cuantos valores queramos.

Después, vendría una parte opcional llamada UPON, cosa que veremos más adelante si procede. Por el momento, no te la incluyo en el metalenguaje.

Finalmente, de forma opcional, se puede especificar el WITH NO ADVANCING, con el WITH opcional si decides usar esta parte del DISPLAY.

Más que suficiente para este trigésimo capítulo. No te pierdas los próximos capítulos para aprender mucho más.


Comentarios

Si te quedan dudas sobre el temario, sobre Cobol, o cualquier otra cosa relacionada o simplemente quieres agradecer, aquí tienes tu sitio para dejar tu granito de arena. Gracias por tus comentarios y por darle vida a este sitio web.

Programación Fácil YouTube

Suscríbete

Si te ha gustado este curso y crees que el trabajo merece la pena, te agradeceré eternamente que te suscribas a mi canal de YouTube para apoyarme y que pueda seguir haciendo cursos gratuitos.

Además, si te encanta la programación, tienes un montón más de cursos gratuitos para ver.

No solo eso, podrás participar enviándome comentarios con tus sugerencias para temas específicos o cursos completos o incluso las dudas que tengas y las intentaré ir resolviendo en los cursos que estén todavía abiertos.