Nivel inicial11 min de lectura · Publicado el

Usos y reglas de COBOL: palabras, literales y constantes

Nombres en COBOL: un formulario de registro donde AREA sale rechazado por ser palabra reservada y WS-AREA aparece como disponible. COBOL: AREA no, WS-AREA sírubentejera.com AREApalabra reservadaWS-AREAdisponible
Como al elegir usuario en una web: AREA ya está cogido (es palabra reservada) y WS-AREA, libre. Normas: hasta 30 caracteres; letras, dígitos, guion y guion bajo; sin guion al principio ni al final.

COBOL es muy estricto con cómo se escriben las cosas. Un nombre con un carácter que no toca, una palabra que el lenguaje ya usa o un punto mal puesto, y el programa no compila o, peor, compila y hace otra cosa.

Es como registrarte en una web: el nombre de usuario solo admite ciertos caracteres, tiene una longitud máxima y no puedes elegir «admin» porque ya está reservado. COBOL funciona igual con los nombres de tus campos, párrafos y ficheros.

Las reglas de este artículo están comprobadas en el manual de IBM Enterprise COBOL 6.5 y todos los ejemplos se han compilado con GnuCOBOL 3.2, un compilador libre que puedes usar en tu ordenador. Si es tu primer contacto con COBOL, empieza por la estructura de un programa COBOL.

Caracteres permitidos

Estos son los caracteres básicos con los que se escribe un programa COBOL (fuera de los textos entre comillas):

Carácter Qué es Para qué se usa
A–Z, a–z Letras latinas, sin la Ñ ni tildes Nombres y palabras del lenguaje
0–9 Dígitos Nombres, números y niveles
(espacio) Espacio Separa palabras
+ - * / Más, menos o guion, asterisco, barra Operaciones, formatos de PIC, comentarios y continuación
= < > Igual, menor que, mayor que Comparaciones y COMPUTE
$ Símbolo de moneda Formatos de PIC
. , ; Punto, coma y punto y coma Separadores; el punto también es la coma decimal
: Dos puntos Separador en algunas instrucciones
" ' Comillas y apóstrofo Delimitan los textos (literales)
( ) Paréntesis Expresiones, índices y funciones
_ Guion bajo Nombres (en IBM Enterprise COBOL y GnuCOBOL)

Dentro de un texto entre comillas, en cambio, puedes escribir cualquier carácter, incluida la Ñ. Ten en cuenta que en formato fijo una letra con tilde puede descuadrar las columnas: lo explico en la hoja de codificación de un programa COBOL.

Cómo se forman los nombres

Los nombres que inventas tú (campos, párrafos, ficheros…) se llaman palabras definidas por el usuario. Siguen estas reglas:

  • Solo letras de la A a la Z, dígitos del 0 al 9, el guion (-) y el guion bajo (_).
  • Como mucho, 30 caracteres.
  • No pueden empezar ni terminar en guion. El guion bajo no puede ir al principio.
  • Deben tener al menos una letra. La excepción son los nombres de párrafo y de sección, que pueden ser solo números.
  • No pueden ser una palabra reservada.
  • Mayúsculas y minúsculas son equivalentes: SALDO-TOTAL, saldo-total y Saldo-Total son el mismo nombre.

Ejemplos válidos:

  • SALDO-TOTAL
  • WS-LEIDOS2
  • GRABADOS

En COBOL lo habitual es separar las palabras con guion, como en SALDO-TOTAL. El guion bajo también lo aceptan IBM Enterprise COBOL y GnuCOBOL, pero se ve mucho menos.

Qué pasa si te saltas una regla

Este programa tiene tres nombres mal formados: uno termina en guion, otro tiene 31 caracteres y el tercero es solo un número.

       IDENTIFICATION DIVISION.
       PROGRAM-ID. NOMBRES.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  SALDO-           PIC 9.
       01  NOMBRE-DE-CAMPO-DEMASIADO-LARGO PIC 9.
       01  2024             PIC 9.
       01  SALDO_TOTAL      PIC 9.
       PROCEDURE DIVISION.
           STOP RUN.

GnuCOBOL con las reglas de IBM (-std=ibm-strict) se queja de los tres y acepta SALDO_TOTAL:

nombres.cob:5: error: syntax error, unexpected -
nombres.cob:6: error: word length exceeds 30 characters: 'NOMBRE-DE-CAMPO-DEMASIADO-LARGO'
nombres.cob:7: error: syntax error, unexpected Literal

Palabras reservadas

Son las palabras que COBOL ya usa para algo: ACCESS, ADD, BY, COMPUTE, IF, EXIT, MOVE, OPEN, REDEFINES, STOP… Están en inglés y no puedes usarlas como nombre.

¿Cuántas hay? Depende del compilador y de su versión. La tabla de IBM Enterprise COBOL 6.5 marca como reservadas unas 400 palabras, y otras 61 como posibles reservadas en el futuro, que IBM recomienda no usar. GnuCOBOL, que admite varios dialectos de COBOL, reconoce cerca de mil. Por eso, más que memorizar una lista, consulta la de tu compilador:

Lo que sí puedes hacer es combinar una palabra reservada con otras:

  • Nombre de campo válido: WS-AREA
  • Nombre de campo no válido: AREA

Si usas AREA como nombre de campo, GnuCOBOL no compila:

reservada.cob:5: error: syntax error, unexpected AREA
    3 |        DATA DIVISION.
    4 |        WORKING-STORAGE SECTION.
    5 >        01  AREA             PIC X(5).

Por eso es tan común el prefijo WS- (de WORKING-STORAGE) en los nombres de campo: además de decir dónde está definido el campo, evita chocar con una palabra reservada.

Literales numéricas y alfanuméricas

Una literal es un valor escrito tal cual en el código, como 7398 o "PAGINA: ". También se las llama constantes. Se usan, por ejemplo, para dar un valor inicial a un campo.

Literales numéricas

  • Dígitos del 0 al 9, un signo opcional (+ o -) y, como mucho, un punto decimal.
  • El signo va siempre a la izquierda. Si no lleva signo, el número es positivo.
  • El punto decimal puede ir en cualquier sitio menos al final.
  • Máximo 18 dígitos en IBM Enterprise COBOL con la opción por defecto, ARITH(COMPAT). Con ARITH(EXTEND), hasta 31. GnuCOBOL admite hasta 38 por defecto.
  • Ejemplos: 7398, -245, 568.42, +274.83.

¿Por qué no puede acabar en punto? Porque el compilador lo confundiría con el punto que cierra la sentencia. Si escribes MOVE 7398. TO WS-GRANDE, GnuCOBOL entiende que la sentencia termina en 7398:

literales.cob:9: error: syntax error, unexpected ., expecting TO

Literales alfanuméricas

  • Van entre comillas (") o apóstrofos ('). Hay que cerrar con el mismo que abriste.
  • Máximo 160 caracteres.
  • Para poner unas comillas dentro del texto, se escriben dos seguidas: "Dijo ""hola"" y se fue" se guarda como Dijo "hola" y se fue.
  • Ejemplos: "REPORTE DE CONTABILIDAD", "PAGINA: ", "DIVISION DE MERCADOTECNIA NUMERO 189".

Con las reglas de IBM, GnuCOBOL rechaza un texto de 161 caracteres:

largo.cob:6: error: invalid literal: 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ...'
largo.cob:6: note: literal length exceeds 160 characters

Inicialización

Hay dos formas de dar un valor a un campo con una literal:

VALUE

En la definición de datos (DATA DIVISION). El campo nace con ese valor.

01 CAMPO-X PIC X(11) VALUE "CURSO COBOL".

MOVE

En la lógica del programa (PROCEDURE DIVISION). Cambia el valor mientras se ejecuta.

MOVE -729 TO CAMPO-Z

Constantes figurativas

Son palabras reservadas que ya tienen un valor. Se usan mucho para inicializar o limpiar campos, porque se adaptan al tamaño del campo: SPACES llena de espacios un campo de 1 o de 100 caracteres.

El original de este artículo hablaba de cinco. Según el manual de IBM son más:

Constante Formas válidas Qué representa
ZERO ZERO, ZEROS, ZEROES El número cero, o caracteres 0
SPACE SPACE, SPACES Uno o más espacios en blanco
HIGH-VALUE HIGH-VALUE, HIGH-VALUES El carácter más alto del juego de caracteres (en EBCDIC, X'FF')
LOW-VALUE LOW-VALUE, LOW-VALUES El carácter más bajo (en EBCDIC, X'00')
QUOTE QUOTE, QUOTES Unas comillas ("), o un apóstrofo si el compilador usa la opción APOST
NULL NULL, NULLS Una dirección vacía, para punteros
ALL literal ALL "*", ALL '-'… Repite la literal hasta llenar el campo

Además existen los caracteres simbólicos, que defines tú en el párrafo SPECIAL-NAMES, pero son mucho menos habituales.

HIGH-VALUES y LOW-VALUES se suelen usar como marca: por ejemplo, para indicar que se ha llegado al final de un fichero al comparar claves.

Inicialización

Igual que las literales, se usan con VALUE o con MOVE:

       01  CAMPO-X          PIC X(11)    VALUE SPACES.
           MOVE HIGH-VALUES TO CAMPO-Z

Niveles: cómo se organizan los datos

Cada campo de la DATA DIVISION empieza con un número de nivel. Funciona como el índice de un libro: el capítulo 1 contiene los apartados 1.1 y 1.2. En COBOL, un nivel 01 contiene campos de nivel 05, 10…

Nivel Para qué sirve Dónde empieza
01 Un registro o campo principal Área A (columnas 8–11)
02–49 Campos dentro de un grupo Área A o B
66 Renombra un grupo de campos (RENAMES) Área A o B
77 Un campo suelto, que no forma parte de ningún grupo Área A
88 Un nombre de condición: un valor con nombre propio Área A o B

Los números intermedios no tienen que ser consecutivos. Es costumbre ir de 5 en 5 (01, 05, 10…) para poder meter niveles nuevos sin renumerar.

El nivel 88 es el que más se agradece al leer un programa: en vez de IF WS-ESTADO = "A", escribes IF CLIENTE-ACTIVO. Lo verás en el ejemplo completo.

El punto: dónde termina cada cosa

En COBOL, el punto seguido de un espacio cierra una frase entera:

  • En la IDENTIFICATION DIVISION, cada párrafo termina en punto. Lo tienes en la IDENTIFICATION DIVISION.
  • En la DATA DIVISION, cada definición de campo (01 ..., 05 ...) termina en punto.
  • En la PROCEDURE DIVISION, cada sentencia (una o varias instrucciones seguidas) y cada párrafo terminan en punto.

Este último punto es el que da problemas. Dentro de un IF, un punto no cierra solo esa línea: cierra el IF entero. Mira este programa:

       IDENTIFICATION DIVISION.
       PROGRAM-ID. PUNTO.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  WS-SALDO         PIC S9(3) VALUE 5.
       PROCEDURE DIVISION.
           IF WS-SALDO < 0
               DISPLAY "Saldo negativo".
               DISPLAY "Aviso enviado"
           DISPLAY "Fin del programa"
           STOP RUN.

El saldo es 5, no es negativo, y aun así el programa avisa:

Aviso enviado
Fin del programa

El punto después de "Saldo negativo" cierra el IF. La línea siguiente ya no depende de la condición, aunque la sangría diga lo contrario: al compilador la sangría le da igual.

Un punto de más no da error: cambia lo que hace el programa.

La solución es cerrar el IF con END-IF y no poner puntos dentro:

           IF WS-SALDO < 0
               DISPLAY "Saldo negativo"
               DISPLAY "Aviso enviado"
           END-IF
           DISPLAY "Fin del programa"
           STOP RUN.

Ahora solo sale Fin del programa. Muchos equipos siguen la norma de poner un único punto al final de cada párrafo y usar END-IF, END-PERFORM, END-READ… para todo lo demás.

Todo junto: un programa que compila

Este programa usa las reglas del artículo: nombres con guion y con número, minúsculas, una literal con comillas dentro, constantes figurativas, niveles 01, 05, 77 y 88, VALUE y MOVE.

       IDENTIFICATION DIVISION.
       PROGRAM-ID. REGLAS.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  SALDO-TOTAL      PIC S9(5)V99 VALUE 568.42.
       01  WS-LEIDOS2       PIC 9(3)     VALUE ZEROS.
       01  GRABADOS         PIC 9(3)     VALUE 7.
       01  WS-AREA          PIC X(11)    VALUE "CURSO COBOL".
       01  WS-CITA          PIC X(20)    VALUE "Dijo ""hola"" y se fue".
       01  WS-LINEA         PIC X(10)    VALUE ALL "*".
       01  WS-CLIENTE.
           05  WS-NOMBRE    PIC X(10)    VALUE SPACES.
           05  WS-ESTADO    PIC X        VALUE "A".
               88  CLIENTE-ACTIVO        VALUE "A".
       77  WS-CONTADOR      PIC 9(2)     VALUE 0.
       PROCEDURE DIVISION.
           MOVE -245 TO SALDO-TOTAL
           display "saldo-total: " Saldo-Total
           DISPLAY "WS-LEIDOS2:  " WS-LEIDOS2
           DISPLAY "GRABADOS:    " GRABADOS
           DISPLAY "WS-AREA:     " WS-AREA
           DISPLAY "WS-CITA:     " WS-CITA
           DISPLAY "WS-LINEA:    " WS-LINEA
           MOVE "ANA" TO WS-NOMBRE
           IF CLIENTE-ACTIVO
               DISPLAY "Cliente activo: " WS-NOMBRE
           END-IF
           MOVE HIGH-VALUES TO WS-NOMBRE
           IF WS-NOMBRE = HIGH-VALUES
               DISPLAY "WS-NOMBRE esta lleno de HIGH-VALUES"
           END-IF
           MOVE ALL "-" TO WS-LINEA
           DISPLAY "WS-LINEA:    " WS-LINEA
           MOVE QUOTE TO WS-ESTADO
           DISPLAY "QUOTE:       " WS-ESTADO
           STOP RUN.

Salida:

saldo-total: -00245.00
WS-LEIDOS2:  000
GRABADOS:    007
WS-AREA:     CURSO COBOL
WS-CITA:     Dijo "hola" y se fue
WS-LINEA:    **********
Cliente activo: ANA
WS-NOMBRE esta lleno de HIGH-VALUES
WS-LINEA:    ----------
QUOTE:       "

Fíjate en la primera línea: display y Saldo-Total en minúsculas funcionan igual que en mayúsculas. Y ZEROS llena de ceros WS-LEIDOS2, mientras que ALL "*" y ALL "-" repiten el carácter hasta completar los 10 de WS-LINEA.

Pruébalo tú

Si tienes Docker, puedes compilarlo con GnuCOBOL sin instalar nada. Guarda el programa como reglas.cob y ejecuta:

docker run --rm -v "$PWD":/src -w /src debian:stable bash -c '
  apt-get update -qq && apt-get install -y -qq gnucobol > /dev/null 2>&1
  cobc -x reglas.cob -o /tmp/reglas && /tmp/reglas
'

Para comprobar un programa con las reglas de IBM, sin ejecutarlo, usa cobc -fsyntax-only -std=ibm-strict programa.cob.

Sigue con COBOL

Fuentes

Comprobado en noviembre de 2026 en IBM Enterprise COBOL for z/OS 6.5, Language Reference:

Los límites de GnuCOBOL (63 caracteres por nombre y 38 dígitos por defecto; 30 y 160 con -std=ibm-strict) están en sus ficheros de configuración default.conf e ibm-strict.conf de la versión 3.2.

Todos los programas, salidas y errores del artículo se han ejecutado con GnuCOBOL 3.2.0 (paquete gnucobol3 3.2-3 de Debian 13, imagen oficial debian:stable en Docker).