Usos y reglas de COBOL: palabras, literales y constantes
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-totalySaldo-Totalson el mismo nombre.
Ejemplos válidos:
SALDO-TOTALWS-LEIDOS2GRABADOS
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:
- IBM Enterprise COBOL: tabla de palabras reservadas.
- GnuCOBOL: ejecuta
cobc --list-reserved.
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). ConARITH(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 comoDijo "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
- Estructura de un programa COBOL: las cuatro divisiones.
- Hoja de codificación de un programa COBOL: qué va en cada columna.
- IDENTIFICATION DIVISION: la primera división, paso a paso.
- DATA DIVISION y PROCEDURE DIVISION: dónde se usan los niveles y el punto que se explican aquí.
Fuentes
Comprobado en noviembre de 2026 en IBM Enterprise COBOL for z/OS 6.5, Language Reference:
- COBOL words with single-byte characters y User-defined words: caracteres, longitud de 30 bytes, guion, guion bajo, minúsculas y niveles válidos.
- Characters: juego de caracteres básico.
- Reserved words: 402 palabras marcadas como reservadas y 61 como posibles reservadas (recuento propio sobre la tabla).
- Numeric literals, Basic alphanumeric literals y la opción ARITH (por defecto,
ARITH(COMPAT)). - Figurative constants.
- Level-numbers.
- Rules for separators y Sentences, statements, and entries: uso del punto.
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).