1.11. Formát zdrojového programu na zdrojových řádcích Tento překladač umí zpracovávat dva rozdílné formáty zdrojových řádků; klasický "štítkový formát", vhodný v případě, že zdrojový cobolský program byl vyděrován do 80-sloupcových děrných štítků (anebo je zapsán na jiném médiu, ovšem logická věta má délku 80 bytů a klasickou strukturu), a nový "terminálový formát", vhodný v případě, že je zdrojový cobolský program psán na terminálu pomocí vhodného editoru. Ve štítkovém formátu mívá většinou každý zdrojový řádek přesně 80 bytů a je rozdělen na tato pole: A) Pořadové číslo (sloupce 1-6) Sloupce 1-6 mohou obsahovat libovolné znaky, z hlediska překladu se zcela ignorují. Pro odkazy v protokolech o překladu se nepoužívají tato uživatelova pořadová čísla, nýbrž pořadová čísla zdrojových řádků dosazená překladačem. B) Indikační sloupec (sloupec 7) Pro obsazení 7.sloupce jsou tyto možnosti: a) Mezera (nevyděrovaný sloupec) označuje normální zdrojový řádek zdrojového programu, který se normálně překládá. b) Pomlčka (-) označuje pokračovací řádek pro alfanumerický literál (viz 1.3.2.). Žádné jiné programátorské ani rezervované slovo (s výjimkou libovolného řetězce, kde se ovšem pomlčka nepíše) nesmí být v MX COBOLu rozděleno. c) Hvězdička (*) označuje poznámkový řádek, který bude pouze otisknut v protokolu o zdrojovém programu, ale z hlediska překladu se zcela ignoruje. d) Písmeno I a rovněž tak lomítko (/) označuje opět poznámkový řádek jako hvězdička, s tím jediným rozdílem, že se před tiskem tohoto řádku přejde na novou stránku protokolu o zdrojovém programu. Poznámka: Poznámkové řádky (* nebo I nebo /) mohou být jakkoliv vloženy mezi ostatní řádky zdrojového programu. e) Písmeno D a rovněž tak procento (%) znamená řádek, který bude při uvedení parametru CBL DEBUG překládán stejně jako kdyby šlo o normální řádek s mezerou v indikačním sloupci. Začíná-li však na takovémto řádku nějaký příkaz, vygeneruje před něj překladač test a přeskok. Při výpočtu pak bude tento příkaz prováděn pouze při tzv. "testovacím režimu", který je charakterizován tím, že je pro výpočet (spuštění cílového programu) zadán flag -D. Nebude-li tento flag -D zadán, nebude takový příkaz prováděn, nýbrž bude přeskočen. Při uvedení parametru CBL NODEBUG budou řádky s písmenem D nebo procentem % v indikačním sloupci zpracovány jako poznámkové (stejně jako při * v indikačním sloupci). Poznámka: Řádky s písmenem D nebo procentem % v indikačním sloupci (tzv. D-řádky) umožňují uživateli nechat i v odladěném programu vhodné ladicí prostředky. Uživatel vloží do zdrojového programu na vhodná místa D-řádky s vhodnými příkazy (a případně i popisy), které by mu mohly pomoci při hledání chyby vyskytnuvší se při výpočtu. Pak jsou tyto možnosti: 1) Uživatel přeloží zdrojový program s parametrem CBL DEBUG. V tom případě se D-řádky překládají, přičemž se před každý z příkazů začínajících na některém D-řádku vygeneruje výše popsaný test a přeskočení celého příkazu. - Za normálních okolností (při běžném rutinním výpočtu) uživatel nezadá "testovací režim", takže se ladicí příkazy začínající na D-řádcích přeskakují, aniž by se prováděly. - Měl-li výpočet nesprávný průběh nebo výsledek, provede uživatel výpočet ještě jednou v "testovacím režimu". Všechny příkazy začínající na D-řádcích se pak budou normálně provádět; záleží pak jen na tom, zda je uživatel připravil tak, aby mu poskytly informace potřebné pro odhalení chyby. Podstatnou výhodou je, že "testovací režim" lze navodit bez vkládání ladicích řádků do zdrojového programu, nového překladu a spojování. 2) Uživatel přeloží zdrojový program s parametrem CBL NODEBUG, takže D-řádky se zpracují pouze jako poznámky. Má to smysl tehdy, chce-li vytvořit krátkou a rychlou verzi přeloženého programu, přičemž však nechce D-řádky vyřazovat ze zdrojového programu, nýbrž chce je tam ponechat pro případné pozdější použití. Takto přeložený program již samozřejmě nemá smysl provádět v "testovacím režimu". 3) Není-li zadán ani parametr CBL DEBUG, ani parametr CBL NODEBUG, bude při nalezení písmene D nebo procenta % v indikačním sloupci ohlášena chyba stejně jako při kterémkoliv jiném nepřípustném znaku. f) Při jakémkoliv jiném znaku bude ohlášena chyba a řádek se dále zpracovává, jako kdyby v indikačním sloupci byla mezera. C) Vlastní zdrojový program (sloupce 8-72) Sloupce 8-72 se používají pro zápis záhlaví, klauzulí a příkazů zdrojového programu. Rozdělují se do dvou skupin, tzv. "polí" (nebo též "oblastí" resp. "pozic"): pole A ... sloupce 8-11 pole B ... sloupce 12-72 a) V poli A musí začínat svým prvním znakem všechna záhlaví oddílů, sekcí a paragrafů, záhlaví DECLARATIVES a slovo END v záhlaví END DECLARATIVES. b) V poli B musí ležet všemi svými znaky (tj. celé) všechny libovolné řetězce. c) Všechno ostatní (klauzule v paragrafech SPECIAL-NAMES a I-O-CONTROL, klauzule SELECT, FD, SD, CD, RD a USE, popisy položek a podmínkových jmen, všechny příkazy v PROCEDURE DIVISION atd.) smí ležet jak v poli A, tak i v poli B. Poznámka: Každé slovo kteréhokoliv příkazu (kromě libovolného řetězce v příkazu NOTE) smí začínat již v poli A, a to i v případě jednoslovního příkazu zakončeného tečkou (tzn. "GOBACK." začínající v poli A je příkaz GOBACK a nikoliv paragraf GOBACK). Poznámka: Klauzule, popis nebo příkaz mohou začínat na jednom řádku a pokračovat na jednom případně i na několika následujících řádcích podle potřeby; přitom v indikačním sloupci těchto řádků se pomlčka nepíše. Na tomto řádku, na němž tato klauzule, popis resp. příkaz končí, může následovat další klauzule, popis nebo příkaz. Příklad: Následující zápisy jsou přípustné, i když velmi nepřehledné a proto nevhodné (rozumný programátor píše každý popis a každý příkaz na zvláštní řádek): 01 ALFA. 02 BETA OCCURS 100. 03 GAMA OCCURS 50. 04 DELTA PIC X(10). 04 EPSILON PIC S999V99 COMP-3. 01 OMEGA PIC X(1000). SLON. MOVE KOZA TO KOZEL. IF SLEPICE = 0 ADD KRAVA TO TRAVA GO TO KUN. SUBTRACT PRASE FROM KROCAN. Poznámka: Je-li na některém zdrojovém řádku nalezen v poli A nebo B ampersand & (s výjimkou vnitřků alfanumerických literálů a libovolných řetězců), bude celý zbytek tohoto řádku počínaje tímto znakem & považován pouze za poznámku. Tato možnost je velmi výhodná především pro zápis poznámek v DATA DIVISION (v pravé části řádků s popisy položek), dále též místo příkazu NOTE v PROCEDURE DIVISION. D) Poznámkové pole (sloupce 73-80) Sloupce 73-80 mohou mít libovolný obsah; z hlediska překladu se zcela ignorují. Bývá zvykem buďto je nechávat prázdné nebo do nich do všech vyděrovat týž obsah sloužící k identifikaci programu nebo je používat k číslování zdrojového programu (nezávisle na sloupcích 1-6) anebo do nich zapisovat poznámky k jednotlivým zdrojovým řádkům. Varování: Zapíše-li programátor omylem zdrojový program tak, že text zasáhne až do sloupců 73-80, budou přesahující znaky z hlediska překladu ignorovány, přičemž překladač neohlásí žádné upozornění. Poznámka: Bývá zvykem zapisovat zdrojový program před vyděrováním do speciálních formulářů, které jsou tak jako štítky rozděleny do 80 sloupců, přičemž jednomu řádku formuláře odpovídá jeden děrný štítek. Významné sloupce a pole štítku jsou na formuláři vyznačeny svislými čarami: 1 6 7 8 12 72 73 80 ------------------------------------------------------------ |001530| |01 A|LFA. | | | |001540| | 02 |BETA PIC 9(5). | | | | . | | | . | | | | . | | | . | | | | . | | | . | | | |002870| |N. |OPEN OUTPUT PLATY. | | | |002880| | |MOVE 15 TO BETA. | | | | | | | | | | ------------------------------------------------------------ pořad. | pole pole poznámkové číslo | A B pole | - indikační sloupec Poznámka: I při štítkovém formátu může mít zdrojový řádek jinou délku než 80 bytů. Je-li delší než 72 bytů, počítají se do poznámkového pole (a tedy ignorují) všechny byty zdrojového řádku od 73.sloupce včetně až do konce řádku. Má-li zdrojový řádek nejvýše 72 bytů, bude pole B (při délce nejvýše 11 bytů pole A) sahat až do konce zdrojového řádku. Při délce nejvýše 6 bytů se zdrojový řádek považuje za poznámkový. Při terminálovém formátu může mít každý zdrojový řádek libovolnou délku. Neobsahuje "pořadové číslo" ani "poznámkové pole", pole A zaujímá pouze první sloupec řádku a pole B sahá od druhého do posledního sloupce řádku. (Všechna záhlaví oddílů, sekcí, paragrafů, DECLARATIVES a END DECLARATIVES začínáme tedy od prvního sloupce, libovolné řetězce píšeme alespoň od druhého sloupce a vše ostatní píšeme kdekoliv, od začátku řádku nebo s jakýmkoliv odsazením.) Indikačním sloupcem je při terminálovém formátu první sloupec (tedy týž, jenž tvoří pole A). Je-li v prvním sloupci zdrojového řádku některý ze znaků -, *, / nebo %, má stejný význam jako při štítkovém formátu (viz výše); jinak se předpokládá, že se jedná o znak patřící k záhlaví, popisu nebo příkazu. (Oproti štítkovému formátu tedy nejsou možnosti I a D, které by znamenaly dvojznačnost; je třeba používat náhradní znaky / a %. Uživatel nesmí zapsat do prvního sloupce operátor nebo znaménko -, * nebo /; musí je umístit alespoň do druhého sloupce.) Poznámka: Při terminálovém formátu může zdrojový program obsahovat libovolné množství znaků "tabelátor", přičemž není třeba definovat, kolika mezerám má tabelátor odpovídat (pro účely testování, zda délka zdrojového řádku nepřesáhla nejvýše přípustných 255 bytů, se tabelátor považuje za jeden znak). Při štítkovém formátu je tabelátor přípustný pouze tehdy, pokud uživatel ještě před prvním tabelátorem ve zdrojovém programu uvede parametr CBL TABELn (kde n je cifra 1 až 9), jímž zadá, že tabelátor má znamenat právě n mezer. Toto číslo n se pak uvažuje při určování polohy indikačního sloupce, polí A a B a poznámkového pole na zdrojovém řádku. Poznámka: Zadá-li uživatel parametr CBL BEG, bude překladač předpokládat, že zdrojový program je zapsán v terminálovém formátu. Zadá-li uživatel parametr CBL TABELn, bude překladač předpokládat, že zdrojový program je zapsán ve štítkovém formátu. (Zadá-li oba, platí pozdější z nich.) Nezadá-li uživatel ani CBL BEG ani CBL TABELn, snaží se překladač z prvního zdrojového řádku rozpoznat, v kterém z obou formátů je zdrojový program zapsán. Leží-li první nemezerový znak v nejvýše 6.sloupci prvního zdrojového řádku a není-li to číslice (anebo má-li první řádek nejvýše 5 bytů), předpokládá se terminálový formát, jinak (tj. leží-li v alespoň 7.sloupci nebo je-li to číslice), předpokládá se štítkový formát. Poznámka: Formát zdrojového programu zadaný parametrem CBL nebo odhadnutý překladačem dle prvních 6 bytů prvního zdrojového řádku platí pro překlad celého tohoto zdrojového programu včetně všech zařazovaných COPY-textů. Má-li být určitý COPY-text zařazován při štítkovém i při terminálovém formátu, nemůže obsahovat žádná záhlaví, rozdělené alfanumerické literály ani D-řádky a jeho poznámkové řádky musí mít * resp. / jak v 1., tak i v 7.sloupci, a vlastní text musí začínat až od 8.sloupce na každém řádku (což vše lze snadno zajistit, pokud COPY-text obsahuje pouze popisy a klauzule z DATA DIVISION). 1.12. Struktura zdrojového programu Zdrojový program se dělí na tyto čtyři oddíly (DIVISION): 1) IDENTIFICATION DIVISION (oddíl identifikací), obsahující jméno programu a řadu poznámek sloužících pro dokumentaci. 2) ENVIRONMENT DIVISION (oddíl zařízení), obsahující dokumentační informace o počítači, přiřazení speciálních jmen, deklarace souborů a některé požadavky na speciální techniky přenosu dat. 3) DATA DIVISION (oddíl dat), obsahující popisy deklarovaných souborů a k nim patřících logických vět, popisy pracovních položek, popisy položek, jimž je skutečný úsek paměti přidělován dynamicky v průběhu výpočtu (většinou se využívají při spojování programů), popisy komunikačních oblastí a položek využívaných při telekomunikaci a popisy sestav a skupin sestavy pro Generátor sestav. 4) PROCEDURE DIVISION (oddíl procedur), obsahující algoritmus řešeného problému zapsaný pomocí příkazů. Oddíl IDENTIFICATION DIVISION musí být ve zdrojovém programu povinně obsažen (a kromě záhlaví oddílu musí obsahovat alespoň ještě paragraf PROGRAM-ID). Oddíly ENVIRONMENT DIVISION a DATA DIVISION jsou nepovinné; nepotřebujeme-li v nich žádné klauzule a popisy, můžeme vynechat i jejich záhlaví. Záhlaví PROCEDURE DIVISION je povinné i v případě, že program neobsahuje žádné příkazy. Oddíly zdrojového programu musí být zapsány ve výše uvedeném pořadí. Každý oddíl začíná záhlavím, které je tvořeno vždy jménem oddílu, za nímž buďto následuje tečka anebo slovo DIVISION následované tečkou (s výjimkou záhlaví "PROCEDURE DIVISION USING ...", viz 11.7.). Jednotlivé oddíly se dále člení do sekcí a do paragrafů. Každá sekce začíná záhlavím, které je tvořeno vždy jménem sekce, za nímž buďto následuje tečka anebo slovo SECTION následované tečkou. Slova DIVISION v záhlavích oddílů a slova SECTION v záhlaví sekcí v prvních třech oddílech jsou nepovinná a mohou být vynechána. Není však přípustné vynechat slovo SECTION v záhlavích sekcí v PROCEDURE DIVISION (neboť překladač by jinak nemohl rozlišit mezi sekcí a paragrafem). Každý paragraf začíná záhlavím, které je tvořeno vždy jménem paragrafu následovaným tečkou. Na zbytku řádku za kterýmkoliv záhlavím mohou být zapsány libovolné klauzule resp. příkazy a budou normálně přeloženy. Kvůli kompatibilitě je však vhodné zbytky řádků za záhlavími oddílů a sekcí nechat volné (s výjimkou klauzulí USE v deklarativní části PROCEDURE DIVISION a pseudopříkazů COPY), zatímco zbytky řádků za záhlavími paragrafů lze bez jakéhokoliv omezení používat pro zápis klauzulí resp. příkazů patřících do těchto paragrafů. Jména sekcí a paragrafů, do nichž se člení první tři oddíly, jsou pevně stanovena a jsou uvedena v kapitolách 2, 3 a 4. Členění PROCEDURE DIVISION volí programátor sám dle potřeby v souladu s pravidly uvedenými v odstavci 5.1.