1. ASSIGN statement
Assignment statement는 표현식을 계산하여 그 결과 값을 하나 이상의 target 변수에 저장한다. 이때, target 변수 또는 의사 변수(Pseudo variable)의 속성이 source의 속성과 다를 수가 있으므로, 데이터 변환이 발생할 수도 있다.
| 항목 | 설명 |
|---|---|
reference |
target 변수 또는 의사 변수를 기술한다. |
expression |
Source의 표현식이다. |
BY NAME |
Structure assigment에 사용되는 옵션이다. 자세한 사항은 "Assignment 실행"을 참고한다. |
복합 assignment statement
복합 assignment statement는 복합 연산자를 이용하여 assignment를 수행한다.
| 항목 | 설명 |
|---|---|
reference |
Target 변수 또는 의사 변수를 기술한다. |
compound operator |
Assignment가 수행되기 전 source와 target을 연산할 연산자를 기술한다. 복합 assignment statement에 사용 가능한 복합 연산자는 다음과 같다.
|
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("")으로 기술하게 되면 다음과 같이 처리된다.
-
모든 target은 '00’X로 채워진다.
-
모든 numeric target은 0이 된다.
-
모든 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이 기술되면 다음과 같이 처리된다.
-
target 구조체의 첫 번째부터 멤버 이름과 같은 이름을 source 멤버에서 찾는다. 이때 멤버는 구조체의 바로 하위 레벨(child)만 찾는다. child의 child는 찾지 않는다.
-
찾지 못하면 두 번째 멤버, 세 번째 멤버 등등 찾을 때까지 반복한다.
-
찾았을 때 멤버가 구조체 또는 구조체의 배열이면 멤버에 대해 BY NAME 옵션을 가진 assignment로 처리된다.
-
찾은 멤버가 스칼라 또는 스칼라의 배열이면 element assignment를 수행한다.
-
다음 멤버에 대해 위의 작업을 동일하게 처리한다.
-
-
다음은 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;
-