1. ASSIGN statement

Assignment statement는 표현식을 계산하여 그 결과 값을 하나 이상의 target 변수에 저장한다. 이때, target 변수 또는 의사 변수(Pseudo variable)의 속성이 source의 속성과 다를 수가 있으므로, 데이터 변환이 발생할 수도 있다.

figure syntax assignment
항목 설명

reference

target 변수 또는 의사 변수를 기술한다.

expression

Source의 표현식이다.

BY NAME

Structure assigment에 사용되는 옵션이다. 자세한 사항은 "Assignment 실행"을 참고한다.

복합 assignment statement

복합 assignment statement는 복합 연산자를 이용하여 assignment를 수행한다.

figure syntax assignment compound
항목 설명

reference

Target 변수 또는 의사 변수를 기술한다.

compound operator

Assignment가 수행되기 전 source와 target을 연산할 연산자를 기술한다.

복합 assignment statement에 사용 가능한 복합 연산자는 다음과 같다.

  • += : 덧셈 연산 후 assignment 수행

  • -= : 뺄셈 연산 후 assignment 수행

  • *= : 곱셈 연산 후 assignment 수행

  • /= : 나눗셈 연산 후 assignment 수행

  • **= : 거듭제곱 연산 후 assignment 수행

  • ||= : 접합 연산 후 assignment 수행

  • |= : or 연산 후 assignment 수행

  • &= : and 연산 후 assignment 수행

  • ^= 또는 <> : exclusive-or 연산 후 assignment 수행

expression

Source의 표현식이다.

복합 assignment statement는 다음과 같이 수행된다.

 X += 5;      ==> X = X + 5;
 X *= Y - 1;  ==> X = X * (Y - 1);
Target variable

Target variable은 element, 배열, 구조체 변수 또는 의사 변수가 될 수 있다.

  • 배열

    • target은 스칼라 또는 구조체의 배열이어야 한다. source는 스칼라 표현식(Acalar expression)이거나 target과 같은 dimension과 bound를 가진 표현식이어야 한다.

  • 구조체

    • BY NAME이 기술되어 있으면 각 target은 구조체이어야 하고, source 또한 구조체이어야 한다.

    • BY NAME이 없으면 각 target은 구조체이어야 하고, source는 스칼라 또는 target과 같은 구조의 구조체이어야 한다.

    • BY NAME이 없을 때 source를 NULL string("")으로 기술하게 되면 다음과 같이 처리된다.

      1. 모든 target은 '00’X로 채워진다.

      2. 모든 numeric target은 0이 된다.

      3. 모든 character, graphic target은 공백으로 채워진다.

Assignment 실행
  • 배열

    • 모든 Array 연산자(source & target)는 동일한 dimension과 bound를 가져야 한다.

    • Array assignment는 다음과 같이 loop로 확장된다.

       DO I1 = LBOUND( target-variable, 1 ) to HBOUND( target-variable, 1 );
       DO I2 = LBOUND( target-variable, 2 ) to HBOUND( target-variable, 2  );
      ...
       DO IN = LBOUND( target-variable, N ) to HBOUND( target-variable, N );
      
         generated element assignment ;
      
       END;
    • N은 target의 number of dimension이다. Generated element assignment에서는 I1 ~ IN을 subscript로 사용한다. Source가 스칼라이면 subscript는 적용되지 않는다.

  • 구조체

    • BY NAME이 기술되지 않은 경우 다음과 같이 처리된다.

      • 모든 연산자는 배열이어서는 안되고, 동일한 구조를 가진 구조체이어야한다. 멤버로 배열을 포함할 수는 있다.

      • 각각의 멤버별로 assignment로 확장한다. 멤버가 n개이면 n개의 assignment가 실행된다.

      • 멤버 assignment가 또다시 aggregate assignment이면 확장되어 처리된다.

    • BY NAME이 기술되면 다음과 같이 처리된다.

      1. target 구조체의 첫 번째부터 멤버 이름과 같은 이름을 source 멤버에서 찾는다. 이때 멤버는 구조체의 바로 하위 레벨(child)만 찾는다. child의 child는 찾지 않는다.

      2. 찾지 못하면 두 번째 멤버, 세 번째 멤버 등등 찾을 때까지 반복한다.

      3. 찾았을 때 멤버가 구조체 또는 구조체의 배열이면 멤버에 대해 BY NAME 옵션을 가진 assignment로 처리된다.

      4. 찾은 멤버가 스칼라 또는 스칼라의 배열이면 element assignment를 수행한다.

      5. 다음 멤버에 대해 위의 작업을 동일하게 처리한다.

    • 다음은 BY NAME을 사용한 구조체 assignment에 대한 예이다.

       DCL 1 ONE,              DCL 1 TWO,              DCL 1 THREE
             2 PART1,                2 PART1,                2 PART1,
               3 RED,                  3 BLUE,                 3 RED,
               3 ORANGE,               3 GREEN,                3 BLUE,
             2 PART2,                  3 RED,                  3 BROWN,
               3 YELLOW,             2 PART2,                2 PART2,
               3 BLUE,                 3 BROWN,                3 YELLOW,
               3 GREEN;                3 YELLOW;               3 GREEN;