Literal adalah nilai konstanta yang ditulis langsung di dalam kode, sedangkan konstanta figuratif (figurative constant) adalah kata baku yang mewakili satu deretan nilai khusus tanpa menulis nilainya satu per satu. Topik ini membahas literal nonnumerik dan numerik beserta aturan penulisannya, lalu memperkenalkan konstanta figuratif SPACE, ZERO, LOW-VALUE, dan HIGH-VALUE melalui program nyata yang dikompilasi dan dieksekusi. Setelah topik ini dibaca, aturan penulisan literal beserta makna konstanta figuratif SPACE, ZERO, LOW-VALUE, dan HIGH-VALUE dapat dipakai dengan tepat.
Literal nonnumerik#
Literal nonnumerik (nonnumeric literal) adalah deretan karakter yang diapit tanda kutip, misalnya "Piket Senin", dan selalu diperlakukan sebagai teks tanpa makna hitung. Panjangnya minimal satu karakter, spasi di dalam kutip termasuk isi, dan huruf besar-kecil dipertahankan apa adanya. Apabila kutip ganda perlu muncul di dalam literal, kutip tersebut ditulis dua kali berturut-turut agar tidak dibaca sebagai penutup literal.
DISPLAY "Jadwal ""piket"" Senin".
DISPLAY 'Kata kunci: "piket"'.Kedua baris pada contoh menampilkan kutip ganda sebagai bagian dari teks. Literal juga boleh diapit kutip tunggal, dan apabila pembukanya kutip tunggal maka penutupnya harus kutip tunggal juga, sehingga kutip ganda dapat muncul bebas di dalamnya. Kedua bentuk itu setara, dan aturan satu-satunya adalah pembuka serta penutup harus sejenis. Keluaran nyata kedua baris tersebut adalah Jadwal "piket" Senin dan Kata kunci: "piket".
Literal numerik#
Literal numerik (numeric literal) adalah deretan digit yang menyatakan nilai hitung, misalnya 48 atau 123.45. Aturannya tegas, yaitu minimal satu digit, maksimal satu titik desimal, tanda minus atau plus hanya boleh di depan, dan tidak ada pemisah ribuan seperti koma. Dialek klasik membatasi literal numerik pada 18 digit, sedangkan GnuCOBOL menerima literal yang jauh lebih panjang untuk kebutuhan penyimpanan presisi tinggi. Titik desimal pada literal menunjukkan posisi yang berpadanan dengan V ketika nilai dipindahkan ke field, tetapi penulisannya sendiri tetap memakai titik biasa.
Literal numerik memiliki satu jebakan yang berkaitan dengan titik. Titik adalah penutup kalimat, sehingga MOVE 10. TO JUMLAH terbaca sebagai kalimat MOVE 10, sedangkan sisa TO JUMLAH tidak membentuk pernyataan yang sah, dan kompilasi pun gagal. Penulisan yang benar adalah MOVE 10 TO JUMLAH tanpa titik pada bilangannya, karena format akhir justru ditentukan field tujuannya.
Konstanta figuratif#
Konstanta figuratif adalah kata baku yang mewakili satu karakter atau deretan karakter khusus, dan setiap bentuk tunggalnya setara dengan bentuk jamaknya. SPACE setara dengan SPACES, ZERO setara dengan ZEROS, begitu pula LOW-VALUE dengan LOW-VALUES serta HIGH-VALUE dengan HIGH-VALUES. Bentuk tunggal lazim dipakai saat konstanta berdiri sebagai satu nilai pembanding, sedangkan bentuk jamak lazim muncul saat konstanta mengisi seluruh field.
| Konstanta | Nilai yang diwakili | Pemakaian lazim |
|---|---|---|
SPACE, SPACES | spasi pada semua posisi | pengosongan field teks |
ZERO, ZEROS | angka nol pada semua posisi | inisialisasi field numerik |
LOW-VALUE, LOW-VALUES | byte terendah X"00" yang berulang | inisialisasi kunci terkecil dan pembanding bawah |
HIGH-VALUE, HIGH-VALUES | byte tertinggi X"FF" yang berulang | sentinel batas atas dan pembanding atas |
Nilai LOW-VALUE dan HIGH-VALUE mengikuti urutan kolasi (collating sequence) biner, yaitu urutan berdasarkan nilai byte. Pada urutan itu, X"00" lebih kecil daripada karakter apa pun, sedangkan X"FF" lebih besar daripada karakter apa pun, sehingga field yang diisi LOW-VALUES pasti mendahului kunci nyata pertama dan field yang diisi HIGH-VALUES pasti mengikuti kunci nyata terakhir. SPACE dan ZERO tetap berupa karakter biasa yang dapat ditampilkan, sedangkan LOW-VALUE dan HIGH-VALUE bukan karakter yang dapat ditampilkan.
Program demo MOVE dan perbandingan#
Program berikut mengisi field dengan literal dan konstanta figuratif, menampilkan isinya, lalu memanfaatkan urutan biner pada dua perbandingan.
IDENTIFICATION DIVISION.
PROGRAM-ID. LITERAL-DEMO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 NAMA-KELOMPOK PIC X(12) VALUE SPACES.
01 JUMLAH-UNIT PIC 9(4) VALUE ZERO.
01 TARIF-UNIT PIC 9(5)V99 VALUE 123.45.
01 KUNCI-AWAL PIC X(8).
01 KUNCI-BATAS PIC X(8).
PROCEDURE DIVISION.
MOVE "Piket Senin" TO NAMA-KELOMPOK
DISPLAY "Kelompok piket: " NAMA-KELOMPOK
MOVE 48 TO JUMLAH-UNIT
DISPLAY "Jumlah unit: " JUMLAH-UNIT
DISPLAY "Tarif per unit: " TARIF-UNIT
MOVE ZERO TO JUMLAH-UNIT
DISPLAY "Unit setelah MOVE ZERO: " JUMLAH-UNIT
MOVE LOW-VALUES TO KUNCI-AWAL
MOVE HIGH-VALUES TO KUNCI-BATAS
IF KUNCI-AWAL < "M"
DISPLAY "Kunci kosong mendahului huruf M"
END-IF
IF "PIKET-A" < KUNCI-BATAS
DISPLAY "Kunci nyata mendahului kunci batas"
END-IF
STOP RUN.Kelompok piket: Piket Senin
Jumlah unit: 0048
Tarif per unit: 00123.45
Unit setelah MOVE ZERO: 0000
Kunci kosong mendahului huruf M
Kunci nyata mendahului kunci batasSetiap baris keluaran menunjukkan satu perilaku penting. Field NAMA-KELOMPOK berukuran X(12) menerima literal sepanjang 11 karakter, sehingga posisi terakhir field berisi spasi. Jumlah unit tampil sebagai 0048 karena field numerik empat digit selalu menampilkan panjang penuhnya, termasuk nol depan. Tarif per unit tampil sebagai 00123.45 karena field PIC 9(5)V99 menyimpan tujuh digit dengan dua digit terakhir sebagai desimal tersirat, dan penampil GnuCOBOL menyisipkan titik pada posisi V tersebut. MOVE ZERO mengembalikan nilai JUMLAH-UNIT ke 0000, dan kedua perbandingan bernilai benar sesuai urutan biner, sehingga dua baris terakhir tampil. Kompilasikan berkas ini dari direktorinya.
# kompilasi dan tautkan program demo literal
cobc -x literal-figuratif.cblJalankan ./literal-figuratif, dan keenam baris keluaran di atas akan tampil kembali.
Pemakaian lazim LOW-VALUE dan HIGH-VALUE#
Kedua konstanta ini dirancang untuk pengurutan dan perbandingan, bukan untuk ditampilkan. Pengisian kunci dengan LOW-VALUES sebelum tabel dibangun memberi titik awal terkecil yang pasti mendahului kunci nyata mana pun, sehingga pencarian dapat dimulai dari elemen terawal tanpa risiko mencocokkan data yang tidak nyata. Sebaliknya, HIGH-VALUES menjadi sentinel batas atas, misalnya pada elemen penutup tabel yang harus mengikuti semua kunci nyata. Perbandingan rentang seperti IF KUNCI >= "A" AND KUNCI < KUNCI-BATAS juga bersandar pada urutan biner yang stabil dan tidak bergantung pada susunan alfabet yang sedang berlaku.
Kesalahan umum#
- Literal dibuka dengan kutip ganda tetapi ditutup kutip tunggal, sehingga kompilasi gagal dengan pesan literal yang tidak tertutup. Pastikan pembuka dan penutup sejenis, dan gandakan kutip yang ingin muncul sebagai teks.
- Literal numerik ditulis dengan titik tambahan di akhir seperti pada
MOVE 10. TO JUMLAH, sehingga titik itu menutup kalimat dan sisaTO JUMLAHtidak membentuk pernyataan yang sah. TuliskanMOVE 10 TO JUMLAHtanpa titik pada bilangannya. - Field bernilai LOW-VALUES atau HIGH-VALUES dikirim langsung ke
DISPLAY, sehingga terminal atau berkas log menerima byte yang tak terlihat. Tampilkan field yang berisi karakter biasa, dan simpan kedua konstanta itu untuk inisialisasi serta perbandingan.
Ringkasan#
- Literal nonnumerik diapit kutip sejenis, dan kutip ganda di dalamnya ditulis dua kali berturut-turut.
- Literal numerik terdiri atas digit dengan tanda opsional di depan dan paling banyak satu titik desimal, sedangkan titik penutup kalimat tidak boleh menyatu dengan bilangan.
- SPACE, ZERO, LOW-VALUE, dan HIGH-VALUE memiliki bentuk tunggal dan jamak yang setara.
- LOW-VALUE dan HIGH-VALUE mengikuti urutan biner dan lazim dipakai untuk inisialisasi kunci serta perbandingan, bukan untuk ditampilkan.
Referensi#
- GnuCOBOL — Free Software Foundation — Situs proyek GnuCOBOL 3.2 yang menjadi kompilator seluruh contoh topik ini.
- IBM Enterprise COBOL for z/OS documentation — IBM — Dokumentasi resmi literal dan konstanta figuratif pada COBOL mainframe.