PL/I 프리프로세서

PL/I preprocessor

PL/I 프리프로세서는 PL/I 컴퓨터 프로그래밍 언어의 프리프로세서입니다.프리프로세서는 완전한 PL/I 언어의 서브셋을 해석하여 소스 파일 포함, 조건부 컴파일매크로 확장을 수행합니다.

프리프로세서 언어에는 preprocessor 문장과 preprocessor procedure 앞에 percent 기호(%)가 붙은 PL/I와 같은 구문이 있습니다.%listing-control 문은 컴파일러 목록용 포맷명령어를 제공합니다.일반적으로 listing-control 문은 preprocessor 명령어로 간주되며 선두는 다음과 같습니다.%프리프로세서 스테이트먼트는 입력 텍스트에 삽입되어 동작합니다.입력 텍스트는 보통 PL/I 프로그램이지만 PL/I의 문법에 의존하지 않기 때문에 프리프로세서는 다른 종류의 텍스트 파일을 처리하는 데 독립적으로 사용할 수도 있습니다.

프리프로세서는 표준 PL/I의 일부로 지정되어 있지 않지만, 대부분의 PL/I 구현에서는 IBM 프리프로세서의 언어를 사용할 수 있습니다.

파일 포함

%INCLUDEpreprocessor 문은 다른 파일의 텍스트를 포함하기 위해 사용됩니다.이 파일에는 프리프로세서 디렉티브도 포함될 수 있습니다.최신 IBM 컴파일러는 또한%XINCLUDEdirective. 지정한 파일이 아직 포함되지 않은 경우에만 포함하는 효과가 있습니다. %INSCAN그리고.%XINSCAN포함할 파일의 이름이 프리프로세서 식에 의해 지정되어 있는 것을 제외하고, 마찬가지로 동작합니다.

리스트 관리

listing control 문은 프리프로세서에 의해 생성된 목록과 컴파일러에 의해 생성된 목록을 모두 포맷하기 위한 지침을 제공합니다.

  • %PRINT;에 의해, 다음의 텍스트의 리스트의 인쇄가 개시 또는 재개됩니다.
  • %NOPRINT;는, 다음의 텍스트의 리스트의 인쇄를 억제합니다.
  • %PAGE;를 지정하면 목록에서 새 페이지가 시작됩니다.
  • %SKIP [(n)];원인들n목록에서 건너뛸 행입니다.한다면n생략되어 있습니다.기본값은 1행입니다.
  • %PUSH,%POP현재 상태를 저장 및 복원하다%PRINT/%NOPRINT각각 푸시다운 스택과 restore를 실행합니다.

프리프로세서 동작

프리프로세서는 입력 텍스트를 스캔하여 선언된 프리프로세서 이름(일명 프리프로세서 ID)을 인식함으로써 동작합니다.텍스트는 프리프로세서 출력에 복사되며 프리프로세서 이름은 현재 값으로 대체됩니다.이름은 프리프로세서 프로시저(매크로)에 대한 콜을 나타낼 수 있습니다.치환 텍스트는 프리프로세서에 의해 재스캔되어 추가 치환될 수 있습니다.

프리프로세서 데이터형

프리프로세서 데이터는 다음과 같이 선언될 수 있습니다.CHARACTER, 최대 길이가 없는 문자열 또는FIXED소수점 이하 5자리까지의 정수.프리프로세서 빌트인은 프리프로세서 데이터로 동작하는 사전 정의된 절차입니다.프리프로세서 표현식은 프리프로세서 이름, 프리프로세서 프로시저 또는 빌트인에 대한 참조 및 10진수 또는 문자 상수로만 구성된 표현식입니다.없다BIT변수입니다만,BIT비교함으로써 결과를 얻을 수 있다.의 표현%IF까지 평가하다.BIT. 지수를 제외한 모든 PL/I 연산자가 허용됩니다.

프리프로세서의 문

  • %DECLAREID를 프리프로세서 변수로서 확립합니다.CHARACTER또는FIXED.
  • %processor ID에 값을 할당합니다.
  • %ACTIVATE는 프리프로세서 ID를 액티브하게 합니다.즉, 입력 텍스트에서 검출되었을 경우 치환할 수 있습니다.
  • %DEACTIVATE는 프리프로세서를 교환할 수 없게 합니다.
  • %DO프리프로세서의 선두에 있다DO-group. 문을 그룹화하고 반복을 지정하기 위해 사용됩니다.프리프로세서DO-group에는 프리프로세서의 문과 입력 텍스트의 임의의 조합을 포함할 수 있습니다.
  • %PROCEDURE는 입력 텍스트에서 이름이 발견되었을 때 값을 반환하는 매크로로서 기능하는 일련의 프리프로세서스테이트먼트인 프리프로세서프로시저를 선두로 합니다.
  • %SELECTpreprocessor - group을 선두로 합니다.
  • %END프리프로세서를 종료합니다.DO- 그룹,SELECT-group 또는 preprocessor processor procedure.
  • %GOTO(또는%GO TO)는 프리프로세서가 지정된 프리프로세서라벨(프리프로세서문 또는 입력 텍스트의 임의의 포인트)로 스캔을 계속합니다.
  • %IF는 프리프로세서식 값에 따라 프리프로세서스캔의 플로우를 제어합니다.
%IF 프리프로세서 식 %THEN 프리프로세서 유닛1 %ELSE 프리프로세서 유닛2

preprocessor-units는 임의의 단일 preprocessor 스테이트먼트 또는 preprocessor 스테이트먼트입니다.DO- 그룹.

  • %ITERATE에 제어권을 이양하다%END포함 프리프로세서의DO-group, 현재 반복을 종료하고 필요에 따라 다음 반복을 시작합니다.
  • %LEAVE포함된 프리프로세서의 나머지 모든 반복을 종료합니다.DO- 그룹 제어가 에 이전합니다.%END.
  • %NOTE는 사용자 지정 프리프로세서 진단 메시지를 생성합니다.
  • %null는 옵션의 스테이트먼트라벨과 세미콜론으로만 구성된 프리프로세서스테이트먼트입니다.;)는 아무것도 하지 않고, 필요한 문이 필요 없는 플레이스 홀더로서 기능합니다.
  • %REPLACE를 사용하면 문자 또는 고정 표현으로 이름을 즉시 바꿀 수 있습니다.이름은 선언된 프리프로세서 ID일 필요는 없습니다.

프리프로세서 절차

프리프로세서 프로시저는 프리프로세서에 의해 실행되는 서브루틴입니다.순서는 다음과 같이 구분됩니다.%PROCEDURE그리고.%ENDpreprocessor 스테이트먼트만 포함할 수 있으며 선두는 포함할 수 없습니다.%오픈 코드, 프리프로세서 프로시저 외부 또는 다른 프리프로세서 프로시저로부터 함수 참조로서 호출되어 a를 반환합니다.CHARACTER또는FIXEDvalue. 오픈코드에서 프로시저가 호출되면 인수는 이름으로 전달됩니다.즉, 인수는 쉼표 또는 오른쪽 괄호로 구분된 문자열로 해석됩니다. 선행, 후행 또는 포함된 공백은 모두 유의하며 [1]: pp.508–509 인수의 일부로 간주됩니다.

프리프로세서 내장

이는 IBM의 MVS 및 VM [2]: pp.404–406 컴파일러용 PL/I에 내장된 기능입니다.다양한 PL/I 컴파일러의 프리프로세서에 따라 제공되는 빌트인에는 상당한 차이가 있을 수 있습니다.

  • COMPILETIME: 2012년 9월 15일 오후 3시 30분(현지시각)에 "15 SEP 12 15:30:00"와 같은 문자열로 컴파일 날짜와 시간을 반환합니다.
  • COUNTER: 에 대한 첫 번째 콜의 번호 00001을 포함하는 문자열을 반환한다.COUNTER후속 콜마다 1씩 증가합니다.
  • INDEX- PL/I 내장 기능과 동일INDEX.
  • LENGTH- PL/I 내장 기능과 동일LENGTH.
  • PARMSETPARMSET(p)돌아온다'1'b의론이 맞다면p현재 콜에서 이 프리프로세서 프로시저로 설정되어 있지 않은 경우'0'b.
  • SUBSTR- PL/I 내장 기능과 동일SUBSTR.

다음의 IBM PL/I for OS/2 의 예는, 프리프로세서 순서를 사용해 PL/I [3]의 C 라이크 기입문을 실장하는 방법을 나타내고 있습니다.이 프로시저는 문을 코딩하여 호출됩니다.uwrite file(filename) from(varying_string) count(byte_count); Byte_count 는 옵션이며 생략할 경우 디폴트 길이가 됩니다.

 %기입하다:  절차(파일, 시작, 카운트);   dcl(파일, 원본, 개수, 숫자, 크기) 문자;   parmset(File) & parmset(From)의 경우, 그렇지 않은 경우 실행한다.  ('FILE  FROM'을 지정해야 합니다!'), 12;     돌아가다;     끝.;   if parmset(카운트)  그런 다음 크기 = 'min(length from '), 'Count';  그렇지 않으면 크기 = 'length from';   번호 = 카운터();  ans('do;');  ans('DCL 카운트' 번호' 고정 빈(15);') 건너뛰기;  ans('카운트' 번호' = 파일 쓰기)    파일    ' , ptradd ( addr ( ' ) , 2 )     ' , ' 크기    ';' 건너뛰기;  ans('end;') 건너뛰기;   %끝.;  %act uwrite; 

스테이트먼트uwrite file(file_name) from(var_str) count(64);는 다음을 생성합니다.

 do; dcl Count00001 고정빈(15); Count00001 = filewrite(file_name, ptrad(var_str), 2), min(length(var_str, 64); end;

진화

1964년 "NPL"[4]: pp.109–114 에 대한 보고서(당시 PL/I가 호출됨)는 키워드로 식별되는 매크로 절차를 조건으로 함)MACRO는 언어의 완전한 기능을 사용할 수 있습니다.다음 컴파일 시간 문이 열린 코드로 허용되었습니다.

  • %DECLARE– 고정 길이 문자열과 다양한 문자열이 정의되었습니다.
  • %assignment
  • %null statement
  • %IF compile_time_comparison THEN unit [ELSE unit]– 이로 인해 둘 중 하나가 발생합니다.unit소스에 포함되다.
  • %GOTO

이 매뉴얼에 정의된 'NPL'은 구현되지 않았습니다.

1965년 IBM의 PL/I 언어 사양 업데이트는 더 야심찬 프리프로세서 [5]: pp.131–133 언어를 정의했습니다.프리프로세서 절차에 대한 언급은 모두 생략되었습니다.다음 컴파일 시간 문이 지정되었습니다.

  • %DECLARE
  • %assignment
  • %null statement
  • %IF compile_time_comparison THEN GOTO label– 없음ELSE절이 정의되었습니다.
  • %GOTO

이 언어 사양은 다시 구현되지 않았지만 1966년 이 매뉴얼의 개정판으로 현재와 함께 프리프로세서 절차를 복원했습니다.%PROCEDURE ... %ENDPL/I(F)[6]: pp.132–139 [7]: pp.154–162 에 실제로 포함되어 있는 사양에 근접하게 했습니다.고정 길이 문자 변수가 사라졌습니다.추가된 새로운 문장은 다음과 같습니다.

  • %ACTIVATE
  • %DEACTIVATE
  • %DO [preprocessor_variable = preprocessor_expression TO preprocessor_expression [BY preprocessor_expression]]
  • RETURN컴파일 시간 절차에서만 사용할 수 있습니다.
  • %INCLUDE
  • %IF– 그%IF compile_time_comparison %THEN unit [%ELSE unit]복원되었습니다.

1개의 컴파일 타임으로SUBSTR가 추가되었습니다.

또한 1966년에 로버트 로진은 프리프로세서의 개발에 관한 두 개의 기사를[8][9] 발표했다.이 개발은 같은 해 의 「SHARE XXVI 메모」와 Mark Elson의 논문에 근거하고 있습니다.Rosin은 MAD가 고급 언어로 작성된 매크로 프로세서의 유일한 예라고 믿고 있습니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ IBM Corporation (2005). Enterprise PL/I for z/OS PL/I for AIX WebSphere Developer for zSeries PL/I for Windows Language Reference (PDF).
  2. ^ IBM Corporation (1995). IBM PL/I for MVS & VM Language Reference.
  3. ^ Sturm, Eberhard. "UIO-Makros für Builtin-Funktionen fileread und filewrite". Retrieved January 22, 2012.
  4. ^ IBM Corporation (1964). NPL Technical Report (PDF).
  5. ^ IBM Corporation (1965). IBM Operating System/360 PL/I: Language Specifications (C28-6571-1) (PDF).
  6. ^ IBM Corporation (1966). IBM Operating System/360 PL/I: Language Specifications (C28-6571-3) (PDF).
  7. ^ IBM Corporation (1969). IBM System/360 PL/I Reference Manual (C28-8201-3) (PDF).
  8. ^ Rosin, Robert (August 1966). "PL/I Macro Processor - Progress Report" (PDF). PL/I Bulletin (2). Retrieved January 22, 2013.
  9. ^ Rosin, Robert (August 1966). "Macros in PL/I" (PDF). PL/I Bulletin (2). Retrieved January 22, 2013.

외부 링크