COBOL 구조
본 장에서는 COBOL의 기본 구조와 구성에 대해 설명한다.
1. 문자
COBOL 언어의 가장 기본이 되는 단위는 문자이다. 기본 문자 셋에는 알파벳, 숫자 및 특수문자를 포함한다. 각각의 문자의 조합으로 문자열 및 구분자를 이룬다. 문자열과 구분자는 각각 word(워드), literals(리터럴), phrases, clauses 그리고 sentences를 이룬다. 문자는 영숫자 리터럴 및 주석에서 사용되며 1byte 및 2bytes 문자가 사용된다.
다음은 소스 코드 상의 문자열 및 구분자를 이루는 기본 문자 셋의 목록이다.
문자 | 설명 |
---|---|
공백 |
|
+ |
덧셈 기호 |
- |
뺄셈 기호 또는 하이픈 |
* |
asterisk |
/ |
슬래시 |
= |
등호 기호 |
$ |
통화 기호 |
, |
콤마 |
; |
세미콜론 |
. |
소수점 또는 점 |
"" |
큰따옴표 |
( |
왼쪽 괄호 |
) |
오른쪽 괄호 |
> |
Greater than |
< |
Less than |
: |
콜론 |
'' |
작은따옴표 |
A-Z |
알파벳 (대문자) |
a-z |
알파벳 (소문자) |
0-9 |
숫자 |
2. 문자열
문자열이란, COBOL 워드, 리터럴, PICTURE 문자열 또는 주석을 이루는 한 개의 문자 혹은 일련의 연속된 문자를 말한다. 문자열은 구분자로 구분될 수 있다. 구분자는 문자열을 구분하기 위해 사용하는 연속된 문자열이다.
2.1. COBOL 워드
COBOL 워드는 사용자 정의어, 시스템 이름, 또는 예약어를 이루는 문자열이다.
대부분의 사용자 정의 이름 (section 이름, paragraph 이름 및 레벨 번호 제외)에는 적어도 하나 이상의 영문자가 포함되어야 한다. 우선순위 번호와 레벨 번호 지정은 반드시 고유할 필요는 없다. COBOL 워드에서 사용되는 소문자는 대문자로 인식된다.
특수문자를 제외하고 COBOL 워드는 다음으로 이루어질 수 있다.
-
A - Z
-
a - z
-
0 - 9
-
- (하이픈) : 하이픈은 COBOL 워드의 처음 또는 마지막 문자로 사용할 수 없다.
다음은 LENGTH, RANDOM, SUM을 제외한 모든 COBOL 워드의 규칙이다.
-
예약어의 집합은 사용자 정의어, 시스템명, 함수명의 집합과 겹칠 수 없다.
-
사용자 정의어, 시스템명, 함수명 각각의 집합은 서로 겹칠 수 있다. 즉, 같은 워드를 갖는 사용자 정의어와 시스템명, 함수명 사용이 가능하다. 이 경우에 사용된 워드가 어느 집합에 속했는지는 문맥상 판단된다.
위와 달리 COBOL 워드 LENTGH, RANDOM, SUM에 대해서는 다음 규칙이 적용된다.
-
LENGTH, RANDOM, SUM은 예약어 및 함수명에 포함된다. 예약어 혹은 함수명으로 사용 가능하며 어느 쪽에 속했는지는 문맥을 통해 판단된다.
-
LENGTH, RANDOM, SUM은 사용자 정의어 및 시스템명의 집합과는 다른 집합에 속한다. 따라서 어떤 문맥에서도 COBOL 워드 LENGTH, RANDOM, SUM은 사용자 정의어 혹은 시스템명으로 사용할 수 없다.
함수 이름
COBOL이 기본적으로 제공하는 워드 리스트의 하나로 Intrinsic Functions을 지정한다.
예약어
COBOL 소스 유닛에서 미리 정의, 예약되어 있어 사용자 정의어 혹은 시스템명으로 사용할 수 없는 문자열이다.
예약어는 다음과 같은 종류가 있다.
-
키워드
키워드는 clause, entry 또는 statement를 기술하는 데 반드시 필요로 하는 예약어이다.
-
옵션 워드
entry 또는 statement에서 프로그램을 읽기 편하도록 포함시킬 수 있는 예약어이다. 프로그램의 실행에는 영향을 미치지 않는다.
-
Figurative constants
Figurative constant는 특정 값에 이름을 붙여 사용할 수 있게 한 예약어이다.
Figurative constant 의미 ZERO, ZEROS, ZEROES
문맥에 따라 수치값 0 또는 문자 "0"을 의미한다.
영숫자 지정이 있는 곳에서 ZERO, ZEROS 또는 ZEROES를 사용하는 경우에는 영숫자 0이 사용된다. 문맥상 판별이 어려운 경우에는 영숫자 0이 사용된다.
SPACE, SPACES
하나 이상의 공백을 나타낸다.
SPACE는 영숫자 지정이 있는 있는 경우엔 영숫자 리터럴로 취급하며 2bytes 문자 지정이 있는 경우에는 2bytes 공백으로 다뤄진다.
이 경우 시스템 로케일이 ja_JP.sjis, ja_JP.SJIS, ja_JP일 때 DBCS를 사용하면 2bytes 공백(0x8140)이 default로 동작한다.
HIGH-VALUE, HIGH-VALUES
사용 중인 collating sequence 중 가장 큰 값을 갖는 문자를 의미한다.
HIGH-VALUE가 영숫자가 지정된 곳에서는 영숫자 리터럴로 취급된다. EBCDIC collating sequence에서의 값은 X’FF’이다. 그 외의 영숫자 데이터는 실제로 사용되는 collating sequence에 따라 달라질 수 있다.
문맥상 판별이 어려울 경우에는 영숫자가 지정된 것으로 간주하고 값 X’FF’가 사용된다.
LOW-VALUE, LOW-VALUES
사용 중인 collating sequence 중 가장 작은 값을 갖는 문자를 의미한다.
LOW-VALUE는 영숫자가 지정된 곳에서는 영숫자 리터럴로 취급된다. EBCDIC collating sequence에서의 값은 X'00’이다. 그 외의 영숫자 데이터는 실제로 사용되는 collating sequence에 따라 달라진다.
문맥상 판별이 어려울 경우에는 영숫자가 지정된 것으로 간주하고 값 X'00’이 사용된다.
QUOTE, QUOTES
다음과 같이 사용될 수 있다.
-
큰따옴표 (" ")
QUOTE 또는 QUOTES는 영숫자가 지정된 곳에서는 영숫자 리터럴로 사용된다.
ALL literal
리터럴은 ALL을 제외한 2byte를 포함한 영숫자 리터럴을 지정할 수 있다. Figurative constant가 아닌 경우 ALL 리터럴은 해당 리터럴을 구성하는 문자열이 한번 이상 존재함을 나타낸다.
CALL, INSPECT, INVOKE, STOP 또는 STRING statement에서는 ALL을 사용할 수 없다.
NULL, NULLS
USAGE POINTER, USAGE PROCEDURE-POINTER, USAGE FUNCTION-POINTER 또는 ADDRESS OF 특수 레지스터에 정의된 데이터 항목에 유효한 주소가 없다는 것을 나타내는 값을 지정한다.
-
-
특수문자 워드(Special character words)
특수문자 워드는 다음 2 종류가 있다.
구분 종류 산술 연산자
+, -, /, *, **
비교연산자
<, >, =, <,=, >, =
-
특수 레지스터(Special register)
특수 레지스터는 컴파일러에 의해 생성된 데이터 항목 또는 일시적인 값이다. 특수 레지스터를 참조하기 위해서는 해당 데이터 항목에 대응되는 예약어를 사용한다.
다음은 각 특수 레지스터에 대한 설명과 사용법이다.
-
ADDRESS OF
-
LINKAGE section, LOCAL-STORAGE section 또는 WORKING-STORAGE section에 정의된 데이터 항목의 주소를 참조한다.
-
ADDRESS OF는 암묵적으로 USAGE POINTER로 정의된다.
-
ADDRESS OF는 오퍼랜드에 함수 ID를 지정할 수 없다.
-
-
LENGTH OF
-
LENGTH OF에는 데이터 항목에 의해 사용되는 byte수가 저장된다.
USAGE DISPLAY-1로 기술된 2bytes 데이터 항목에 대해서는 각문자는 2bytes 스토리지를 점유한다.
-
Procedure division 어느 곳이든 LENGTH OF를 사용할 수 있다.
-
LENGTH OF의 인수로 ADDRESS OF를 지정했을 경우 ADDRESS OF의 인수와는 상관없이 해당 코드가 실행되는 환경에서 사용되는 주소 공간 사이즈이다.
-
LENGTH OF는 다음에서 지정할 수 없다.
-
A receiving data item
-
A subscript
-
-
LENGTH OF가 CALL statement의 파라미터로 사용될 경우에는 BY CONTENT 또는 BY VALUE를 지정해야 한다.
-
테이블 아이템을 지정했을 경우 LENGTH OF는 항목 하나의 길이를 갖는다. 테이블 항목을 참조할 때에 항목 이름에 subscript를 지정할 필요는 없다.
-
ID를 지정할 때 참조되는 영역이 프로그램이 사용 가능한 상태가 아니더라도 길이가 판별될 수 있으면 값을 얻을 수 있다.
-
Intrinsic Function LENGTH를 사용하여 데이터 항목의 길이를 얻을 수도 있다.
-
-
RETURN-CODE
-
RETURN-CODE는 현재 COBOL 프로그램이 종료했을 때, 반환 코드를 호출한 프로그램이나 OS에 전달하기 위해 사용된다.
-
COBOL을 종료할 때 프로그램이 실행되고 끝나는 경우 RETURN-CODE에 사용자가 정의한 값을 저장하고 종료한다(사용자가 정의한 종료 코드와 실제 종료 코드와는 차이가 있을 수 있다).
제어가 호출한 프로그램에게로 돌아가는 경우 RETURN-CODE의 값은 호출한 프로그램에게 전달된다. 이 경우 RETURN-CODE 특수 레지스터는 다음과 같이 정의된다.
01 RETURN-CODE GLOBAL PICTURE S9(4) VALUE ZERO.
-
중첩된 프로그램에서 사용되는 경우에는 가장 바깥쪽 프로그램에서 GLOBAL clause가 암묵적으로 정의된다.
-
다음은 RETURN-CODE의 설정방법의 예이다.
MOVE 8 TO RETURN-CODE
-
-
SORT-CONTROL
-
SORT-CONTROL는 영숫자 데이터 항목으로 다음과 같이 정의된다.
01 SORT-CONTROL GLOBAL PICTURE X(8) USAGE DISPLAY.
-
OFCOBOL에서는 문법 체크만 하며 시스템에 영향을 미치지 않는다.
-
-
SORT-CORE-SIZE
-
SORT-CORE-SIZE는 바이너리 데이터 항목으로 다음과 같이 정의된다.
01 SORT-CORE-SIZE GLOBAL PICTURE S9(8) USAGE IS BINARY VALUE ZERO.
-
OFCOBOL에서는 문법 체크만 하며 시스템에 영향을 미치지 않는다.
-
-
SORT-FILE-SIZE
-
SORT-FILE-SIZE는 바이너리 데이터 항목으로 다음과 같이 정의된다.
01 SORT-FILE-SIZE GLOBAL PICTURE S9(8) USAGE IS BINARY VALUE ZERO.
-
OFCOBOL에서는 문법 체크만 하며 시스템에 영향을 미치지 않는다.
-
-
SORT-MESSAGE
-
SORT-MESSAGE는 영숫자 데이터 항목으로 다음과 같이 정의된다.
01 SORT-MESSAGE GLOBAL PICTURE X(8) USAGE IS DISPLAY.
-
OFCOBOL에서는 문법 체크만 하며 시스템에 영향을 미치지 않는다.
-
-
SORT-MODE-SIZE
-
SORT-MODE-SIZE는 바이너리 데이터 항목으로 다음과 같이 정의된다.
01 SORT-MODE-SIZE GLOBAL PICTURE S9(5) USAGE BINARY VALUE ZERO.
-
OFCOBOL에서는 문법 체크만 하며 시스템에 영향을 미치지 않는다.
-
-
SORT-RETURN
-
SORT-RETURN는 바이너리 데이터 항목으로 다음과 같이 정의된다.
01 SORT-RETURN GLOBAL PICTURE S9(4) USAGE BINARY VALUE ZERO.
-
OFCOBOL에서는 문법 체크만 하며 시스템에 영향을 미치지 않는다.
-
-
TALLY
-
TALLY는 바이너리 데이터 항목으로 다음과 같이 정의된다.
01 TALLY GLOBAL PICTURE S9(5) USAGE BINARY VALUE ZERO.
-
OFCOBOL에서는 문법 체크만 하며 시스템에 영향을 미치지 않는다.
-
-
WHEN-COMPILED
-
WHEN-COMPILED는 컴파일을 시작할 때의 시작 시간이 저장하는 레지스터로 다음과 같이 정의되는 영숫자 데이터 항목이다.
01 WHEN-COMPILED GLOBAL PICTURE X(16) USAGE DISPLAY.
-
OFCOBOL에서는 문법 체크만 하며 시스템에 영향을 미치지 않는다.
-
-
XML-CODE
-
XML-CODE는 다음과 같은 목적으로 사용된다.
-
XML PARSE statement에서 식별된 XML 파서와 처리 절차 간의 상태를 통신하기 위해 사용한다.
-
XML GENERATE statement 이 성공적으로 실행되었거나 XML 생성 중에 예외가 발생했음을 나타내기 위해 사용한다.
XML-CODE는 다음과 같이 정의된다.
01 XML-CODE PICTURE S9(9) USAGE BINARY VALUE 0.
-
-
중첩된 프로그램에서 사용할 경우, 이 특수 레지스터는 가장 바깥쪽 프로그램의 global 특성을 사용하여 암시적으로 정의된다. XML 파서가 XML 이벤트를 발견하면, XML-CODE를 설정한 다음 처리 절차에 제어를 전달한다. EXCEPTION 이벤트를 제외한 모든 이벤트의 경우, 처리 절차가 제어를 받을 때 XML-CODE는 0을 포함한다.
다음과 같이 파서로 돌아가기 전에 XML-CODE를 설정할 수 있다.
-
-1은 정상 이벤트 후에 EXCEPTION 이벤트 발생 없이 남은 XML 문서를 처리하지 않고 파서가 즉시 종료됨을 나타낸다.
-
1은 XMLPARSE(XMLSS) 컴파일러 옵션이 적용되는 경우, END-OF-INPUT 이벤트 후에 문서의 다음 세그먼트가 파싱할 준비가 되었음을 나타낸다. 처리 절차에서 반환할 세그먼트가 더 이상 없는 경우 XML-CODE는 0으로 설정해야 한다.
파서로 돌아가기 전에 XML-CODE를 다른 값으로 설정하면 결과가 정의되지 않는다. 파서가 XML PARSE statement로 반환할 때, XML-CODE에는 처리 절차 또는 파서가 가장 최근에 설정한 값이 포함된다. XML GENERATE statement이 종료 될 때, XML-CODE에는 0이 포함되어 XML 생성의 성공 완료를 나타내거나 0이 아닌 값으로 XML 생성 중에 예외가 발생했음을 나타낸다.
-
-
-
XML-EVENT
-
XML-EVENT 특수 레지스터는 XML 파서로부터 XML PARSE statement에서 식별된 이벤트 정보를 처리 절차로 전달한다. 설정된 특정 이벤트 및 관련 특수 레지스터는 XMLPARSE 컴파일러 옵션이 XMLPARSE(XMLSS) 또는 XMLPARSE(COMPAT)인지 설정에 따라 달라진다.
XML-EVENT는 다음과 같이 정의된다.
01 XML-EVENT USAGE DISPLAY PICTURE X(30) VALUE SPACE.
-
OFCOBOL에서는 현재 일부 XMLPARSE(XMLSS) 옵션일 경우에 대해서만 지원하고 있다.
아래 테이블은 XMLPARSE(XMLSS) 옵션으로 파싱할 수 있는 XML 이벤트와 특수 레지스터의 내용을 보여준다. XML-EVENT는 받는 데이터 항목으로 사용할 수 없다.
XML-EVENT 특수 레지스터 내용 ATTRIBUTE-CHARACTERS
XML-TEXT는 인용 부호 또는 작은따옴표(' ') 내의 값을 포함한다.
ATTRIBUTE-NAME
XML-TEXT는 attribute 이름을 포함한다.
COMMENT
XML-TEXT는 시작 문자 순서인 "<!--"와 끝 문자 순서인 "-->" 사이의 주석 내용이 포함된다.
CONTENT-CHARACTERS
XML-TEXT는 시작 태그와 끝 태그 사이의 요소의 문자 내용을 포함한다.
END-OF-DOCUMENT
XML-CODE와 XML-EVENT를 제외한 모든 XML 특수 레지스터가 0의 길이를 가지며 빈 값을 가지게 된다.
END-OF-ELEMENT
XML-TEXT는 끝 요소 태그의 로컬 부분 또는 빈 요소 태그 이름이 포함된다.
EXCEPTION
XML-CODE는 0이 아닌 값을 가지고 있다. XML-TEXT는 예외가 발생한 오류 또는 그 지점까지의 문서 조각이 일부 포함되어 있다. 다른 모든 XML 특수 레지스터는 0의 길이를 가지며 빈 값을 가지게 된다.
START-OF-DOCUMENT
XML-CODE 및 XML-EVENT를 제외한 모든 XML 특수 레지스터가 0의 길이를 가지며 빈 값을 가지게 된다.
START-OF-ELEMENT
XML-TEXT는 시작 요소 태그 이름의 로컬 부분 또는 빈 요소 태그 이름의 로컬 부분이 포함된다.
VERSION-INFORMATION
XML-TEXT는 XML 선언부에 있는 버전 정보로 인용 부호 또는 작은따옴표(' ') 사이의 값이 포함된다.
-
-
XML-TEXT
-
XML-TEXT 특수 레지스터는 XML 파싱 분석 중에 문서 조각을 포함한다. XML-TEXT는 포함된 XML 문서 조각의 길이를 갖고 alphanumeric 데이터 항목이다. 길이는 0부터 XML 문서 전체의 길이까지 다양할 수 있다. 동일한 COBOL 데이터 설명 항목은 없다.
-
XML PARSE statement의 피연산자가 alphanumeric 데이터 항목일 때 파서는 처리 절차로 제어 권한을 전송하기 전에 XML-TEXT에 이벤트와 관련된 문서 조각을 설정한다.
-
XML-TEXT에 포함된 바이트 수를 확인하려면 LENGTH 함수 또는 LENGTH OF 특수 레지스터를 사용한다. XML-TEXT는 수신 항목으로 사용할 수 없다.
-
-
2.2. 리터럴
리터럴은 문자열을 구성하는 문자에 의해 또는 Figurative constant 사용에 따라 그 값이 정해지는 문자열이다.
영숫자 리터럴
다음은 각 리터럴의 사용법에 대한 설명이다.
-
기본 영숫자 리터럴
-
기본 영숫자 리터럴에는 1byte 또는 2bytes의 임의의 문자를 사용할 수 있다.
-
영숫자 리터럴에 포함된 가독가능한 문자는 모두 리터럴 값이다.
-
리터럴을 구분하는 문자로 큰따옴표(" ") 또는 작은따옴표(' ')를 사용할 수 있다. (APOST/QUOTE 컴파일 옵션과는 무관)
기본 사용 포맷은 다음과 같다.
"alphanumeric-characters" 'alphanumeric-characters'
리터럴을 감싸고 있는 큰따옴표나 작은따옴표는 컴파일할 때 제거된다.
리터럴 내에서 큰따옴표나 작은따옴표를 사용하고자 할 경우에는 같은 부호를 쌍으로 기술하여 사용한다.
"THIS ISN""T WRONG" 'THIS ISN''T WRONG'
리터럴의 시작에 사용된 큰따옴표나 작은따옴표는 같은 문자로 맺어야 한다.
'THIS IS RIGHT' "THIS IS WRONG' 'THIS IS WRONG"
-
-
2bytes 문자 리터럴
-
2bytes 문자 리터럴은 다음과 같은 형식으로 사용할 수 있다.
G"<DBCS-characters>" G'<DBCS-characters>'
-
2bytes 문자 리터럴은 다음의 영역에서 사용할 수 있다.
-
Data division
-
2bytes 데이터 항목을 정의하는 VALUE clause
-
FD section에서 VALUE OF clause
-
-
Procedure division
-
비교 로직 중 2bytes 데이터 항목이 있을 경우
-
CALL statement에서 BY CONTENT로 넘겨지는 인수
-
DISPLAY, EVALUATE statement
-
INITIALIZE statement
-
MOVE statement
-
STRING statement
-
UNSTRING statement
-
Figurative constant, "ALL"
-
-
COPY, REPLACE statement 및 TITLE
-
-
-
National 리터럴
-
National 리터럴은 기본 National 리터럴과 National 리터럴의 16진수 표기로 사용한다.
-
기본 National 리터럴은 다음과 같은 형식으로 사용할 수 있다.
N"<character-data>" N'<character-data>' NC"<character-data>" NC'<character-data>'
-
National 리터럴의 16진수표기는 다음과 같은 형식으로 사용할 수 있다.
NX"<hexadecimal-digits>" NX'<hexadecimal-digits>'
-
National 리터럴의 16진수표기는 NSYMBOL 컴파일러 옵션의 영향을 받지 않는다.
-
기본 National 리터럴과 National 리터럴의 16진수 표기는 다음의 영역에서 사용할 수 있다.
-
National class의 data item과 연관된 VALUE clause
-
USAGE NATIONAL로 정의된 conditional variable에 대한 condition-name의 VALUE clause
-
Figurative constant, "ALL"
-
Relation condition
-
SEARCH statement format-2의 WHEN phrase(binary search)
-
INSPECT statement의 ALL, LEADING or FIRST phrase
-
INSPECT statement의 BEFORE or AFTER phrase
-
STRING statement의 DELIMITED BY phrase
-
UNSTRING statement의 DELIMITED BY phrase
-
CALL statement에서 BY CONTENT로 넘겨지는 인수
-
CALL statement에서 BY VALUE로 넘겨지는 인수
-
DISPLAY, EVALUATE statement
-
Procedural statement의 전달 항목
-
INITIALIZE
-
INSPECT
-
MOVE
-
STRING
-
UNSTRING
-
-
Intrinsic function의 argument
-
DISPLAY-OF
-
LENGTH
-
LOWER-CASE
-
MAX
-
MIN
-
ORD-MAX
-
ORD-MIN
-
REVERSE
-
UPPER-CASE
-
-
COPY, REPLACE statement 및 TITLE
-
-
-
영숫자 리터럴의 16진수 표기
-
영숫자 리터럴은 16진수 표기법으로 사용할 수 있다.
다음은 사용 형식이다.
X"hexadecimal-digits" X'hexadecimal-digits'
16진수는 '0’부터 '9', 'a’부터 'f' 및 'A’부터 'F' 범위에 있는 문자이다. 2개의 16진수로 1byte 문자 셋에 속한 하나의 문자를 나타낸다. 4개의 16진수로 2bytes 문자 셋에 속한 문자 하나를 표현할 수 있다. 16진수 표기는 짝수여야 하며 최대 길이는 320bytes이다.
-
여러 라인에 걸쳐서 기술할 때의 규칙은 다른 영숫자 리터럴 규칙과 같다. 단, 리터럴의 시작을 나타내는 문자(X" 또는 X')는 나누어 기술할 수 없다.
-
-
NULL terminated 리터럴
-
영숫자 리터럴은 다음과 같은 형식으로 사용했을 때 null-terminated시킬 수 있다.
Z"mixed-characters" Z'mixed-characters'
-
1byte 문자로만 이루어진 리터럴 또는 2bytes 문자로만 이루어진 리터럴, 1byte 문자와 2bytes 혼합 리터럴 모두 지정할 수 있지만 X'00' 값을 포함한 문자는 지정할 수 없다. X'00’은 Null-terminated시킬 때 자동적으로 추가되는 NULL 문자이다.
-
Intrinsic Function LENGTH가 Null-terminated 리터럴에 적용될 경우에는 Null 문자는 계산에 포함시키지 않는다.
-
숫자 리터럴
숫자 리터럴은 0에서 9까지의 숫자, 부호(+ 또는 -) 및 소수점으로 구성되는 문자열이다. 리터럴이 소수점을 포함하지 않을 경우에는 해당 리터럴은 정수이다.
다음은 숫자 리터럴을 설정하는 데 적용되는 규칙이다.
-
1에서 31자리까지 사용할 수 있다.
-
부호 문자는 하나만 사용할 수 있다. 부호 문자를 붙일 경우에는 리터럴의 제일 왼쪽에 붙인다. 리터럴에 부호 문자가 없을 경우에는 양수로 간주한다.
-
소수점은 하나만 사용할 수 있다.
-
소수점을 넣을 경우에는 리터럴 자릿수를 차지하지 않는다.
-
소수점은 제일 오른쪽을 제외하고 리터럴 내 어느 곳이나 위치할 수 있다.
-
숫자 리터럴의 값은 리터럴 내의 숫자로 구성된 리터럴로 사이즈는 사용자가 지정한 숫자의 자릿수이다. 숫자 리터럴은 고정소수점 및 부동소수점이 있다.
다음은 부동소수점 리터럴의 포맷 및 규칙에 대한 설명이다.
-
가수 및 지수의 부호는 생략가능하다. 부호를 생략하면 컴파일러는 양의 정수로 간주한다.
-
가수는 1에서 16자리의 숫자를 지정할 수 있다. 소수점은 가수에 포함시켜야 한다.
-
지수는 문자 E와 그 뒤에 따르는 옵션 부호 및 1 또는 2자리의 숫자에 의해 표현할 수 있다.
2.3. PICTURE 문자열
PICTURE 문자열은 다음의 규칙에 따라 사용한다.
-
PICTURE 문자열은 통화 기호와 COBOL 문자 셋의 특정 조합으로 구성할 수 있다.
-
PICTURE 문자열의 구성 및 사용법은 Data division의 Data Description, PICTURE clause를 참고한다.
-
PICTURE 문자열 지정에 사용되는 문자는 구독문자로 해석되지 않는다. 이들은 각각 PICTURE 문자열의 규칙을 담는 기호로 해석된다.
2.4. 주석
주석은 컴퓨터 문자 셋 임의의 조합으로 생성된 문자열로 프로그램의 실행에 영향을 주지 않는다. 2bytes 문자는 같은 행에 입력되어야 하고 여러 라인의 주석도 가능하다. 주석에 대해서는 문법 체크는 하지 않는다.
주석은 다음과 같은 2가지 타입이 있다.
-
Comment entry(Identification division)
Identification division comment entry에 관한 내용은 Identification Division 항목에 기술되어 있다.
-
Comment line(any division)
Indicator area(column 7) 영역에 기호 asterisk(*)를 표시함으로써 해당하는 line이 comment line임을 명시한다.
3. 구분자
구분자는 문자열을 구분짓는 하나의 문자 또는 복수의 연속된 문자열을 이다(b는 공백 하나를 의미한다).
문자 | 설명 |
---|---|
b |
공백 |
,b |
콤마 |
.b |
점 |
;b |
세미콜론 |
( |
왼쪽 괄호 |
) |
오른쪽 괄호 |
: |
콜론 |
"b |
큰따옴표 (인용구) |
'b |
작은따옴표 |
X" |
16진수 표현 영숫자 리터럴의 시작 |
X' |
16진수 표현 영숫자 리터럴의 시작 |
Z" |
null-terminated 영숫자 리터럴의 시작 |
Z' |
null-terminated 영숫자 리터럴의 시작 |
G" |
2byte 문자 리터럴의 시작 |
G' |
2byte 문자 리터럴의 시작 |
N" |
National 리터럴의 시작 |
N' |
National 리터럴의 시작 |
NC" |
National 리터럴의 시작 |
NC' |
National 리터럴의 시작 |
NX" |
16진수 표현 National 리터럴의 시작 |
NX' |
16진수 표현 National 리터럴의 시작 |
== |
pseudo-text 구분자 |
구분자 규칙
다음은 각 구분자의 사용 규칙에 대한 설명이다.
설명에서 {} (중괄호)는 구분자를 나타내며, b는 공백을 나타낸다. 공백이 구분자 또는 구분자의 일부로 사용될 수 있는 곳에는 여러 개의 공백을 사용할 수 있다. |
-
공백 {b}
공백은 다음과 같은 경우를 제외하고 임의의 구분자 직전 또는 직후에 나타날 수 있다.
-
pseudo-text 시작을 나타내는 구분자
-
인용 부호로 감싸진 내부로 인용부와 인용부 사이에 있는 공백은 영숫자 리터럴의 일부로 간주되며 구분자로 처리되지 않는다.
-
-
점 {.b}, 콤마 {,b}
-
구분자로 사용되는 콤마(,), 점(.)은 하나의 구분자와 뒤에 오는 공백의 조합으로 사용된다.
-
점는 하나의 statement의 끝을 나타내기 위해 사용되거나 포맷에 지정된 형태로 사용된다.
-
Identification division에서는 각 paragraph의 끝에는 항상 점(.)이 와야 한다.
-
Environment division에서는 SPECIAL-NAMES, I-O-CONTROL paragraph에서는 각각의 파일 제어 항목이 점로 끝나야 한다.
-
Data division에서는 FD, SD, 및 데이터 기술 항목이 각각 점로 끝나야 한다.
-
Procedure division에서는 구분자 콤마로 statement 및 statement 안에 오퍼랜드를 분리할 수 있다. 각각의 procedure는 점로 끝나야 한다.
-
-
-
괄호 { ( } ...{ ) }
-
pseudo-text를 제외하고 괄호는 좌우 괄호는 쌍을 이루어 사용한다.
-
괄호는 subscriptor, 함수의 인수 리스트, reference-modifier, 산술식 혹은 조건을 구분하는 역할을 한다.
-
-
콜론 { : }
-
구분자로 사용된다.
-
-
큰따옴표 { " } ...{ " }
-
인용구의 시작을 나타내는 인용부는 직전에 공백 또는 왼쪽 괄호가 나와야 한다.
-
종료를 나타내는 큰따옴표 다음에는 구분자(공백, 콤마, 세미콜론, 점, 오른쪽 괄호 또는 pseudo-text 구분자)가 필요하다.
-
인용부는 쌍으로 사용해야 하며 영숫자 리터럴을 구분짓는 데 사용된다. 단, 리터럴이 여러 라인으로 구성된 경우에는 해당 규칙을 따른다.
-
-
작은따옴표 { ' } ...{ ' }
-
시작하는 작은따옴표 직전에 공백 또는 왼쪽 괄호가 나와야 한다.
-
종료를 나타내는 작은따옴표 다음에는 구분자 (공백, 콤마, 세미콜론, 점, 오른쪽 괄호 또는 pseudo-text 구분자)가 필요하다.
-
인용부는 쌍으로 사용해야 하며 영숫자 리터럴을 구분짓는 데 사용된다. 단, 리터럴이 여러 라인으로 구성된 경우에는 해당 규칙을 따른다.
-
-
Null-terminated 리터럴 구분자 { Z" } ...{ " } , { Z' } ...{ ' }
-
리터럴의 시작을 나타내는 구분자의 경우에는 직전에 공백 또는 왼쪽 괄호가 나와야 한다.
-
종료를 나타내는 구분자 다음에는 다른 구분자(공백, 콤마, 세미콜론, 점, 오른쪽 괄호 또는 pseudo-text 구분자)가 필요하다.
-
-
2byte 리터럴 구분자 { G" } ...{ " } , { G' } ...{ ' } , { N" } ...{ " } , { N' } ...{ ' }
-
리터럴의 시작을 나타내는 구분자의 경우에는 직전에 공백 또는 왼쪽 괄호가 나와야 한다.
-
종료를 나타내는 구분자는 다음에는 다른 구분자 (공백, 콤마, 세미콜론, 점, 오른쪽 괄호 또는 pseudo-text 구분자)가 필요하다.
-
-
National 리터럴 구분자 { N" } ...{ " } , { N' } ...{ ' } , { NC" } ...{ " } , { NC' } ...{ ' } , { NX" } ...{ " } , { NX' } ...{ ' }
-
리터럴의 시작을 나타내는 구분자의 경우에는 직전에 공백 또는 왼쪽 괄호가 나와야 한다.
-
종료를 나타내는 구분자는 다음에는 다른 구분자 (공백, 콤마, 세미콜론, 점, 오른쪽 괄호 또는 pseudo-text 구분자)가 필요하다.
-
-
Pseudo-text 구분자 {b==} ...{==b}
-
시작을 나타내는 구분자 직전에 공백이 있어야 한다.
-
종료를 나타내는 구분자는 다음에는 다른 구분자(공백, 콤마, 세미콜론, 점)가 필요하다. pseudo-text 구분자는 쌍으로 사용해야 하며 pseudo-text를 구분짓는다.
-
PICTURE 문자열, 주석 또는 영숫자 리터럴에 포함되는 구독기호는 구독기호로 판별되지 않으며 문자열 또는 리터럴의 일부로 인식된다. |
4. section and paragraphs
프로그램은 section과 paragraphs으로 정의할 수 있다. section과 paragraph은 sentences(문장)와 statement 그리고 항목(entry)로 세분화할 수 있다. Sentence는 statement와 phrases로 세분화되며, statement는 phrase로 세분화된다. entry는 clause와 phrase로 세분화된다.
다음은 각 division별 계층 구조이다.
-
Identification division
Paragraph |-- Entries |-- Clauses
-
Environment division
Sections |-- Paragraph |-- Entries |-- Clauses |-- Phrases
-
Data division
Sections |-- Entries |-- Clauses |-- Phrases
-
Procedure division
Sections |-- Paragraphs |-- Sentences |-- Statements |-- Phrases
다음은 계층 구조를 구성하는 각 항목에 대한 설명이다.
구분 | 설명 |
---|---|
Entries(항목) |
Entries은 점로 끝나는 일련의 clause들로 이루어진다. Entries은 Identification, Environment 그리고 Data division에서 지정할 수 있다. |
Clauses(문절) |
Clauses은 항목의 속성을 지정하기 위해 순서대로 나열한 연속한 COBOL 문자열의 집합이다. Clauses은 Identification, Environment 및 Data division에서 지정할 수 있다. |
Sentences(문장) |
Sentences은 점(.)로 끝나는 하나 이상의 statement의 나열이다. Procedure division에서 지정할 수 있다. |
Statements(문) |
Statements는 프로그램에서 처리해야 할 액션을 지정한다. Statement는 Procedure division에서 지정할 수 있다. |
Phrases(구) |
프로그램 안에 각각의 Clauses과 Statement는 Phrases로 구분되는 더 작은 단위로 세분화될 수 있다. |
5. 소스 텍스트 형식
COBOL 소스는 72 칼럼을 하나의 행으로 다음과 같은 영역으로 구성된다.
-
Sequence number area(시퀀스 번호 영역)
-
1~6번째 컬럼 영역이다.
-
시퀀스 번호 영역에는 소스 텍스트 행에 라벨을 붙이기 위한 용도로 사용된다. 컴퓨터가 지원하는 문자 셋에 속한 문자들을 사용할 수 있다.
-
-
Indicator area(표식 영역)
-
7번째 컬럼 영역이다.
-
표식 영역은 다음과 같은 지정을 위해 사용한다.
-
COBOL 워드 또는 리터럴이 연속해서 나타나고 있음
-
주석 처리
-
디버그 행
-
-
6. 이름의 적용범위
사용자 정의어는 데이터 리소스 또는 COBOL 프로그램 요소에 정의된 이름이다.
이름을 정의할 수 있는 리소스는 파일, 데이터 항목 또는 레코드 등이 있다. COBOL 프로그램 요소에 이름을 정의하는 경우는 프로그램, paragraph 등이 있다.
이렇게 정의한 이름들은 각 소스 프로그램 내에서 직접적 또는 간접적으로 사용된다. 경우에 따라서 다른 리소스 혹은 다른 프로그램 요소에 같은 이름을 사용할 수 있다. 이럴 경우 어떤 프로그램 요소에서 참조하는 이름은 해당 이름을 사용하는 프로그램 내에 정의된 것을 참조하며, 다른 소스 프로그램 내에서 정의된 이름을 가리키지 않는다.
-
사용자 정의어 중 다음은 사용자 정의어를 선언한 소스 프로그램 내의 statement 또는 entry에서만 참조가능하다.
-
paragraph 이름
-
section 이름
-
-
사용자 정의어 중 다음은 다른 어떤 COBOL 프로그램에서도 참조 가능하다.
-
라이브러리명
-
텍스트명
-
-
사용자 정의어 중 다음은 Configuration section에서 정의되며, 해당 Configuration section을 포함하는 소스 프로그램 내에서만 참조가 가능하다.
-
alphabet-name
-
condition-name
-
mnemonic-name
-
symbolic-character
-
-
위에 조건에 해당하지 않는 다음에 해당하는 사용자 정의어는 참조에 대해 개별적인 규칙이 적용된다.
사용자 정의어 규칙 프로그램명
COMMON 속성, nested 유무에 따라 속성이 달라진다.
파일명
File Description에 글로벌 속성이 명시되었을 경우 글로벌 속성을 갖는다.
레코드명, 데이터명, 조건명
해당 명에 글로벌 속성이 명시되었을 경우 글로벌 속성을 갖는다.
인덱스명
글로벌 속성의 데이터 항목을 인덱스로 참조할 경우에는 해당 인덱스도 글로벌 속성을 갖는다. 또한 인덱스의 범위는 해당 인덱스를 통해 참조되는 테이블의 데이터명의 범위와 같다. 따라서 데이터명에 적용되는 규칙이 똑같이 적용된다.
-
프로그램 A에 프로그램 B가 직접적으로 포함되어 있는 경우 A, B에서 정의된 조건명, 데이터명, 파일명 및 레코드명은 각각 사용자 정의어로 선언할 수 있다.
A, B 양쪽에 모두 존재하는 이름을 프로그램 B에서 참조할 경우 다음 규칙에 의해 판정된다.
-
프로그램 내의 선언을 우선 검색한다.
-
해당하는 이름이 발견되지 않으면 A 프로그램에서 글로벌 선언만 검색한다.
-
해당하는 이름이 2개 이상일 경우에 프로그램 B에서 이름이 2개 이상 나타나는 경우는 있을 수 없다. 프로그램 B에서 이름이 없거나 또는 하나 있을 경우에는 다음 규칙이 적용된다.
-
참조된 이름이 프로그램 B에서 정의되어 있다면 그 이름이 참조된다.
-
프로그램 A에서처럼 다른 프로그램에 정의되어 있는 경우라면 다음 절차로 판정된다.
-
참조된 이름이 프로그램 A에 글로벌 선언된 것이라면 프로그램 A에 선언된 이름을 참조한다.
-
프로그램 A가 아닌 프로그램 A의 상위 프로그램에서 글로벌 선언된 것이라면 해당 프로그램에 선언된 이름을 참조한다. 상위에 또 포함하는 프로그램이 있을 경우엔 해당 이름의 선언이 있을 때 까지 이 과정이 반복된다.
-
-
7. 참조
COBOL 프로그램에서 정의된 사용자 정의어 및 각 리소스 참조를 위해 정의된 이름들은 유일해야 한다. 본 절에서는 유일한 참조를 위해 사용되는 방법들과 각 리소스를 참조하는 방법에 대해 설명한다.
7.1. Qualification
어떤 이름이 여러 계층에 있을 때 해당 계층의 상위 레벨의 이름을 하나 또는 복수 지정함으로써 유일한 참조를 할 수 있다. 여기서 지정하는 상위 레벨의 이름을 qualifier라 하며, 이 이름을 고유하게 하는 프로세스를 Qualification이라고 한다.
Data division에서 Qualification은 모두 레벨 번호 다음에 쓴 데이터명에 대해 이루어진다. 즉, Qualification에 의해 이름이 고유하게 되는 경우 또는 전혀 참조되지 않는 경우를 제외하고 같은 그룹에 2개의 같은 데이터 이름을 기술할 수 없다.
Qualification 사용 규칙이다.
-
레벨 번호 01 다음에 기술된 이름이 최상위가 되고, 이후 02부터 49에 기술된 이름의 순서로 한다.
-
paragraph 이름에 대해서는 section 이름이 최상위 이름이며, 각 요소의 최상위 이름은 Qualification될 수 없으며 유일한 이름을 정의해야 한다.
-
subscriptor 또는 인덱스명과 조건변수도 Qualification을 통해 유일한 참조를 할 수 있다. 조건변수의 이름을 사용하여 조건명을 Qualification할 수 있다.
-
Qualification 지정과는 상관없이 데이터명과 procedure명에 같은 이름을 지정할 수 없다.
-
qualificaton 지정은 데이터명 또는 조건명, paragraph 이름 뒤에 IN 또는 OF와 함께 qualifier를 붙인다. IN과 OF는 같은 뜻으로 해석된다.
다음은 EMPLOYEE-NO라는 필드를 포함한 레코드를 갖는 파일이 여러 개 있고, 그 중 한 개의 파일에만 MASTER-RECORD라는 이름의 레코드로 Qualification한 예이다.
EMPLOYEE-NO OF MASTER-RECORD
다음의 내용을 주의해서 사용한다.
-
qualifier가 Qualification하는 이름보다 높은 레벨이어야 한다.
-
여러 계층에 걸쳐서 Qualification될 경우 낮은 레벨부터 기술한다.
-
여러 개의 데이터 항목에 대해 같은 데이터명 또는 조건명을 정의한 경우 해당 데이터명이나 조건명을 Procedure division, Environment division, Data division에서 참조할 경우에 반드시 Qualification해야 한다. 단, REDEFINE clause에서는 Qualification할 수 없다.
-
하나의 section에서 같은 paragraph 이름을 기술할 수 없다. paragraph 명을 section 명으로 Qualification할 경우에는 SECTION이라는 워드를 사용할 수 없다. 같은 section 내에서 참조할 경우에는 paragraph 이름을 Qualification할 필요가 없다.
-
Qualification이 굳이 필요가 없는 곳에서도 Qualification할 수 있다. qualifier가 여러 개 있는 경우에는 그 중 조합을 선택하여 사용할 수 있다. 단, 어떤 데이터에 대한 qualifier의 조합이 다른 데이터명에 대한 qualifier의 조합의 일부가 될 수 없다.
7.2. Subscripting
Subscripting은 subscriptor를 사용하여 테이블 아이템 개별 요소를 참조하는 방법이다.
subscriptor로 정수, 데이터명, 데이터명에 "+" 또는 "-" 연산자와 함께 기술된 산술식을 사용할 수 있다. 데이터명을 사용할 경우에는 숫자 기본 항목인 정수여야 한다. subscriptor 전체는 괄호로 구분한다. subscriptor로 사용하는 데이터에는 부호가 있을 수 있으나 반드시 양의 부호(+)여야 한다. subscriptor의 최솟값은 1이며 리스트나 테이블의 첫 번째 아이템을 가리킨다. subscriptor의 최댓값은 OCCURS clause에서 지정한 최댓값이다.
테이블 아이템을 식별하기 위한 subscriptor 조합은 대상이 되는 테이블 요소의 데이터명 뒤에 괄호로 감싸고 기술한다. 여러 개의 subscriptor를 지정할 때에는 데이터 구조 계층에 상위의 것부터 쓴다. 즉, 중첩된 테이블로 표현된 다차원 테이블에서 가장 바깥쪽 테이블이 major 테이블이 되며 가장 안쪽의 테이블이 minor 테이블로 간주될 경우에 subscriptor는 왼쪽부터 오른쪽, 즉 major, middle, minor 순으로 지정된다.
예를 들어 TABLE-THREE는 다음과 같이 정의되어 있다.
01 TABLE-THREE. 05 ELEMENT-ONE OCCURS 3 TIMES. 10 ELEMENT-TWO OCCURS 3 TIMES. 15 ELEMENT-THREE OCCURS 2 TIMES PIC X(8).
TABLE-THREE에 유효한 subscriptor를 사용한 참조는 다음과 같다.
ELEMENT-THREE (2 2 1)
다음은 Subscripting Format이다.
항목 | 설명 |
---|---|
condition-name-1 |
condition-name-1의 조건변수에는 OCCURS clause가 포함되거나 또는 OCCURS clause가 포함된 데이터 기술 항목에 종속되어 있어야 한다. |
data-name-1 |
OCCURS clause가 포함되어 있거나 또는 OCCURS clause가 포함된 데이터 기술 항목에 종속되어야 한다. |
data-name-2, file-name-1 |
data-name-1이 포함된 데이터 항목 또는 레코드여야 한다. |
integer-1 |
부호를 붙일 수 있으나 양의 부호만 가능하다. |
data-name-3 |
정수를 나타내는 기본 숫자 항목이어야 한다. data-name-3은 Qualification이 가능하다. |
index-name-1 |
참조될 테이블의 계층 내에 있고 INDEXED BY clause가 지정된 데이터 항목을 나타낸다. |
integer-2, integer-3 |
부호가 있는 integer는 올 수가 없다. |
각 테이블 항목의 참조는 다음 경우를 제외하고 subscriptor를 지정해야 한다.
-
SEARCH statement의 subject
-
REDEFINES clause 내
-
KEY가 OCCURS clause의 phrase일 경우
Subscriptor에 따른 각 Subscripting 사용
다음은 subscriptor에 따른 각 Subscripting의 사용에 대한 설명이다.
-
Subscripting using data-names
데이터 이름을 사용해서 subscriptor를 표현할 경우 해당 데이터 이름은 다른 테이블의 항목을 참조하는 경우도 사용할 수 있다. 각 테이블은 반드시 같은 개수의 항목을 가질 필요는 없다. 같은 데이터 이름은 하나의 항목을 갖는 하나만을 가리키는 subscriptor로 또는 다른 항목을 갖는 2개 이상의 subscriptor의 하나로써 지정할 수 있다. 데이터 이름은 Qualification 가능하지만 subscriptor를 붙이거나 인텍스로 사용할 수 없다.
예를 들어 TABLE-THREE에 대한 유용한 subscriptor(SUB1, SUB2 및 SUB3는 모두 SUBSCRIPT-ITEM에 종속된 항목이라 가정)를 사용해서 다음과 같이 참조할 수 있다.
ELEMENT-THREE (SUB1 SUB2 SUB3) ELEMENT-THREE IN TABLE-THREE (SUB1 OF SUBSCRIPTOR-ITEM, SUB2 OF SUBSCRIPTOR-ITEM, SUB3 OF SUBSCRIPTOR-ITEM )
-
Subscripting using index-names(indexing)
indexing을 지정해서 같은 종류의 데이터 리스트 및 테이블 항목의 개별 요소를 참조할 수 있다.
인덱스 지정은 테이블을 정의할 때에 해당 데이터 항목에 INDEXED BY clause를 지정한다. INDEXED BY clause를 통해 지정된 이름을 인덱스명이라 하며 정의한 인덱스를 참조하기 위해 사용된다. 인덱스의 값은 대응하는 테이블 또는 테이블 안에 요소의 출현횟수를 나타낸다.
인덱스명은 사용하기 전에 초기화 작업 후 사용해야 한다. 초기화하기 전에 값은 보장되지 않는다.
초기화는 다음과 같은 statement를 사용한다.
-
The PERFORM statement with the VARYING phrase
-
The SEARCH statement with the ALL phrase
-
The SET statement
인덱스명에 저장된 인덱스 값은 subscriptor 역할을 한다. subscriptor는 숫자 데이터 항목 또는 정수여야 하지만 인덱스는 테이블 요소의 출현 번호를 나타내는 특수한 타입의 데이터 항목이기 때문에 인덱스 값은 수치로 간주되지 않는다.
-
-
Relative Subscripting
Relative Subscripting은 데이터명 또는 인덱스명에 연산자 '+', '-'와 양수 리터럴 또는 부호가 없는 정수 리터럴로 구성된 산술식을 subscriptor로 사용하는 방법이다. 연산자 '+'와 '-' 전후에는 공백이 있어야 한다. subscriptor로 정의된 산술식의 값은 테이블 아이템에 대해 유효한 값이어야 한다.
Relative Subscripting을 사용하더라도 프로그램이 인덱스의 값을 변경하는 일은 없다.
7.3. Reference modification(부분참조)
Reference modification은 데이터 항목의 왼쪽의 문자 위치(시작 행)와 그 데이터 항목의 길이(옵션)을 지정함으로써 데이터 항목을 정의하는 방법이다.
항목 | 설명 |
---|---|
data-name-1 |
USAGE DISPLAY를 명시적 또는 암묵적으로 지정된 데이터 항목이다. data-name-1은 별도로 qualified하거나 Subscripting을 붙일 수 있다. 제일 왼쪽 문자의 위치란 data-name-1이 영숫자 테이터 항목을 참조할 때 해당 데이터의 위치를 나타낸다. 참조된 데이터 항목의 각 문자들 중 제일 왼쪽이 1, 오른쪽 방향으로 하나씩 증가하며 순서가 매겨진다. data-name-1의 데이터 기술 항목에 SIGN IS SEPARATE clause가 지정되어 있을 경우에는 부호에도 순서를 매긴다. |
function-name-1 |
영숫자 항목을 지정한다. |
leftmost-character-position |
산술식이어야 한다. 제일 왼쪽 문자의 시작 위치는 data-name-1에 의해 참조되는 데이터 항목의 참조되는 데이터의 자릿수 이하이거나, 0이 아닌 양의 정수를 지정한다. |
length |
산술식이어야 한다. 산술식의 결과는 0 이 아닌 양의 정수여야 한다. 왼쪽 문자의 시작위치와 길이의 합계에서 1을 뺀 값이 data-name-1 자릿수 이하여야 한다. 길이를 생략할 경우 사용하는 길이는 data-name-1에 해당하는 자릿수다. |
Reference modification은 data-name-1에 의해 참조된 데이터 항목의 부분집합 데이터 항목을 생성한다. 이 데이터 항목은 다음과 같은 방법으로 참조 대상의 데이터 항목에서 추출된다.
-
제일 왼쪽 문자의 위치를 먼저 평가한 후 수치를 얻는다.
-
시작점이 정해지면 길이가 계산된다. 참조 대상인 데이터 항목의 길이를 넘을 수 없으며, 길이를 생략했을 경우에는 지정된 위치부터 데이터 항목의 끝까지 지정한 것으로 간주한다.
위치 지정과 길이에 대해 계산된 결과값이 유효한 범위에 있는지 별도 체크하지 않는다. 규칙에 기술된 제한을 벗어난 경우에 대해서 값을 보장하지 못한다. . |
참조 대상 평가는 다음의 기준으로 적용된다.
-
참조할 대상에 subscriptor 지정이 있을 경우에는 subscriptor에 대한 평가 직후에 Reference modification이 평가된다. subscriptor에 ALL 지정이 있을 경우에는 지정된 모든 요소에대해서 주어진 Reference modification이 적용된다.
-
함수를 참조하는 경우 Reference modification 지정이 있을 경우에는 함수가 먼저 평가되고 그 직후에 Reference modification 평가가 이루어진다.
다음 예제에서는 WHOLE-NAME에 의해 참조된 데이터 항목의 첫 10 문자를 FIRST-NAME에 참조된 데이터 항목으로 이동한다.
77 WHOLE-NAME PIC X(25). 77 FIRST-NAME PIC X(10). ... MOVE WHOLE-NAME(1:10) TO FIRST-NAME
다음 예제는 WHOLE-NAME에 의해 참조된 데이터 항목 마지막 15 글자를 LAST-NAME에 참조된 데이터 항목으로 이동한다.
77 WHOLE-NAME PIC X(25). 77 LAST-NAME PIC X(15). ... MOVE WHOLE-NAME(11:) TO LAST-NAME
다음 예제는 TAB의 3번째 항목의 4번째와 5번째 문자를 SUFFIX라는 변수로 MOVE한다.
01 TABLE-1. 02 TAB OCCURS 10 TIMES PICTURE X(5). 77 SUFFIX PICTURE X(2). ... MOVE TAB OF TABLE-1 (3) (4:2) TO SUFFIX
7.4. Data division 이름 참조
본 절에서는 Data division에서 이름을 참조하는 방법에 대해서 설명한다.
단순한 데이터 참조
COBOL 프로그램의 데이터 항목을 참조하는 가장 기본적인 방법이다. 이는 qualifier, Subscripting 또는 Reference modification을 하지 않는 단순한 data-name-1을 의미한다. 단순한 데이터 참조는 단일 기본 항목 또는 그룹 항목을 참조할 수 있다. 단순한 데이터 항목은 다음 포맷으로 참조한다.
항목 | 설명 |
---|---|
data-name-1 |
임의의 데이터 항목을 기술한다. data-name-1은 프로그램 내에서 유일해야 한다. |
Identifier
identifier는 데이터 항목을 참조하기 위해 문자열과 분리구를 나열한 조합을 말한다. 다음 포맷으로 데이터 항목을 참조한다.
항목 | 설명 |
---|---|
data-name-1, data-name-2 |
레코드 이름을 지정한다. |
file-name-1 |
Data division의 FD 또는 SD entry에 정의된 것을 지정해야 한다. 프로그램에서 file-name-1은 유일해야 한다. |
항목 | 설명 |
---|---|
data-name-1, data-name-2 |
레코드 이름을 지정한다. |
condition-name-1 |
Configuration section을 포함한 프로그램 중 또는 해당 프로그램에 포함된 프로그램에서 statement 및 entry에서 참조할 수 있다. |
file-name-1 |
Data division의 FD 또는 SD entry에 정의된 것을 지정해야 한다. 프로그램에서 file-name-1은 유일해야 한다. |
다음의 사항에 주의해서 데이터 항목을 참조한다.
-
Qualification에 의해 데이터를 유일하게 할 수 없을 경우에는 데이터 이름이 중복되지 않도록 해야 한다.
-
프로그램 안에서 레벨 번호가 01이고 EXTERNAL clause를 포함한 항목의 subject로 지정된 데이터는 EXTERNAL clause를 포함한 다른 데이터 기술 항목과 같을 수 없다.
-
Data division 안에서 같은 데이터 이름이 지정된 임의의 2개의 데이터 항목에 관한 데이터 기술 항목에 GLOBAL clause를 포함하면 안된다. 명시적으로 참조되는 Data division의 이름은 유일하게 정의하거나, 또는 qualifier를 사용하여 유일하게 한다. 참조되지 않는 데이터 항목은 반드시 유일할 필요는 없다. 데이터 계층의 최고 레벨(레벨 표식 FD 또는 SD 혹은 레벨 번호 01)에서 참조되는 경우에는 유일한 이름이어야 한다.
Condition-name
condition-name은 프로그램 내에서 유일하게 지정하거나 또는 Qualification, Subscripting을 통해 유일하게 참조되어야 한다. condition-name을 유일하게 하기위해 Qualification할 경우에는 관련된 조건변수를 첫 Qualifier로 사용할 수 있다.
Qualification할 경우에는 조건변수에 관련된 데이터 그룹 내에 정의된 데이터명이나 조건변수명 자체를 사용해서 조건명을 유일하게 한다. 조건변수를 참조하기 위해 인덱스나 Subscripting이 필요한 경우에는 해당 조건명을 참조할 때에도 같은 조합의 인덱스와 Subscripting을 사용한다.
항목 | 설명 |
---|---|
condition-name-1 |
정의를 포함한 프로그램 안 또는 해당 프로그램에 포함되는 서브 프로그램 안에서 statement 및 entry 내에서 참조가 가능하다. |
data-name-1 |
레코드 이름을 지정한다. |
file-name-1 |
DATA division의 FD 또는 SD entry에 정의된 것을 지정한다. 프로그램에서 file-name-1은 유일해야 한다. |
mnemonic-name-1 |
mnemonic-name으로 사용되는 값에 대해서는 SPECIAL-NAMES paragraph를 참조한다. |
7.5. Procedure division 이름 참조
프로그램에서 명시적으로 참조되는 paragraph 이름은 section 내에서 유일해야 한다.
항목 | 설명 |
---|---|
section-name-1 |
paragraph에 대해서 사용할 수 있는 유일한 qualifier로 참조해야 한다. paragraph-name-1이 명시적으로 참조될 경우에 해당 paragraph 이름은 section 안에서 중복될 수 없다. |
paragraph-name-1 |
section-name-1에 의해 qualified될 때 SECTION이라는 단어를 포함시킬 수 없다. 해당 paragraph가 속한 section 내에서 참조될 경우엔 따로 qualified될 필요가 없다. 어떤 프로그램 안에 paragraph-name-1 또는 section-name-1은 다른 프로그램에서 참조할 수 없다. |
7.6. Function Identifier 참조
Function Identifiers는 함수 평가의 결과로써 생성되는 데이터 항목을 참조하기 위한 이름이다. 이 이름은 문자열과 분리구를 정해진 형식에 맞게 조합하여 사용한다.
항목 | 설명 |
---|---|
FUNCTION |
FUNCTION이라는 단어를 포함한다. |
argument-1 |
ID, 리터럴(Figurative constant를 제외한) 또는 산술식을 지정한다. |
function-name-1 |
Intrinsic function 이름 중 하나여야 한다. |
reference-modifier |
영숫자 타입의 함수에 대해서만 지정가능하다. |
Function ID는 임의의 statement에서 receiving 오퍼랜드로 사용될 수 있으나 다음의 경우는 주의한다.
-
정수 타입을 필요로 하는 곳에 숫자 타입의 함수를 지정할 수 없다. 단, 특정 숫자 함수에서 정수값을 참조할 수 있는 경우는 예외로 한다.
-
정수 또는 숫자 타입을 참조하는 함수는 산술식에서만 사용할 수 있다. 함수를 사용할 때 함수의 인자로 또 다른 Function ID를 지정할 수 있을 경우 인수로 지정된 Function ID 바로 왼쪽에 괄호는 이 함수가 바깥쪽 함수의 인자임을 나타낸다.
-
특별한 인수를 지정하지 않아도 되는 함수(RANDOM 등)에 대해서는 올바른 해석이 이루어지도록 주의가 필요하다.
다음과 같은 경우 A는 RANDOM 함수의 인수로 간주된다.
FUNCTION MAX ( FUNCTION RANDOM (A) B )
다음은 A를 MAX 함수의 인수 설정하는 예이다.
FUNCTION MAX (( FUNCTION RANDOM () A) B )
또는
FUNCTION MAX ( (FUNCTION RANDOM) (A) B )
또는
FUNCTION MAX ( FUNCTION RANDOM A B )
Function ID를 사용한 참조 일반 규칙은 다음과 같다.
-
Function ID를 사용해서 참조되는 값은 실행과정에서 참조될 때 결정되는 일시적인 데이터 항목이다.
Intrinsic function이 지정될 경우 일시적인 데이터 항목은 기본 데이터 항목이며 함수의 종류에 따라 세부 사항이 정해진다. 정의에 대한 자세한 사항은 Intrinsic Functions을 참조한다.
-
함수를 참조하는 경우 인수는 왼쪽부터 오른쪽의 순서대로 사용된다. 인수 자체가 함수이거나 함수를 포함하는 식인 함수의 경우 같은 함수를 인수로 지정할 수 있다. 즉, 재귀 호출이 가능하다.
7.7. 명시적 또는 암묵적 사양
COBOL 프로그램 요소는 다음과 같은 종류의 명시적인 지정과 암묵적인 지정이 가능하다.
-
Explicit and implicit Procedure division references. (명시적 참조, 암묵적 참조)
COBOL 프로그램의 Procedure division의 statement에서 데이터를 명시적 또는 암묵적으로 참조할 수 있다.
구분 설명 명시적 참조
Procedure division의 statement에서 참조 대상의 이름을 직접 기술하는 경우 또는 COPY statement, REPLACE statement를 사용해서 참조 대상의 이름을 복사해온 경우를 말한다.
암묵적 참조
Procedure division의 statement에서 참조 대상의 이름을 직접 기술하지 않고 데이터 항목을 참조하는 것을 말한다. 예를 들어 PERFORM statement를 사용할 때 관련된 제어구에 VARYING clause, AFTER clause 또는 UNTIL clause 지정있을 경우 지정된 인덱스 또는 리터럴에 의해 참조되는 경우 암묵적인 참조라고 한다. 이런 경우 데이터 항목은 해당 statement가 실행될 때 결정되며 참조된다.
-
Explicit and implicit transfers of control. (명시적 제어 흐름, 암묵적 제어 흐름)
Procedure division에서는 제어가 명시적으로 이동되는 경우 혹은 다음에 실행 가능한 statement가 없을 경우를 제외하고 프로그램의 흐름은 statement가 기술된 순서에 따라 제어가 이루어진다. 이러한 통상적인 프로그램의 흐름을 암묵적인 제어의 흐름이라고 한다.
암묵적 제어 흐름은 기술된 순서에 따라 statement에 흘러가는 경우 외에도 암묵적으로 제어의 흐름이 변경되는 경우가 있으며 다음과 같은 경우가 있을 수 있다.
-
다른 COBOL statement 제어에서 실행되던 procedure의 가장 마지막 statement의 실행이 끝나면 암묵적으로 제어가 돌아온다. (procedure의 실행을 제어하는 COBOL statement란 예를 들어 MERGE, PERFORM, SORT 및 USE 등이 있다) 또한 반복해서 실행이 가능한 PERFORM statement의 제어에 있는 paragraph가 실행되는 경우, 또한 해당 paragraph가 PERFORM statement 범위 내에서 최초의 paragraph일 경우에는 해당 paragraph가 반복되서 실행될 때 마다 PERFORM statement에 관련한 제어 메커니즘과 paragraph 최초의 statement 간에 암묵적인 제어의 흐름이 일어난다.
-
SORT 또는 MERGE statement를 실행하는 경우 관련된 I-O 관련 정의를 한 부분으로 제어가 옮겨진다.
-
procedure를 선언하는 COBOL statement 중 하나가 실행 될 때에 해당 선언 procedure로 제어가 암묵적으로 옮겨진다.
-
procedure를 선언이 끝나면 암묵적으로 해당 procedure 선언을 실행시킨 statement에 관련된 제어 메커니즘으로 제어가 돌아간다.
COBOL에서는 procedure를 분기하는 statement, 프로그램을 호출 또는 조건문 등의 실행으로 인해 제어를 명시적으로 이동할 수 있다(자세한 사항은 Procedure Division - statement를 참조한다).
다음에 실행가능한 statement란 위의 기술한 규칙에 따라 제어가 이동될 때에 실행되는 다음 COBOL statement를 의미한다.
다음과 같은 경우에는 다음에 실행가능한 statement가 존재하지 않는다.
-
해당 프로그램에 Procedure division이 없는 경우
-
선언 section에서 마지막 statement 뒤에 있고, 해당 statement가 포함된 paragraph가 다른 COBOL statement의 제어 안에서도 실행되지 않을 경우
-
프로그램의 마지막 statement 뒤에 있고, 해당 statement가 포함된 paragraph가 다른 COBOL statement의 제어 안에서도 실행되지 않을 경우
-
다른 section에서 실행되는 PERFORM statement 범위 내에 있고 선언 section의 마지막 statement 뒤에 위치한 선언 section의 마지막 statement가 활성화된 PERFORM statement의 출구로 정의된 procedure의 마지막 statement가 아닌 경우
-
COBOL 프로그램 밖으로 제어가 이동하는 STOP RUN statement 및 EXIT PROGRAM statement 뒤에 위치한 경우
-
COBOL 프로그램의 밖으로 제어를 이동하는 GOBACK statement 뒤에 위치한 경우
-
END PROGRAM
다음에 실행 가능한 statement가 없고 제어가 COBOL 프로그램 밖으로 옮겨지지 않을 경우에는 CALL statement으로 인해 프로그램이 실행되서 호출한 프로그램에서 암묵적으로 EXIT PROGRAM이 실행되지 않는한, 프로그램 제어의 흐름은 예측할 수 없다.
-
8. 프로그램 구조
COBOL 소스 프로그램은 문법에 맞게 기술된 COBOL statement의 집합이다.
COPY 및 REPLACE statement와 END PROGRAM을 제외한 COBOL 소스 프로그램의 statement, entries 및 section은 다음 4개의 division으로 구성된다.
-
Identification division
-
Environment division
-
Data division
-
Procedure division
다음은 하나의 독립된 컴파일 단위를 구성하는 COBOL 프로그램의 포맷이다.
END PROGRAM
COBOL 소스 프로그램은 END PROGRAM이 지정된 곳에서 종료된다. 중첩된 프로그램이 없을 경우에는 소스 프로그램의 기술이 끝난 지점이 COBOL 프로그램의 종료시점이 된다.
-
END PROGRAM program-name
-
END PROGRAM은 일련의 프로그램을 구분짓는다.
-
program-name은 identification division에서 기술한 program-name와 일치해야 한다.
-
중첩된 프로그램이 없고 단독으로 실행되고 끝나는 프로그램의 경우에는 END PROGRAM을 지정하지 않아도 무관하다.
-
중첩된 프로그램
COBOL 프로그램은 다른 COBOL 프로그램을 포함할 수 있으며, 포함된 프로그램은 또 다른 프로그램을 포함 할 수 있다. 이와 같이 포함된 프로그램들은 중첩된 프로그램이라고 한다. 중첩된 프로그램은 이를 포함하는 프로그램에 직접적 혹은 간접적으로 포함된다.
예를 들면 프로그램 B가 프로그램 A에 포함되는 경우 프로그램 B를 포함하는 프로그램이 프로그램 A뿐일 경우에 프로그램 B는 프로그램 A에 직접적으로 포함된다고 표현한다. 어떤 프로그램이 프로그램 A에 포함되어 있고 그 프로그램이 프로그램 B를 포함하고 있을 경우에는 프로그램 B는 간접적으로 프로그램 A에 포함된다고 표현한다.
다음은 프로그램 Outer-program이 직접적으로 프로그램 Inner-1을 포함하는 예제이다.
프로그램 Inner-1은 직접적으로 프로그램 Inner-1a를 포함하며 Outer-program은 간접적으로 Inner-1a를 포함한다.
ID division. Program-id. Outer-program. Procedure division. Call "Inner-1". Stop run. ID division. Program-id. Inner-1. ... Call Inner-1a. Stop run. ID division. Program-id. Inner-1a. ... End Inner-1a. End Inner-1. End Outer-program.
다음은 직접 또는 간접적으로 포함된 조금 더 복잡한 중첩된 프로그램의 예제이다.
프로그램 X는 X1 및 X2를 직접적으로 포함하고 X11 및 X12를 간접적으로 포함하는 가장 바깥의 프로그램이다.
|------- ID division. | Program-id. X. | Procedure division. | Display "I'm in X" | Call "X1" | Call "X2" | Stop run. | | |----- ID division. | | Program-id. X1. | | Procedure division. | | Display "I'm in X1" | | Call "X11" | | Call "X12" | | Exit Program. | | | | |--- ID division. | | | Program-id. X11. | | | Procedure division. | | | Display "I'm in X11" | | | Exit Program. | | |--- End Program X11. | | | | |---- ID division. | | | Program-id. X12. | | | Procedure division. | | | Display "I'm in X12" | | | Exit Program. | | |--- End Program X12. | |----- End Program X1 | | | ---- ID division. | | Program-id. X2. | | Procedure division. | | Display "I'm in X2" | | Exit Program. | | ---- End Program X2. |------- End Program X.
프로그램명 규칙
프로그램의 이름은 Identification division의 PROGRAM-ID paragraph에서 정의한다.
프로그램 이름의 적용범위에 관한 규칙은 다음과 같다.
-
COMMON 속성 없이 다른 프로그램에 직접적으로 포함된 프로그램의 이름은 그 프로그램을 호출하는 프로그램의 statement에서만 참조할 수 있다.
-
COMMON 속성을 갖으며 다른 프로그램에 직접적으로 포함된 프로그램은 그 프로그램을 호출하는 프로그램의 statement 내에서 또는 호출하는 프로그램에 직접/간접적으로 포함되는 프로그램의 statement에서 참조될 수 있다.
-
다른 프로그램에 종속되지 않는 프로그램의 이름은 실행단위 안에 다른 프로그램의 statement에서 참조가 가능하다. 단, 이 프로그램에 직접적 또는 간접적으로 포함되는 프로그램은 예외로 한다.
다음 예제는 ProgB와 ProgC를 포함하는 ProgA이다.
ProgC는 ProgD와 ProgF를 포함하며, ProgD는 ProgE를 포함한다. 만약, ProgD가 COMMON 속성이 없을 경우 ProgD를 직접 포함하고 있는 ProgC에서만 참조가능하다.
ProgD에 COMMON 속성이 지정되어 있을 경우에는 ProgD를 직접 포함하고 있는 ProgC와 ProgC가 직접 포함하는 다른 프로그램은 ProgD를 참조할 수 있다. 단, ProgD가 포함하고 있는 프로그램은 ProgD를 참조할 수 없다. 즉, 여기에서 ProgD가 COMMON 속성이 지정되어 있을 경우 ProgD는 ProgC, ProgF에서만 참조가 가능하다.