1.4. Jméno položky Programátorské slovo "jméno-položky" označuje posloupnost složenou z 1-30 písmen (velkých i malých), číslic a pomlček (-), která nezačíná ani nekončí pomlčkou a obsahuje alespoň jedno písmeno nebo alespoň jednu pomlčku (tj. není složena pouze z číslic). Jak již bylo řečeno v 1.2., malá písmena se považují za rovnocenná s odpovídajícími velkými písmeny a převádějí se na ně. Příklady: správně: nesprávně: PRAHA STROM1/2 12345A -HROM TOTO-JMENO-MA-JEN-TRICET-ZNAKU BROM- A------B 6378 1234-5678 5 1A--2B-34 TOTO-JMENO-MA-VICE-NEZ-30-ZNAKU alfa-A-3 abc_d Podle stejných pravidel jako jméno-položky se vytvářejí následující programátorská slova: speciální-jméno jméno-souboru jméno-třídicího-souboru jméno-speciálního-indexu podmínkové-jméno jméno-sestavy jméno-skupiny Programátorská slova "jméno-paragrafu" a "jméno-sekce" se vytvářejí buďto podle pravidel pro jméno-položky anebo mohou být též složena pouze z číslic v počtu 1 až 30. Programátorské slovo "jméno-procedury" pak zahrnuje společně jméno-paragrafu a jméno-sekce. 1.5. Položka Je-li ve formátu uvedeno programátorské slovo "položka" (případně s bližším určením "numerická-položka" apod.), je třeba na toto místo zapsat jméno-položky opatřené dle potřeby kvalifikací a indexy ve shodě s pravidly uvedenými v odstavcích 4.2. a 4.3. Obecný formát zápisu pro "položku" je: jméno-položky [ {OF|IN} jméno-položky ] ... - - - - | | jméno-souboru | | | {OF|IN} < jméno-třídicího-souboru > | [(index ...)] | | jméno-komunikační-oblasti | | | | jméno-sestavy | | - - - - Podle stejných pravidel se vytváří i zápis odpovídající programátorskému slovu "test-podmínkového-jména". Protože podmínkové jméno nemůže být definováno v REPORT SECTION, formát zde zní: podmínkové-jméno [ {OF|IN} jméno-položky ] ... - - - - | | jméno-souboru | | | {OF|IN} < jméno-třídicího-souboru > | [(index ...)] | | jméno-komunikační-oblasti | | - - - - Dále se podle stejných pravidel vytváří i zápis odpovídající programátorskému slovu "speciální-index". Protože speciální index nemůže být definován v REPORT SECTION a nemůže mít indexy, formát zde zní: jméno-speciálního-indexu [ {OF|IN} jméno-položky ] ... - - - - | | jméno-souboru | | | {OF|IN} < jméno-třídicího-souboru > | | | jméno-komunikační-oblasti | | - - - - Příklady: POCET POCET-KUSU-V-BEDNE MZDY OF STARY DEN OF DATUM IN NAROZENI OF CHLAP ALFA(I) ALFA (I J K) ALFA (I OF J IN K, 100, 5 * L + 3) STARY-STAV OF VYROBEK (3 I OF J 5) A OF B IN C OF D (I OF J K IN L OF M N) 1.6. Figurativní konstanty Na místo programátorského slova "figurativní-konstanta" je třeba zapsat jedno z následujících rezervovaných slov; jsou to vlastně jména, která lze použít místo některých často se vyskytujících anebo obtížně zapisovaných literálů. Tvary v jedněch svorkách mají shodný význam a jsou zaměnitelné. {ZERO | ZEROS | ZEROES} ... nula, nuly (hexadecimálně 30) {SPACE | SPACES} ... mezera, mezery (hexadecimálně 20) {QUOTE | QUOTES} ... apostrof, apostrofy (hexadecimálně 27); ... při CBL QUOTE uvozovka, uvozovky (22) {LOW-VALUE | LOW-VALUES} ... nejnižší hodnota (hex. 00) {HIGH-VALUE | HIGH-VALUES} ... nejvyšší hodnota (hex. FF) Figurativní konstanty smí být používány pouze v těch formátech, které jsou výslovně vyjmenovány v tomto odstavci. V některých z těchto formátů již není explicitně uvedena možnost "figurativní-konstanta"; je pak třeba formátu rozumět tak, že "numerický-literál" a "celé-číslo" zahrnují i možnosti ZERO, ZEROS a ZEROES a že "alfanumerický-literál" a 'znak' zahrnují i úplnou možnost "figurativní-konstanta". Pro použití a význam figurativních konstant platí následující pravidla: 1) Figurativní konstanty ZERO, ZEROS a ZEROES jsou ekvivalentní s celým číslem 0 v těchto případech: a) V klauzuli VALUE u numerické položky, která není numerická editovaná, a dále v klauzuli VALUE u podmínkového jména, jehož podmínková proměnná je numerická položka (včetně numerické editované položky). b) V příkazech MOVE a INITIALIZE a v klauzuli FROM v příkazech WRITE, REWRITE a RELEASE při přesunu do numerické položky (včetně numerické editované položky). c) V relačním testu při srovnávání s numerickou položkou, s numerickým literálem, s aritmetickým výrazem, se speciálním indexem nebo s položkou s USAGE INDEX. d) V aritmetickém výrazu a v tzv. aritmetických příkazech ADD, SUBTRACT, MULTIPLY a DIVIDE. e) V příkazu PERFORM za slovem FROM nebo za slovem BY. f) V příkazu SET. g) V klauzuli VALUE v REPORT SECTION u numerické položky (včetně numerické editované položky). 2) Ostatní figurativní konstanty a také ZERO, ZEROS a ZEROES mimo případy uvedené v bodě 1 jsou vždy chápány alfanumericky a vyskytují se ve dvou rozdílných situacích: a) Figurativní konstanta je použita v souvislosti s nějakou položkou, jak je tomu v klauzuli VALUE (včetně podmínkových jmen a REPORT SECTION), v příkazech MOVE a INITIALIZE, v klauzuli FROM v příkazech WRITE, REWRITE a RELEASE a v relačním testu. Pak má význam alfanumerického literálu, jehož délka je rovna délce příslušné položky a na jehož všech bytech je odpovídající znak, to jest hexadecimální 30, 20, 27 resp. 22, 00, FF. b) Figurativní konstanta je použita samostatně, bez souvislosti s nějakou položkou, jak je tomu v příkazech DISPLAY, EXHIBIT, STOP, TRANSFORM, EXAMINE, INSPECT, START, STRING a UNSTRING. Pak má význam alfanumerického literálu o délce 1 znak, tvořeného odpovídajícím znakem, to jest hexadecimálním 30, 20, 27 resp. 22, 00, FF. (V těchto příkazech je tedy ZERO ekvivalentní s '0', SPACE s ' ', QUOTE s #27# = '''' resp. #22# = """", LOW-VALUE s #00# a HIGH-VALUE s #FF#.) Příklady: 1) Příkaz SUBTRACT A FROM ZERO GIVING B je ekvivalentní s příkazem SUBTRACT A FROM 0 GIVING B. 2) Má-li A PIC X(5000), bude A po provedení příkazu MOVE ZERO TO A obsahovat 5000 znakových nul (tj. 5000-krát hex. 30). 3) Příkaz EXAMINE POCET REPLACING LEADING SPACE BY ZERO je ekvivalentní s EXAMINE POCET REPLACING LEADING ' ' BY '0'. 4) Příkaz DISPLAY QUOTE SPACES 'ABC' SPACE QUOTES ZEROES je ekvivalentní s DISPLAY '''' ' ' 'ABC' ' ' '''' '0' a vytiskne tedy řádek: ' ABC '0. 1.7. ALL-klauzule Programátorské slovo "ALL-klauzule" označuje slovo "ALL" následované alfanumerickým literálem nebo figurativní konstantou. Lze je tedy vyjádřit formátem ALL {alfanumerický-literál | figurativní-konstanta} ALL-klauzuli lze uvést pouze v klauzuli VALUE, v relačním testu, v příkazech MOVE a INITIALIZE a v klauzuli FROM v příkazech WRITE, REWRITE a RELEASE. Vždy je tedy ALL-klauzule použita v souvislosti s nějakou položkou a má (až na určité výjimky vznikající v souvislosti s numerickými položkami, viz 6.1.) význam alfanumerického literálu, jehož délka je rovna délce příslušné položky a který vznikne cyklickým opakováním údaje uvedeného za slovem ALL. Poznámka: Zápis "ALL figurativní-konstanta" je vždy přesně ekvivalentní se zápisem pouze "figurativní-konstanta"; slovo "ALL" se zcela ignoruje. V aritmetickém výrazu, v příkazech ADD, SUBTRACT, MULTIPLY a DIVIDE, v příkazu PERFORM za FROM nebo za BY a v příkazu SET, kde formát nepřipouští ALL-klauzuli, je však zakázáno uvést zápis ALL ZERO ve významu ZERO. Poznámka: Pokud je ALL-klauzule ve formátu přípustná, je ALL '0' ekvivalentní se ZERO (s výjimkou srovnání s numerickým operandem), ALL ' ' ekvivalentní se SPACE, ALL '''' resp. ALL """" ekvivalentní s QUOTE, ALL #00# ekvivalentní s LOW-VALUE a ALL #FF# ekvivalentní s HIGH-VALUE. Příklad: Nechť je 02 A PIC X(7) VALUE ALL '123'. 02 B PIC X(7) JUST VALUE ALL '123'. Pak A má počáteční obsah 1231231 (ukládá se odleva) a B má počáteční obsah 3123123 (ukládá se odprava). Příkaz MOVE ALL ZERO TO A B je ekvivalentní s příkazem MOVE ZERO TO A B a do A i do B uloží obsah 0000000. Příkaz MOVE ALL 'H' TO A B je ekvivalentní s příkazem MOVE 'HHHHHHH' TO A B a do A i B uloží obsah HHHHHHH (oba směry ukládání jsou při jednoznakovém literálu rovnocenné). Příkaz MOVE ALL 'XY' TO A B uloží do A obsah XYXYXYX (ukládá se odleva) a do B obsah YXYXYXY (ukládá se odprava). V relačních testech A = ALL 'KLMN' a B = ALL 'KLMN' se A i B srovnávají s 'KLMNKLM' (neboť fiktivní alfanumerický literál se pro účely srovnávání vytváří vždy odleva). Příklad: Má-li A PIC X(3003), pak příkaz MOVE ALL 'NOC' TO A uloží do položky A tisíc a jednu NOC. Použití: Víceznakový literál se za ALL používá jednak při naplňování tiskových hlaviček (např. MOVE ALL '*** COBOL **' TO HLAVICKA), především však při obcházení zákazu, že indexovaná položka nesmí mít v popisu klauzuli VALUE (viz 4.5.8.). 1.8. Externí jméno Programátorské slovo "externí-jméno" označuje posloupnost nejvýše 30 písmen (velkých i malých) a číslic začínající písmenem; je-li externí jméno uzavřeno v apostrofech resp. uvozovkách, smí mít až 31 znaků a smí navíc obsahovat i podtrhovátka _ (a to i jako první znak). Podle stejných pravidel se vytvářejí i programátorská slova "jméno-programu" (viz kapitolu 2), "jméno-fáze" (viz 11.8. a 11.9.) a "jméno-textu" v pseudopříkazu COPY (viz kapitolu 15) a dále jméno položky, která má ve svém popisu klauzuli ENTRY (viz 4.5.11.) nebo klauzuli EXTRN (viz 4.5.12.). U všech těchto jmen (s výjimkou jmen položek s klauzulí ENTRY nebo EXTRN) se rozlišuje mezi malými a velkými písmeny (malá písmena se nepřevádějí na velká), takže jména ABCD, abcd a Abcd jsou rozdílná. Příklady: a) Správně: A, A1234567, BRNO, A12B34C0, PROG5, ABCDEFGHI, alfa, a3bT0; při ohraničení apostrofy nebo uvozovkami též 'ab_c_1', "Praha_Nove_Mesto", '_josef'. b) Nesprávně: RAZ-DVA, 5ABC, 12345. 1.9. Libovolný řetězec Programátorské slovo "libovolný-řetězec" označuje posloupnost libovolných znaků (je povoleno všech 255 možných bitových kombinací s výjimkou znaku "nový řádek") zakončenou tečkou, za níž musí následovat mezera nebo tabelátor nebo znak & nebo konec pole B zdrojového řádku. V rámci jednoho libovolného řetězce se tedy za tečkami nesmí používat mezery, tabelátory ani & a tečka nesmí stát v posledním sloupce pole B zdrojového řádku, neboť by tím byl libovolný řetězec ukončen. Povoluje-li však formát zapsat několik libovolných řetězců za sebou (jak je tomu všude s výjimkou příkazu NOTE, který není prvním příkazem paragrafu), je možno za kteroukoliv tečkou použít mezeru nebo tabelátor nebo &, čímž začne nový libovolný řetězec. Libovolný řetězec může začínat na jednom řádku a pokračovat na jednom nebo na několika následujících řádcích, přičemž v indikačním sloupci se používá mezera a nikoliv pomlčka. Všechny znaky libovolného řetězce musí ležet v poli B řádku (12.-72. resp. 2. až poslední sloupec), žádný znak nesmí přesáhnout do pole A řádku (8.-11. resp. 1. sloupec). Libovolné řetězce se používají pouze jako dokumentační poznámky pro uživatele samého, z hlediska překladu se vždy zcela ignorují. Příklady: PROGRAM ZPRACOVAVA SOUBOR ZAMESTNANCU. PROF.DR.ING.J.NOVAK, DRSC.S KOLEKTIVEM. PTAME SE: KOLIK UZ BYLO ITERACI?. 17.11.1989. 1.10. Pravidla interpunkce Pravidla uvedená v tomto odstavci se nevztahují na vytváření slov jazyka COBOL, nýbrž určují, jak se smí slova (tzn. rezervovaná slova, jména a literály) a symboly (tzn. závorky, operátory, tečky, čárky a středníky) jazyka COBOL ve zdrojovém programu řadit za sebe a oddělovat. Platí tato základní pravidla: 1) Libovolný řetězec musí být ukončen tečkou, za níž musí následovat mezera nebo tabelátor nebo znak & nebo konec pole B zdrojového řádku. 2) Vzor v klauzuli PICTURE musí být ukončen mezerou nebo tabelátorem nebo znakem & nebo koncem pole B zdrojového řádku, před nímž může ještě stát oddělovač tečka nebo čárka nebo středník. 3) Je nutno použít mezeru nebo tabelátor nebo přechod na nový zdrojový řádek (anebo vložit čárku resp. středník) mezi takovými dvěma slovy resp. symboly, kde by při zápisu bezprostředně za sebou došlo k jejich splynutí do jednoho slova nebo ke dvojznačnosti. Jinak lze libovolná slova a symboly vždy buďto oddělit jednou nebo několika mezerami nebo tabelátory nebo přechody na nový řádek (anebo čárkou resp. středníkem) anebo zapsat bezprostředně za sebou bez oddělení. Přesné vymezení pojmu "dvojznačnost" v pravidle 3 by ovšem bylo značně složité a nepřehledné a proto je vhodné řídit se následující tabulkou 1, jež zjednodušeně ukazuje, která slova a symboly je povoleno (A) resp. zakázáno (N) zapsat ve zdrojovém programu bezprostředně za sebou bez mezery resp. jiného oddělovače. "Jméno" zde označuje jméno-položky a všechna slova vytvořená podle stejných pravidel (1.4.) včetně rezervovaných slov. Tabulka 1: Pravidla interpunkce. ------------------------------------------------------------ |. druhý| | | | + * / ** | | | . | jméno |alf.literál | - | < = > ( ) | . | | . |num.literál | | | , ; mezera | | |první . | | | | tabelátor &| | |-----------|------------|------------|---|------------|---| | jméno | N1 | A | N2| A | A | |num.literál| | | | | | |-----------|------------|------------|---|------------|---| |alf.literál| A | N3 | A | A | A | |-----------|------------|------------|---|------------|---| | + - | A2 | A | A | A | A | |-----------|------------|------------|---|------------|---| |* / ** ( ) | A3 | A | A | A4 | A | |< = > , ; | | | | | | |-----------|------------|------------|---|------------|---| | . | A5 | A | A | A | A | |-----------|------------|------------|---|------------|---| | mezera | A | A | A | A | A5| | tabelátor | | | | | | ------------------------------------------------------------ A2-A5 znamená, že bezprostřední následování je téměř vždy přípustné, existují však výjimky: A2 ... Kdyby na místě, kde je přípustný i numerický literál se znaménkem (např. na začátku aritmetického výrazu), následoval bezprostředně za operátorem + nebo - numerický literál bez znaménka, považoval by se znak + resp. - za znaménko numerického literálu, což by však neovlivnilo hodnotu aritmetického výrazu. Za operandem resp. pravou závorkou v aritmetickém výrazu a v indexech však numerický literál se znaménkem přípustný není, takže lze psát A+2, A(I)-2, A(I+1) atd. A3 ... Je-li uvedena klauzule DECIMAL-POINT IS COMMA, nesmí za čárkou použitou jako oddělovač za numerickým literálem bez desetinné čárky bezprostředně následovat cifra ani písmeno E resp. e, takže 1, 2 resp. 1, E5 nelze srazit na 1,2 resp. 1,E5, neboť čárka by se považovala za desetinnou čárku (čárka mezi indexy se však vždy považuje za oddělovač a nikoliv za desetinnou čárku, neboť necelé číslo nemůže být indexem). A4 ... Kdyby za operátorem * bezprostředně následoval další operátor * nebo ** (přichází teoreticky v úvahu v příkazech COPY a REPLACE, např. při sražení zápisu COPY T REPLACING / BY * * BY /.), byly by první dvě po sobě následující * považovány za operátor umocňování **. A5 ... Není-li uvedena klauzule DECIMAL-POINT IS COMMA, nesmí za tečkou použitou jako oddělovač (za čímkoliv s výjimkou záhlaví, jména programu a numerického literálu s desetinnou tečkou) bezprostředně následovat cifra (např. "02 A PIC 9V99 VALUE 1. 02 B PIC X" nelze srazit na "... 1.02 ... "). Jinak za tečkou mezera ani jiný oddělovač být nemusí! N1-N3 znamená, že bezprostřední následování není většinou přípustné (a nedoporučuje se), existují však výjimky: N1 ... Doporučuje se vždy vložit mezeru nebo jiný oddělovač; existují však i případy, kdy je přípustný i zápis bez mezery, neboť nedochází ke dvojznačnosti (např. lze srazit A +5, A -.5, 1.2 A, 1.2 -5 atd., je to však nevhodné). N2 ... Za jménem nebo za numerickým literálem bez desetinné tečky smí bezprostředně následovat operátor - jen tehdy, následuje-li za tímto operátorem - (resp. za posloupností znaků -) jiný znak než písmeno nebo cifra (takže A - B resp. A - 1 lze srazit na A- B nebo A -B resp. A- 1 nebo A -1, nikoliv však na A-B resp. A-1; A - (B+C) lze srazit na A-(B+C)). N3 ... Kdyby bezprostředně za sebou následovaly dva alfanumerické literály ohraničené oba apostrofy nebo oba uvozovkami, vznikl by jediný alfanumerický literál se zdvojeným vnitřním apostrofem resp. uvozovkou (např. DISPLAY 'SLAVA ''HANBA'). Příklady: Závorky, aritmetické operátory a relační operátory nemusí (i když ovšem smí) být předcházeny a následovány mezerou. Lze tedy psát A=B i A = B, A<5 i A < 5, A*2 i A * 2, A+B i A + B, A+1 i A + 1, A(K) i A ( K ), A(M,N)-2 i A (M , N ) - 2, (-A)**5 i ( - A ) ** 5 atd. Nelze však A - B srazit na A-B ani A - 1 srazit na A-1 (viz N2). Aritmetický operátor + nebo - smí být bezprostředně následován libovolným operandem (výjimka A2 nemá žádný praktický význam). Jsou-li ABC, 12A, 1-A a 1-2 jména položek, lze psát -ABC, -12A, -1-A, -1-2, ABC-+.5, 1-A+1-2. Následující zápisy jsou přípustné: DATE-WRITTEN.11.12.1985. PIC***9.99. MOVE 1 TO A,B,C,D(I);ADD 1 TO E,F,G.COMPUTE H=I+J. MOVE 1 TO A , B , C , D ( I ) ; GOBACK. COPY TEXT REPLACING*BY//BY*+BY-. CALL'PODPROG'USING-.2'A'TALLY(C)B,2. IF A>B AND(D)GO Q1. Poznámka: Protože výše uvedená pravidla jsou značně složitá, doporučujeme řídit se v praxi těmito jednoduchými pravidly: a) Okolo alfanumerických literálů, závorek, operátorů +, *, /, **, <, =, >, čárek a středníků lze mezeru nebo jiný oddělovač použít anebo nepoužít dle libosti. b) Za tečkami, okolo operátorů - (alespoň na jedné straně) a mezi dvěma rezervovanými slovy, jmény nebo numerickými literály použít alespoň jednu mezeru nebo jiný oddělovač. Poznámka: Stojí-li poslední znak kteréhokoliv slova nebo symbolu v posledním sloupci pole B zdrojového řádku (při štítkovém formátu: v 72.sloupci, při terminálovém formátu: v posledním sloupci), zpracovává se tak, jako kdyby za ním byla ještě mezera. (Překladač vlastně do následujícího sloupce vnutí znak & a počítá jej ještě k textu - samozřejmě s výjimkou alfanumerického literálu s pokračováním.) Použití oddělovačů: Nejdůležitějším oddělovačem v jazyce COBOL je mezera. Místo jedné mezery použité jako oddělovač (tj. mimo alfanumerický literál) lze vždy vynechat libovolný počet mezer, třeba i několik řádků. Oddělovač tabelátor je použitelný při terminálovém formátu bez omezení, při štítkovém formátu pouze po zadání parametru CBL TABELn. Má stejný význam jako mezera. Přechod na nový zdrojový řádek lze rovněž považovat za oddělovač ekvivalentní s mezerou. Dalším důležitým oddělovačem je tečka. Lze před ní vynechat libovolný počet mezer nebo tabelátorů nebo dokonce přejít na nový řádek, není to však obvyklé. Bývá zvykem za tečkou vynechat mezeru nebo přejít na nový zdrojový řádek, i když je to povinné jen zcela výjimečně (viz A5). Tečka se používá jako povinné ukončení záhlaví oddílů, sekcí a paragrafů, záhlaví DECLARATIVES a END DECLARATIVES, klauzulí SELECT, FD, SD, RD a USE, popisů položek, podmínkových jmen a skupin sestavy, vět v PROCEDURE DIVISION, příkazů COPY a REPLACE atd. Dalšími oddělovači jsou čárka a středník, které však nemají žádný syntaktický význam a slouží pouze pro zvýšení přehlednosti zdrojového programu pro uživatele. Čárka resp. středník mohou být zapsány bezprostředně za předcházejícím slovem nebo po jedné nebo více mezerách nebo jiných oddělovačích. Za čárkou resp. středníkem může ale nemusí být vynechána mezera nebo více mezer nebo jiných oddělovačů. Čárka resp. středník má vždy přesně stejný význam jako mezera. Oddělování jednotlivých operandů v seznamu čárkami je přípustné, nikoliv však povinné. Ve formátech se přípustné čárky a středníky samozřejmě neuvádějí. Doporučení: Chce-li programátor maximálně zrychlit překlad, neměl by používat jako oddělovače čárky a středníky, slova a symboly by měl oddělovat jedinou mezerou (případně zapisovat bezprostředně za sebe bez mezery, je-li to možné) a každý příkaz nepatřící do rozsahu jiného příkazu (tj. mimo IF, ON, WHEN, AT END, INVALID KEY atd.) by měl zakončit tečkou.