Compiler-directing statement

Compiler-directing statementdms 컴파일할 때 컴파일러에게 특정 처리를 지시하는 statement 이다. 컴파일 전에 소스 텍스트를 제어하는 COPY, REPLACE statement가 있다. 본 장에서는 Compiler-directing statement의 사용법에 대해서 설명한다.

1. COPY

COPY statement는 미리 쓰여진 텍스트를 프로그램 소스 내에 삽입하는 기능을 제공한다.

사전에 작성된 코드를 임의의 copybook 파일에 저장해놓고 COPY statement 지정으로 소스를 삽입하여 사용한다. copybook 파일을 사용하기 위해서는 환경변수 $OFCOBCPY에 copybook 경로를 등록한다.

다음은 COPY statement의 포맷이다.

figure copy
COPY Statement Format

다음은 statement의 각 설정 항목에 대한 설명이다.

  • text-name, literal-1

    • 치환할 소스 코드가 기술되어 있는 copybook 파일 이름을 기술한다. 환경변수에 설정된 copybook 경로에서 해당 copybook을 찾는다.

    • copybook 이름은 파일이름 규칙이 적용된다.

    • COPY statement에서 인식하는 copybook 이름은 최대 8글자로 제한된다.

    • 8글자를 초과하여 사용하려면 compile option으로 --disable-cpy-limit을 사용해야 한다.

  • library-name, literal-2

    • copybook 파일의 경로를 기술한다.

  • REPLACING phrase

    • REPLACING phrase는 operand-1에 해당하는 텍스트에 일치하는 항목이 있을 경우에 지정된 operand-2로 치환하여 삽입한다.

    • 오퍼랜드로 지정할 수 있는 것들은 다음과 같다.

      항목 설명

      pseudo-text

      pseudo-text 구분자(==)에 의해 구분된 일련의 문자열과 구분문자를 지정한다.

      pseudo-text를 구분하는 pseudo-text 구분자 (==)는 연속해서 나와야 하며 한 줄 안에 있어야 한다. 단, pseudo-text 자체는 여러 라인에 걸쳐 기술할 수 있다.

      ID

      Data division에 정의된 임의의 section명을 지정할 수 있다.

      리터럴

      숫자리터럴, 영숫자 리터럴, 2byte 문자 리터럴을 지정할 수 있다.

      COBOL 워드(단, COPY 제외)

      COPY를 제외한 COBOL 워드를 지정할 수 있다.

      함수 ID

      함수 ID를 지정할 수 있다.

다음은 COPY statement 사용 규칙이다.

  • 문자열 및 구분문자를 사용할 수 있는 곳 어디에서나 소스 텍스트 내에서 COPY statement를 사용할 수 있다.

  • COPY statement는 COPY 워드로 시작하고 점(.)으로 끝나는 하나의 문장이 copybook 안의 내용으로 치환된다. REPLACING phrase 지정이 있을 경우에는 주어진 규칙에 따라 텍스트 치환이 이루어진다.

  • COPY statement 안에 COPY statement를 중첩하여 사용할 수 있다. 단, 중첩시키는 경우에는 REPLACING phrase를 지정할 수 없다. 또한 REPLCACING phrase가 지정된 copybook을 COPY statement에서 지정할 수 없다. 10개 이상의 copybook이 중첩되서 사용될 수 없다.

  • COPY statement는 재귀적으로 사용될 수 없다. 예를 들어 'COPY X.'가 있고, copybook X에 'COPY Y.'가 있을 경우 copybook Y에 COPY X 또는 COPY Y statement가 포함될 수 없다.

  • copybook에 작성된 소스가 문법에 맞게 기술되어 있는지 체크하지 않는다. 모든 COPY statement 및 REPLACE statement 처리가 완전히 종료된 다음에야 문법 체크가 이루어진다. 단, copybook에 기술된 소스 텍스트는 그대로 삽입되므로 copybook를 작성할 때에는 소스 텍스트 형식에 맞게 기술되어야 한다.

치환, 비교 규칙

다음은 치환, 비교에 관한 규칙이다.

  • 산술 연산자와 논리 연산자는 텍스트 워드로 간주되며 pseudo-text로 치환할 수 있다. pseudo-text 구분자 앞뒤 공백은 제외된다. 단, 텍스트 안에 공백은 처리된다.

  • operand-1이 Figurative contstant일 경우 같은 Figurative constant에만 일치한다. 예를 들어 ALL "AB"가 지정될 경우 "ABAB"와는 일치하지 않는다.

  • PICTURE 문자열을 치환할 경우 pseudo-text 구분자와 같이 지정하여 치환할 수 있다. 단, 가독성 높이기 위해서 PICTURE 문자열을 치환할 경우 pseudo-text에는 PICTURE와 PIC와 같은 키워드를 포함한 PICTURE 문자열 전체를 지정하는 것을 권장한다.

  • copybook 파일 내에 기술된 구분자 콤마(,), 세미콜론(;), 공백 모두 삽입된다.

  • operand-1과 library 텍스트는 operand-1에 지정된 일련의 문자열의 순서와 library 단어들의 순서가 모두 같을 경우에만 일치한다. 일치하는 것이 나타날 때까지 또는 REPLACING 조건이 더 이상 없을 때까지 비교가 일어난다.

    operand-1에 일치하는 것이 나타날 때 마다 operand-2에 기술된 내용으로 삽입된다.

  • REPLACING phrase가 지정된 COPY statement를 사용함으로써 워드의 일부분을 치환할 수 있다. 콜론( : )에 의해 구분된 더미 오퍼랜드를 기술해 두고 상황에 맞게 REPLCAING하여 사용할 수 있다.

  • 커맨트 및 빈 줄은 비교하는 경우 무시된다.

예제

다음은 copybook PAYLIB의 예제로 데이터 항목이 정의 부분이다.

01   A.
  02 B     PIC  S99.
  02 C     PIC  S9(5)V99.
  02 D     PIC  S9999  OCCURS 1 TO 52 TIMES
                         DEPENDING ON B OF A.

프로그래머는 프로그램의 Data division에서 COPY statement를 다음과 같이 사용할 수 있다.

COPY  PAYLIB.

프로그램에서는 copybook PAYLIB에 기술된 소스가 삽입된다.

다음은 REPLACING을 사용해서 이름을 변경하는 예제이다.

COPY  PAYLIB  REPLACING  A BY PAROLL
                         B BY PAY-CODE
                         C BY GROSS-PAY
                         D BY HOURS.

이 프로그램에서는, library 텍스트가 복사되어, 복사된 텍스트는 다음과 같이 쓰여진다.

01 PAYROLL.
  02 PAY-CODE     PIC  S99.
  02 GROSS-PAY    PIC  S9(5)V99.
  02 HOURS        PIC  S9999  OCCURS 1 TO 52 TIMES
                         DEPENDING ON PAY-CODE OF PAYROLL.

이때 지정된 변환은 해당 프로그램에서만 이루어진다. copybook PAYLIB은 변경되지 않는다.

다음과 같은 규칙을 갖는 copybook은 이름의 일부 (예를 들어 prefix)를 REPLACING을 지정하여 변경할 수 있다.

01   :TAG:.
  02 :TAG:-WEEK         PIC  S99.
  02 :TAG:-GROSS-PAY    PIC  S9(5)V99.
  02 :TAG:-HOURS        PIC  S9999  OCCURS 1 TO 52 TIMES
                         DEPENDING ON :TAG:-WEEK OF :TAG:.

프로그래머는 프로그램의 Data division에서 COPY statement를 다음과 같이 사용할 수 있다.

COPY  PAYLIB REPLACING ==:TAG:== BY ==Payroll==.
또는
COPY  PAYLIB REPLACING 'TAG' BY Payroll. =.

결과적으로 삽입된 프로그램은 다음과 같다.

01 PAYROLL.
  02 PAYROLL-WEEK         PIC  S99.
  02 PAYROLL-GROSS-PAY    PIC  S9(5)V99.
  02 PAYROLL-HOURS        PIC  S9999  OCCURS 1 TO 52 TIMES
                      DEPENDING ON PAYROLL-WEEK OF PAYROLL.

다음은 PICTURE 문자열에서 레벨번호를 지정해서 치환하는 예제이다.

COPY xxx REPLACING  ==(01)==  BY ==(01)==
                    == 01 ==  BY == 05 ==.

2. REPLACE

REPLACE statement는 소스 프로그램 내의 텍스트를 변환하기 위해 사용한다. 소스 프로그램 내에 문자열이 사용된 곳은 어디에서든 기술이 가능하다.

REPLACE statement는 변경이 필요한 부분들을 찾아서 바꿀 필요없이, 전체 COBOL 컴파일 그룹이나 그 일부에 변경 방법을 제공한다. COPY statement가 지정된 copybook을 삽입하는 과정에서만 변환하는 것과는 달리 프로그램 소스 전체를 대상으로 한다는 것을 빼고는 COPY statement의 REPLACING 지정한 것과 같은 비교, 변환 규칙이 적용된다.

  • Format 1

    소스 프로그램 내에 pseudo-text-1에 일치하는 텍스트가 나타날 때마다 대응되는 pseudo-text-2로 변환된다.

    figure replace format1
    REPLACE Statement Format 1
  • Format 2

    REPLACE statement로 지정된 변환 규칙은 REPLACE-OFF가 나올 때까지 적용된다. REPLACE-OFF가 없을 경우에 REPLACE 규칙은 해당 statement가 시작된 시점에서 다음 REPLACE statement가 나타날 때까지 혹은 프로그램의 끝까지 적용된다.

    figure replace format2
    REPLACE Statement Format 2

다음은 statement의 각 설정 항목에 대한 설명이다.

  • pseudo-text-1

    • 하나 이상의 텍스트 워드를 포함해야 한다.

    • pseudo-text-1은 구분자 콤마(,) 또는 구분자 세미콜론(;)만으로 구성할 수 있다.

  • pseudo-text-2

    • 하나 이상 또는 하나도 지정하지 않을 수 있다. 아무것도 지정하지 않았을 경우에는 삭제를 의미한다.

pseudo-text-1 및 pseudo-text-2는 소스 프로그램에 기술할 수 있는 임의의 텍스트 워드 (단, COPY 제외)를 사용할 수 있다.

컴파일러는 COPY statement 지정이 있으면 먼저 이를 처리하고 난 다음에 소스 프로그램 내에 REPLACE statement를 처리한다. COPY statement가 있을 경우에는 완전한 소스를 생성하는 것이 먼저이기 때문이다. 완전한 소스 프로그램이 생성된 다음에 REPLACE statement를 사용해서 단순한 문자열의 치환이 이루어진다. REPLACE statement는 자체적으로 COPY statement를 포함할 수 없다.

COPY statement와 REPLACE statement의 처리가 완료될 때 까지는 해당 소스 프로그램의 문법 체크를 판별할 수 없다.

3. READY/RESET TRACE

READY 혹은 RESET TRACE statement는 procedure의 실행을 추적하기위해 사용한다.

READY / RESET TRACE statement는 일반적인 statement가 허용되는 위치에 나올 수 있다. OFCOBOL에서는 compile option --trace를 통해서 READY / RESET TRACE를 사용할 수 있다.

컴파일할 때 해당 compile option을 명시하지 않으면 READY / RESET TRACE 구문은 무시된다.

  • READY TRACE

    figure ready trace
    READY TRACE STATEMENT

    READY TRACE statement가 실행된 시점 이후 방문하게 되는 procedure의 이름을 출력한다.

  • RESET TRACE

    figure reset trace
    RESET TRACE STATEMENT

    RESET TRACE statement가 실행된 시점 이후 방문하게 되는 procedure 이름은 출력되지 않는다.