표현식

본 장에서는 OpenFrame PL/I의 표현식에 대해서 설명한다.

1. 개요

표현식은 값의 표현이다. 표현식은 하나의 상수, 변수, 함수 참조이거나 함께 조합하여 사용되는 연산자와 괄호가 포함된 임의의 조합들 중에 하나가 될 수 있다.

연산자가 포함된 표현식을 연산식(Operational expression)이라고 한다. 연산식에 사용되는 상수와 변수는 피연산자라고 한다. 자세한 설명은 Evaluation 처리순서를 참고한다.

다음 다이어그램은 표현식의 문법을 나타낸다.

figure expression1

unary_expression:

image

elementary_expression:

image

reference:

image

locator_qualifier:

image

basic_reference:

image

subscript_list:

image

argumnet_list:

image

qualified_reference:

image

표현식은 스칼라 표현식(Scalar expression)이라고 불리기도 하는 요소 표현식과 배열 표현식, 구조 표현식으로 분류될 수 있다. 요소 변수와 배열 변수는 같은 표현식에 나타날 수 있다.

  • 요소 표현식(An element expression)

    하나의 값을 나타낸다. 배열에서 하나의 요소를 지정하는 첨자 이름이나 구조 또는 조합내에 있는 요소의 이름을 포함한다.

  • 배열 표현식(An array expression)

    값의 배열을 나타낸다. 차원의 속성을 갖는 구조 또는 조합의 멤버를 포함한다.

  • 구조 표현식(An structure expression)

    값의 구조화된 집합을 나타낸다.

2. Evaluation 처리순서

PL/I 문에는 하나 이상의 표현식이나 참조(Reference)가 포함되어 있다. 대입문같은 특별한 경우에 대해 설명한 것을 제외하고는 Evaluation은 임의의 순서나 동시에 될 수 있다.

다음의 예를 살펴보자.

DCL (X,Y,Z) ENTRY RETURNS(FIXED);
DCL (A,B,C) FIXED;

A = X( Y(B,C), Z(B,C) );

함수 Y와 Z는 전달되는 인자의 값에 따라 달라질수 있다. 그러므로 X에 의해 반환되는 값은 먼저 호출되는 함수에 따라 달라질수 있다. 첫 번째 매개 변수가 먼저 계산될거라고 가정해서는 안된다. 어떤 상황에서는 마지막을 먼저 계산하는 것이 적합할 수 있기 때문이다.

3. Target

표현식 evaluation이나 변환의 결과는 대상에 대입된다. 대상은 변수, 의사 변수, 중간 결과가 될 수 있다.

  • 변수(Variables)

    대입문의 경우 대상은 대입 기호의 왼쪽에 있는 변수이다. 변수에 대한 대입은 스트림 I/O, DO, DISPLAY, 레코드 I/O 문에서 발생할 수 있다.

  • 의사 변수(Pseudo variables)

    의사 변수는 대상 부분에 나타난다. 자세한 설명은 내장함수(Built-in Function)를 참고한다.

  • 중간 결과(Intermediate results)

    표현식을 계산할 때 대상 속성은 보통 소스의 속성이나 수행되는 연산의 속성, 두 번째의 피연산자의 속성으로부터 부분적으로 유도된다. 일부 디폴트가 사용될 수 있고, 일부 구현제한과 규정이 존재한다. 추가 연산이 수행되는 경우에 중간 결과가 변환이 이루어질수도 있다.

    표현식을 계산한 후에 결과는 변수 또는 의사 변수에 할당하기 위해 추가로 변환될 수 있다. 이러한 변환은 프로그래머가 정의한 데이터의 변환과 같은 규칙을 따라야 한다.

    다음의 예를 살펴보자.

    DCL A CHAR(8), B DEC FIXED(3,2), C BIN FIXED(10);
    A = B + C;

    위의 경우 표현식 B + C가 계산되고, 그 결과가 대입되는 동안에 4번의 다른 결과가 만들어진다.

    1. B와 동등한 변환된 binary가 할당되는 중간 결과

    2. 덧셈의 binary 결과가 할당되는 중간 결과

    3. 이진 결과와 동등한 변환된 decimal fixed-point가 할당되는 중간 결과

    4. decimal fixed-point 표현의 값과 동등한 변환된 문자가 할당되는 결과의 최종 목적지가 되는 A

    첫 번째 결과의 속성은 소스 B의 속성, 연산자, 다른 피연산자의 속성에 따라 결정된다. 만약 산술 중 위 연산자의 한 피연산자가 binary이면, 다른 피연산자는 Evaluation 전에 binary로 변환된다. 두 번째 결과의 속성은 소스의 속성에 따라 결정된다. 세 번째 결과의 속성은 일부 소스와 최종 대상 A의 속성의 일부분에 따라 결정된다. 최종 대상을 결정하는 유일한 속성은 DECIMAL이다.

4. 연산식

연산식(Operational expressions)은 하나 이상의 단일 연산으로 구성되어 있다. 단일 연산은 연산자가 피연산자 앞에오는 전위 연산이나 연산자가 두 피연산자 사이에 있는 중위 연산이 된다. 중위 연산의 두 피연산자는 일반적으로 연산이 수행될 때 같은 데이터 타입이어야 한다. 필요하다면 PL/I 표현식에서 연산의 피연산자는 연산이 수행되기 전에 같은 데이터 타입으로 변환된다. 자세한 변환 규칙은 데이터 변환을 참고한다.

표현식에서 다른 데이터 타입의 사용은 몇 가지 제한이 있다. 그러나, 이런 혼합 데이터 타입의 사용은 변환을 의미한다. 만약 변환이 실행 시간에 일어날 경우 프로그램은 더 오래 걸리게 된다. 또한 변환은 정밀도의 손실을 발생할 수 있다. 데이터 타입을 혼합한 표현식이 사용될 때 관련된 변환 규칙을 이해해야 한다.

연산의 종류는 다음과 같이 나뉠수 있다.

4.1. 산술 연산

산술 연산(Arithmetic operations)은 다음과 같은 연산자들 중에서 하나를 갖는 피연산자들의 조합으로 나타낼 수 있다.

  • 연산자

    + - * / **

플러스 부호와 마이너스 부호는 전위 연산자나 중위 연산자로 나타낼 수 있다. 그 외에 모든 다른 산술 연산자는 중위 연산자로서만 나타낼 수 있다. 산술 연산은 또한 ADD, SUBTRACT, DIVIDE, MULTIPLY 내장함수로 나타낼 수 있다. 전위 연산자는 중위 연산의 어느 피연산자 중 하나와 연관될 수 있고 앞에 올 수 있다.

예를 들어 A/-B에서 마이너스 부호는 A의 값에 B의 -1배 값을 나눈 것을 나타낸다. 하나 이상의 전위 연산자는 단일 변수와 연관될 수 있고 앞에 올 수 있다. 하나 이상의 양의 전위 연산자(+)는 누적 효과가 없지만, 두 개의 음의 전위 연산자(--)는 하나의 양의 전위 연산자(+)와 동일한 효과를 갖는다.

산술 연산 결과

표현식에서 피연산자의 필요한 변환이 수행된 후에, 산술 연산이 수행되고 결과값이 얻어진다. 이 결과는 표현식의 값이 될수도 있고, 추가 연산이 수행되어야 할 때의 중간 결과가 될 수도 있으며, 또는 조건이 발생될 수도 있다.

다음에 나오는 표는 다양한 산술 연산으로부터의 결과의 속성과 정밀도를 보여준다.

  • Results of arithmetic operations for one or more FLOAT operands

    첫 번째 피연산자(p1,q1) 두 번째 피연산자(p2, q2) 거듭제곱에 대한 결과 속성 사칙연산에 대한 결과 속성 덧셈 또는 뺄셈 정밀도 곱셈 정밀도 나눗셈 정밀도

    FLOAT DECIMAL(p1)

    FLOAT DECIMAL(p2)

    FLOAT DECIMAL(p), p = MAX(p1, p2)

    FLOAT DECIMAL(p)

    p = MAX(p1, p2)

    p = MAX(p1, p2)

    p = MAX(p1, p2)

    FLOAT DECIMAL(p1)

    FLOAT DECIMAL(p2, q2)

    FLOAT DECIMAL(p), p = MAX(p1, p2)

    FLOAT DECIMAL(p)

    p = MAX(p1, p2)

    p = MAX(p1, p2)

    p = MAX(p1, p2)

    FIXED DECIMAL(p1,q1)

    FLOAT DECIMAL(p2)

    FLOAT DECIMAL(p), p = MAX(p1, p2)

    FLOAT DECIMAL(p)

    p = MAX(p1, p2)

    p = MAX(p1, p2)

    p = MAX(p1, p2)

    FLOAT BINARY(p1)

    FLOAT BINARY(p2)

    FLOAT BINARY(p), p = MAX(p1, p2)

    FLOAT BINARY(p)

    p = MAX(p1, p2)

    p = MAX(p1, p2)

    p = MAX(p1, p2)

    FLOAT BINARY(p1)

    FIXED BINARY(p2, q2)

    FLOAT BINARY(p), p = MAX(p1, p2)

    FLOAT BINARY(p)

    p = MAX(p1, p2)

    p = MAX(p1, p2)

    p = MAX(p1, p2)

    FIXED BINARY(p1,q1)

    FLOAT BINARY(p2, q2)

    FLOAT BINARY(p), p = MAX(p1, p2)

    FLOAT BINARY(p)

    p = MAX(p1, p2)

    p = MAX(p1, p2)

    p = MAX(p1, p2)

    FIXED BINARY(p1,q1)

    FLOAT BINARY(p2)

    FLOAT BINARY(p), p = MAX( CEIL(p1*3.32), p2)

    FLOAT BINARY(p)

    p = MAX( CEIL(p1*3.32), p2)

    p = MAX(CEIL (p1*3.32), p2)

    p = MAX(CEIL (p1*3.32), p2)

    FLOAT DECIMAL(p1)

    FLOAT BINARY(p2, q2)

    FLOAT BINARY(p), p = MAX( CEIL(p1*3.32), p2)

    FLOAT BINARY(p)

    p = MAX( CEIL(p1*3.32), p2)

    p = MAX( CEIL(p1*3.32), p2)

    p = MAX(CEIL (p1*3.32), p2)

    FLOAT DECIMAL(p1)

    FLOAT BINARY(p2)

    FLOAT BINARY(p), p = MAX( CEIL(p1*3.32), p2)

    FLOAT BINARY(p)

    p = MAX( CEIL(p1*3.32), p2)

    p = MAX( CEIL(p1*3.32), p2)

    p = MAX(CEIL( p1*3.32), p2)

    FIXED BINARY(p1,q1)

    FLOAT DECIMAL(p2)

    FLOAT BINARY(p), p = MAX(p1, CEIL(p2*3.32))

    FLOAT BINARY(p)

    p = MAX(p1, CEIL(p2*3.32))

    p = MAX(p1, CEIL(p2*3.32))

    p = MAX(p1, CEIL(p2*3.32))

    FLOAT BINARY(p1)

    FIXED DECIMAL(p2, q2)

    FLOAT BINARY(p), p = MAX(p1, CEIL(p2*3.32))

    FLOAT BINARY(p)

    p = MAX(p1, CEIL(p2*3.32))

    p = MAX(p1, CEIL(p2*3.32))

    p = MAX(p1, CEIL(p2*3.32))

    FLOAT BINARY(p1)

    FLOAT DECIMAL(p2)

    FLOAT BINARY(p), p = MAX(p1, CEIL(p2*3.32))

    FLOAT BINARY(p)

    p = MAX(p1, CEIL(p2*3.32))

    p = MAX(p1, CEIL(p2*3.32))

    p = MAX(p1, CEIL(p2*3.32))

  • Results of arithmetic operations between two FIXED operands under RULES

    첫 번째 피연산자(p1,q1) 두 번째 피연산자(p2, q2) 거듭제곱에 대한 결과 속성 사칙연산에 대한 결과 속성 덧셈 또는 뺄셈의 정밀도 곱셈 정밀도 나눗셈 정밀도

    FIXED DECIMAL(p1,q1)

    FIXED DECIMAL(p2, q2)

    FLOAT DECIMAL(p), p = MAX(p1, p2)

    FIXED DECIMAL(p, q)

    p = 1+MAX(p1-q1, p2-q2)+q, q = MAX(q1, q2)

    p = 1+p1+p2, q = q1+q2

    p = N, q = N-p1+q1-q2

    FIXED BINARY(p1,q1)

    FIXED BINARY(p2, q2)

    FLOAT BINARY(p), p = MAX(p1, p2)

    FIXED BINARY(p, q)

    p = 1+MAX(p1-q1, p2-q2)+q, q = MAX(q1, q2)

    p = 1+p1+p2, q = q1+q2

    p = M, q = M-p1+q1-q2

    FIXED DECIMAL(p1,q1)

    FIXED BINARY(p2, q2)

    FLOAT BINARY(p), p = MAX( CEIL(p1*3.32), p2)

    FIXED BINARY(p, q)

    p = 1+MAX(r-s, p2-q2)+q, q = MAX(s, q2)

    p = 1+r+p2, q = s+q2

    p = M, q = M-r+s-q2

    FIXED BINARY(p1,q1)

    FIXED DECIMAL(p2, q2)

    FLOAT BINARY(p), p = MAX(p1, CEIL(p2*3.32))

    FIXED BINARY(p, q)

    p = 1+MAX(p1-q1,t-u)+q, q = MAX(s,q1,u)

    p = 1+rp1+t, q = q1+u

    p = M, q = M-p1+q1-u

다음은 위 표에서 있는 위의 표에서 각 문자열의 의미이다. scaling factor는 -128에서 +127 범위에 있어야 한다.

항목 설명

N

FIXED DECIMAL의 최대 정밀도

M

FIXED BINARY의 최대 정밀도

r

1+CEIL(p1*3.32)

s

CEIL(ABS(q1*3.32))*SIGN(q1)

t

1+CEIL(p2*3.32)

u

CEIL(ABS(q2*3.32))*SIGN(q2)

r

1+CEIL(p1*3.32)

다음의 표현식을 예를들어 보자.

A*B+C

연산 A*B가 중간 결과를 얻기 위해서 먼저 수행된다. 표현식의 값은 중간 결과+C 연산을 수행함으로써 얻어진다. PL/I은 어떤 변수에서 속성을 얻는 것과 같은 방식으로 중간 결과의 속성을 얻는다. 결과의 속성은 두 개의 피연산자(또는 전위 연산의 경우에 단일 피연산자)와 포함된 연산자의 속성으로부터 얻을 수 있다. 결과의 속성을 얻는 방법은 Target을 참고한다.

ADD, SUBTRACT, MULTIPLY, DIVIDE 내장함수는 덧셈, 뺄셈, 곱셈, 나눗셈 연산에 대한 구현의 정밀도 규칙을 재정의할 수 있다. FIXED 나눗셈은 overflow되거나 절단될 수 있다.

예를 들어 25+1/3 표현식을 계산한 결과는 정의되지 않으며 최대 구현 값에서 나눗셈의 결과는 정밀도를 정의하기 때문에 FIXEDOVERFLOW 조건이 발생한다. 그러나 25+01/3 표현식은 상수가 정밀도를 가지고 있기 때문에 결과는 25.3333333333333이다.

두 Evaluation의 결과는 다음 표를 통해 확인할 수 있다.

항목 정밀도 결과

1

3

1/3

25

25+1/3

(1,0)

(1,0)

(15,14)

(2,0)

(15,14)

1

3

0.33333333333333

25

정의되지 않음

01

3

01/3

25

25+01/3

(2,0)

(1,0)

(15,13)

(2,0)

(15,13)

01

3

00.3333333333333

25

25.3333333333333

4.2. 비트 연산

비트 연산(Bit operations)은 다음과 같은 연산자들 중에서 하나를 갖는 피연산자들의 조합으로 나타낼 수 있다.

  • 연산자

    ^  &  |

not/exclusive-or 부호(^)는 전위나 중위 연산자로 사용될 수 없다. and 부호(&)와 or 부호(|)는 오로지 전위 연산자로 사용될 수 있다. 연산자는 불(Boolean) 대수에서 동일한 기능을 갖는다. 비트 연산의 피연산자들은 필요하면 연산이 수행되기 전에 비트 문자열로 변환된다. 만약 중위 연산의 피연산자가 같은 길이를 가지고 있지 않다면, 더 짧은 쪽에 '0’B 값이 오른쪽에 채워진다. 비트 연산의 결과는 피연산자의 길이와 동일한 길이의 비트 문자열이 된다. 비트 연산은 비트 단위로 수행된다.

다음 표는 각 연산자에 대해 비트 위치에 대한 결과를 보여준다.

A ^A B ^B A&B A|B A^B

1

0

1

0

1

1

0

1

0

0

1

0

1

1

0

1

1

0

0

1

1

0

1

0

1

0

0

0

다음 표는 비트 연산의 예를 보여준다.

피연산자와 값 연산 결과

A = '010111’B,

B = '111111’B,

C = '110’B,

D = 5

^A

'101000’B

^C

'001’B

A|B

'111111’B

A^B

'101000’B

A^C

'100111’B

C&B

'110000’B

C|B

'111111’B

A|(^C)

'011111’B

^((^C)|(^B))

'110111’B

4.3. 비교 연산

비교 연산(Comparison operations)은 다음과 같은 연산자들 중에서 하나를 갖는 피연산자들의 조합으로 나타낼 수 있다.

  • 연산자

    <  ^<  <=  =   ^= 또는 <>  >=  >  ^>

비교 연산의 결과는 항상 길이가 1인 비트 문자열이다. 만약 관계가 사실이면 값은 '1’B이고, 거짓이면 값은 '0’B이다.

비교는 다음과 같이 정의할 수 있다.

구분 설명

Algebraic

대수적은 산술 형태로 코드화된 부호를 지닌 산술 값의 비교이다.

피연산자들이 base나 scale, precision, mode가 다르면, 산술 연산변환과 유사한 방식으로 변환된다. 숫자 문자 데이터는 비교하기 전에 부호화 산술 데이터로 변환된다.

=, ^=, <>연산자만 복잡한 숫자인 피연산자들의 비교에 사용될 수 있다.

Character

문자는 바이트의 이진 값에 따라서 왼쪽에서 오른쪽으로 문자 단위로 비교한다.

Bit

비트는 이진수의 왼쪽에서 오른쪽으로 비트 단위로 비교한다.

Graphic

그래픽은 DBCS 문자들을 왼쪽에서 오른쪽으로 기호 단위로 비교한다. 비교는 DBCS 문자의 이진 값을 기반으로 한다.

Widechar

바이트 간의 바이너리 값에 따라서 문자들을 왼쪽에서 오른쪽으로 확장문자 단위로 비교한다.

Pointer and offset data

관계 연산자들을 포함하는 포인터와 오프셋 값을 비교한다. 발생할 수 있는 변환은 오로지 오프셋이 포인터의 변환이다.

전산 데이터 비교의 피연산자가 비교의 다른 타입에 적합한 데이터 타입을 가지면, 낮은 우선순위의 피연산자가 다른 피연산자의 비교 타입에 적합하도록 변환된다.

비교 유형의 우선순위는 다음과 같다.

Algebraic > Widechar > Graphic > Character > Bit

예를 들어 만약 비트 문자열이 FIXED DECIMAL 값과 비교되는 경우 비트 문자열이 decimal 값의 대수 비교를 위해 FIXED BINARY로 변환된다. decimal 값은 또한 FIXED BINARY 값으로 변환된다. 동일하지 않은 길이의 문자열 비교에서 더 짧은 문자열은 오른쪽에 패딩된다.

이 패딩은 다음과 같이 구성된다.

  • 문자 비교에서는 공백

  • 비트 비교에서는 '0’B

  • 그래픽 비교에서는 그래픽 (DBCS) 공백

  • 확장문자 비교에서는 확장 문자 공백 ('0020’wx)

비교 연산의 예로, X=A=B 인 대입문에서 첫 번째 등호는 대입 기호이고, 두 번째 등호는 비교 연산자이다. 따라서, A와 B가 같다면 '1’B 값이 X에 할당되고 그렇지 않으면 '0’B 값이 할당된다.

4.4. 접합 연산

접합 연산(Concatenation operations)은 접합 중위 연산자를 가진 피연산자의 결합을 나타낸다.

  • 연산자

    ||

접합은 피연산자 왼쪽의 마지막 문자나 비트, 그래픽, 확장문자가 피연산자 오른쪽의 첫 번째 문자 또는 비트, 그래픽, 확장문자가 바로 앞에오는 방법으로 피연산자들이 어떤 것도 사이에 오지않고 결합되는 것을 나타낸다.

접합 연산은 접합이 문자열(문자나 비트,그래픽,확장문자)에서만 수행될 수 있기 때문에 문자 타입으로 변환을 유발할 수 있다.

4.5. 연산의 결합

연산의 다른 타입은 같은 연산식 내에서 결합될 수 있다.

다음의 예를 살펴본다. 표현식 내에서 각 연산은 연산이 수행되기 전에 발생하는 필요한 데이터 변환에 따라 그 연산의 종류에 대한 규칙에 따라서 계산된다.

 DCL RESULT BIT(3),
     A DECIMAL FIXED(1),
     B BINARY FIXED(3),
     C CHARACTER(2),
     D BIT(4);
 RESULT = A + B < C & D;
  • A의 decimal 값은 binary로 변환된다.

  • A와 B를 더하면서 binary 덧셈이 수행된다.

  • binary 결과가 변환된 C의 binary 값과 비교된다.

  • 비교된 비트 결과는 비트 변수 D의 길이로 확장되고, & 연산이 수행된다.

  • 길이가 4인 비트 문자열인 & 연산의 결과는 변환은 없지만 오른쪽이 잘라져서 RESULT에 할당된다.

이 예는 왼쪽에서 오른쪽으로 연산끼리 계산된다. Evaluation 순서는 표현식에서 나타나는 연산자의 우선순위에 따라 달라진다.

연산자 우선순위

표현식의 Evaluation에서 연산자의 우선순위는 다음의 표를 참고한다.

우선순위 연산자 연산 형태 비고

1

**

산술

결과는 코드화된 산술 형태이다.

전위 +,-

산술

피연산자가 코드화된 산술 형태에 있는 경우 변환은 필요하지 않다. 하지만, 피연산자가 fixed-point decimal 수인 CHARACTER 문자열이나 숫자 문자(PICTURE)의 표현이면 FIXED DECIMAL로 변환된다.

또는 피연산자가 floating-point decimal 수인 숫자 문자(PICTURE)의 표현이면 FLOAT DECIMAL로 변환된다. 만약 피연산자가 비트 문자열이면 FIXED BINARY로 변환된다.

전위 ^

비트 문자열

BIT가 아닌 모든 데이터는 BIT로 변환된다.

2

*, /

산술

결과는 코드화된 산술 형태이다.

3

중위 +.-

산술

결과는 코드화된 산술 형태이다.

4

||

접합

컴파일러 옵션 RULES를 참고한다.

5

<, ^<, <=, =, ^= 또는 <>, >=, >, ^>

비교

결과는 항상 '1’B 아니면 '0’B이다.

6

&

비트 문자열

BIT가 아닌 모든 데이터는 BIT로 변환된다.

7

|

비트 문자열

BIT가 아닌 모든 데이터는 BIT로 변환된다.

중위 ^

비트 문자열

BIT가 아닌 모든 데이터는 BIT로 변환된다.

연산자는 가장 높은 우선순위 1부터 가장 낮은 순위 7의 순서로 나열되어 있다. 같은 우선순위 그룹에 있는 모든 연산자들은 같은 우선순위를 갖는다.

우선순위 그룹 1의 경우 만약 두 개 이상의 연산자가 표현식에 나타난다면, 우선순위의 순서는 표현식 내에서 오른쪽에서 왼쪽이다. 즉, 가장 오른쪽의 지수나 전위 연산자는 가장 높은 우선순위를 가지고, 그 다음 순서대로 우선순위를 갖는다. 모든 다른 우선순위의 그룹은 만약 같은 우선순위 그룹에서 두 개 이상의 연산자가 표현식에 나타난다면, 우선순위나 순서는 표현식 내에서 왼쪽에서 오른쪽의 순서이다.

다음의 표현식1을 Evaluation의 순서를 괄호로 표현해 보면 표현식2와 같다.

  • 표현식1

    A+B<C&D
  • 표현식2

    (((A+B)<C)&D)

따라서 Evaluation 순서와 결과는 괄호의 사용에 따라 바뀔 수 있다. 괄호 안에 표현식들은 주변의 연산자들과의 관계를 고려하기 전에 하나의 값으로 먼저 계산된다.

5. 배열 표현식

배열 표현식은 다음과 같은 경우에 허용된다.

  • 여러 개의 대입이나 하나의 대입에서 소스

  • ALL, ANY, SUM 내장함수에서 인자

  • 사용자의 프러시저와 함수에 대한 인자

  • PUT LIST와 PUT EDIT 문에서 데이터 목록의 항목

배열 표현식의 Evaluation은 배열의 결과를 얻을 수 있다. 배열에 수행되는 모든 작업은 행 중심의 순서로 요소별로 수행된다. 그러므로 배열 표현식에서 언급되는 모든 배열은 동일한 차원의 수를 가져야 하고 각 차원은 동일한 범위를 가져야 한다. 배열 표현식은 연산자, 요소의 변수, 상수를 포함할 수 있다. 연산들을 결합하고 피연산자의 데이터 변환에 대한 규칙은 요소 연산에 대한 규칙과 동일하다.

5.1. 전위 연산자와 배열

배열에 전위 연산자(Prefix operators)의 연산은 동일한 범위를 갖는 배열을 생성한다.

만약 배열 A가 다음과 같다면,

5   7  -9
3  -4   6

그 때, 배열 -A는 다음과 같다.

-5  -7   9
-3   4  -6

5.2. 이항 연산자와 배열

하나의 피연산자로 배열 변수를 포함하는 중위 연산은 다른 피연산자와 같은 또다른 배열이나 요소를 가질 수 있다.

  • Array-and-element operations

    요소, 배열 및 중위 연산자를 갖는 표현식의 결과는 원래 배열과 동일한 범위를 갖는 배열이 된다. 결과의 배열에서 각 요소는 각각 대응하는 원래 배열의 요소와 하나의 요소의 연산의 결과이다.

    배열 A가 다음과 같다고 가정한다.

    5   7  -9
    3  -4   6

    배열 A*2는 다음과 같다.

    10  14  -18
    6   -8   12

    4>A에 대한 결과는 길이가 1인 비트 문자열의 배열이 된다.

    0   0   1
    1   1   0

    array-element 연산에서 요소는 동일한 배열의 요소가 될 수 있다. 즉, 다음과 같은 대입문이 가능하다.

    배열 A는 위에서 언급한 값과 같을때 "A=A * A(1,1);"의 결과는 다음과 같다.

    25   35  -45
    15  -20   30
  • Array-and-array operations

    중위 연산자의 두 피연산자가 배열이면, 그 배열은 차원의 수가 동일해야 하며, 일치하는 차원은 동일한 범위(lower bounds and upper bounds)를 가져야 한다. 결과는 원래의 배열과 동일한 범위를 갖는 배열이 된다. 연산은 원래의 두 배열의 일치하는 요소에 따라 수행된다.

    배열 A가 다음과 같다고 가정한다.

    5  7  9
    3  4  6

    배열 B가 다음과 같다고 가정한다.

    2  4  8
    8  3  1

    배열 A+B는 다음과 같다.

    7  11  17
    11   7   7

    배열 A*B는 다음과 같다.

    10  28  72
    24  12   6

    A>B에 대한 결과는 길이가 1인 비트 문자열의 배열이 된다.

    1   1   1
    0   1   1

6. 구조체 표현식

구조체 참조와 달리 구조체 표현식은 오로지 관련된 매개 변수가 상수 extent를 가지면 프러시저나 함수의 인자로 사용되고, 대입에서 사용된다. 구조체 표현식에 나타나는 모든 구조 변수들은 동일한 구조를 가지고 있어야 한다.

동일한 구조는 다음을 의미한다.

  • 구조는 동일한 보조 구조와 포함된 요소와 배열의 동일한 수를 가져야 한다.

  • 구조 안에 있는 요소와 배열의 위치는 동일해야 한다.

  • 일치하는 위치에서 배열은 동일한 동일한 범위를 가져야 한다.

7. 제한된 표현식

제한된 표현식(Restricted expression)은 PL/I이 상수를 요구하는 곳에 사용될 수 있다. 즉, 제한된 표현식은 컴파일 타임에 계산되어 상수로 사용되는 값의 표현식이다.

예를 들어 다음과 같은 경우에 요구되는 상수를 정의하기 위해 사용할 수 있다.

  • static, parameter, based 선언에서 Extents

  • Entry 선언에서 Extents

  • Static 초기화에 사용되는 반복 인자와 값

제한된 표현식은 일반적인 표현식과 동일하지만, 다음과 같이 피연산자에게 요구되는 제한이 있다.

  • 상수 또는 이름상수여야 한다. 이름 상수는 사용되기 전에 선언되어야 한다.

  • 제한된 표현식이 적용되는 내장함수여야 한다. 적용되는 내장함수에 대해서는 내장함수(Built-in Function)를 참고한다.