PL /I プリプロセッサは、PL/Iコンピュータプログラミング言語のプリプロセッサです。プリプロセッサは、完全な PL/I 言語のサブセットを解釈して、ソース ファイルのインクルード、条件付きコンパイル、およびマクロの展開を実行します。
プリプロセッサ言語には、プリプロセッサ ステートメントとプリプロセッサ プロシージャの先頭にパーセント記号( ) が付いた PL/I のような構文があります。コンパイラ リスト%の書式設定コマンドを提供するリスト制御ステートメントは、通常、プリプロセッサ ステートメントと見なされ、 で始まります。プリプロセッサ ステートメントは、入力テキストに埋め込まれ、入力テキストに対して操作されます。入力テキストは通常、PL/I プログラムですが、PL/I の文法に依存しないため、プリプロセッサを独立して使用して、他の種類のテキスト ファイルを処理することもできます。
%
プリプロセッサは標準 PL/I の一部として指定されていませんが、ほとんどの PL/I 実装は IBM プリプロセッサの言語を受け入れます。
ファイルを含める
プリプロセッサ%INCLUDEステートメントは、プリプロセッサ ディレクティブを含む可能性のある別のファイルのテキストをインクルードするために使用されます。最新の IBM コンパイラーには、%XINCLUDE指定されたファイルがまだインクルードされていない場合にのみインクルードする効果を持つディレクティブも用意されています。
インクルードするファイルの名前がプリプロセッサ式によって指定される点を除いて%INSCAN、%XINSCAN同様に動作します。
リストコントロール
リスト制御ステートメントは、プリプロセッサによって生成されたリストとコンパイラによって生成されたリストの両方をフォーマットするための指示を提供します。
%PRINT;次のテキストのリストの印刷を開始または再開します。%NOPRINT;次のテキストのリストの印刷を抑制します。%PAGE;リストに新しいページが開始されます。%SKIP [(n)];リスト内のn行をスキップします。nを省略すると、デフォルトは 1 行になります。%PUSH、プッシュダウン スタック上の/%POPの現在のステータスをそれぞれ保存および復元し、それを復元します。%PRINT%NOPRINT
プリプロセッサ操作
プリプロセッサは、入力テキストをスキャンし、宣言されたプリプロセッサ名(プリプロセッサ識別子とも呼ばれる) を認識することによって動作します。テキストは、プリプロセッサ名が現在の値に置き換えられた状態でプリプロセッサ出力にコピーされます。名前は、プリプロセッサ プロシージャ(マクロ)の呼び出しを表す場合があります。置換テキストは、追加の置換を行うためにプリプロセッサによって再スキャンされる場合があります。
プリプロセッサのデータ型
CHARACTERプリプロセッサ データは、 、最大長のない文字列、またはFIXED5 桁までの 10 進数の整数として宣言できます。プリプロセッサ組み込みは、プリプロセッサ データに対して動作する定義済みプロシージャです。プリプロセッサ式は、プリプロセッサ名、プリプロセッサ プロシージャまたは組み込みへの参照、および 10 進数または文字定数のみで構成される式です。変数はありませんがBIT、BIT比較によって結果を得ることができます。 の式は%IFと評価されますBIT。累乗を除くすべての PL/I 演算子を使用できます。
プリプロセッサステートメント
%DECLARECHARACTERまたは のいずれかの識別子をプリプロセッサ変数として確立しますFIXED。- %assignment はプリプロセッサ識別子に値を割り当てます。
%ACTIVATEプリプロセッサ識別子をアクティブにします。つまり、入力テキスト内で検出されたときに置換対象になります。%DEACTIVATEプリプロセッサを置換の対象から外します。%DOプリプロセッサDOグループの先頭に、ステートメントをグループ化し、反復を指定するために使用されます。プリプロセッサDOグループには、プリプロセッサ ステートメントと入力テキストの任意の組み合わせを含めることができます。%PROCEDUREプリプロセッサ プロシージャの先頭に、入力テキスト内で名前が見つかった場合に値を返すマクロとして機能するプリプロセッサ ステートメントのセットが置かれます。%SELECTプリプロセッサSELECTグループの先頭になります。%ENDプリプロセッサDO-group、SELECT-group、またはプリプロセッサ プロシージャを終了します。%GOTO(または%GO TO) は、プリプロセッサが指定されたプリプロセッサ ラベル (プリプロセッサ ステートメントまたは入力テキスト内の任意のポイント) でスキャンを続行するようにします。%IFプリプロセッサ式の値に応じてプリプロセッサスキャンのフローを制御します。
%IF プリプロセッサ式 %THEN プリプロセッサユニット1 %ELSE プリプロセッサユニット2
プリプロセッサ ユニットは、単一のプリプロセッサ ステートメントまたはプリプロセッサDOグループにすることができます。
%ITERATE%END制御をプリプロセッサグループの に渡しDO、現在の反復を終了し、必要に応じて次の反復を開始します。%LEAVEを含むプリプロセッサDOグループの残りの反復を終了し、制御を に渡します%END。%NOTEユーザー指定のプリプロセッサ診断メッセージを生成します。%nullは、オプションのステートメント ラベルとセミコロン( )のみで構成されるプリプロセッサ ステートメントです;。これは何も行いませんが、必須のステートメントが必要ない場合のプレースホルダーとして機能します。%REPLACE名前を文字または固定式ですぐに置き換えることができます。名前は宣言されたプリプロセッサ識別子である必要はありません。
プリプロセッサ手順
プリプロセッサ プロシージャは、プリプロセッサによって実行されるサブルーチンです。プロシージャは%PROCEDUREおよび%ENDステートメントで区切られ、先頭の を除くプリプロセッサ ステートメントのみを含めることができます。これは、オープン コード、プリプロセッサ プロシージャの外部、または別のプリプロセッサ プロシージャから%関数参照として呼び出され、または値を返します。プロシージャがオープン コードから呼び出される場合、引数は名前で渡されます。つまり、引数はコンマまたは右括弧で区切られた文字列として解釈され、先頭、末尾、または埋め込まれた空白はすべて意味を持ち、引数の一部と見なされます。[1] : pp.508–509 CHARACTERFIXED
プリプロセッサ組み込み
これらはIBMのPL/I for MVSおよびVMコンパイラ用の組み込み関数です。[2] : pp.404–406 さまざまなPL/Iコンパイラのプリプロセッサ間で提供される組み込み関数には大きな違いがある場合があります。
COMPILETIME— コンパイル日時を文字列として返します。たとえば、2012 年 9 月 15 日午後 3 時 30 分 (現地時間) の場合は、「15 SEP 12 15:30:00」となります。COUNTERCOUNTER— 最初の呼び出しでは「00001」となり、その後の呼び出しごとに 1 ずつ増加する数値を含む文字列を返します。INDEX— PL/I 組み込みと同じですINDEX。LENGTH— PL/I 組み込みと同じですLENGTH。PARMSET—このプリプロセッサ プロシージャへの現在の呼び出しで引数が設定されている場合はPARMSET(p)を返し、そうでない場合は を返します。'1'bp'0'bSUBSTR— PL/I 組み込みと同じですSUBSTR。
例
IBM PL/I for OS/2 の次の例は、プリプロセッサ プロシージャを使用して PL/I 用の C のような書き込みステートメントを実装する方法を示しています。[3] このプロシージャは、ステートメントをコーディングすることによって呼び出されます。Byte_countuwrite file(filename) from(varying_string) count(byte_count); はオプションであり、省略した場合はvarying_stringの長さにデフォルト設定されます。
%書き込み:
手順 キー( File 、 From 、 Count ) ;
dcl (ファイル、送信元、カウント、数値、サイズ) char ;
parmset ( File ) & parmset ( From )の場合、それ以外の場合は、次の操作を実行します。
注記( 'FILE と FROM を指定する必要があります!' , 12 ) ;
戻る;
終わり;
if parmset (カウント)
その場合、 Size = 'min(length(' || From || '), ' || Count || ')'となります。
そうでない場合、 Size = 'length(' || From || ')' ;
数値=カウンター() ;
答え( 'do;' ) ;
ans ( 'dcl Count' || Number || ' 固定ビン (15);' )スキップ;
ans ( 'カウント' ||数値|| ' = filewrite('
|| ファイル
|| ', ptradd(addr(' || From || '), 2)'
|| ', ' ||サイズ
|| ');' )スキップ;
ans ( 'end;' )スキップ;
%終わり;
%アクション uwrite ;
このステートメントはuwrite file(file_name) from(var_str) count(64);以下を生成します。
do ;
dcl Count00001 fixed bin ( 15 ) ; Count00001 = filewrite ( file_name , ptradd ( addr ( 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]– これにより、いずれかのユニットがソースに含まれます。%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 ... %END構文でプリプロセッサ手順が復元され、仕様はPL/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年、ロバート・ロジンはプリプロセッサの開発について論じた2つの論文[8] [9]を発表しました。この開発は、同年初めの「 SHARE XXVI Memo」とマーク・エルソンの論文に基づいています。ロジンは、 MADを高級言語のマクロプロセッサの唯一の例として挙げています。
参照
参考文献
- ^ IBM Corporation (2005). Enterprise PL/I for z/OS PL/I for AIX WebSphere Developer for zSeries PL/I for Windows 言語リファレンス(PDF)。
- ^ IBM Corporation (1995). IBM PL/I for MVS & VM 言語リファレンス.
- ^ シュツルム、エバーハルト。 「ファイル読み取りとファイル書き込みのための組み込み関数の UIO マクロ」。2012 年1 月 22 日に取得。
- ^ IBM Corporation (1964). NPL技術レポート(PDF) .
- ^ IBM Corporation (1965). IBM Operating System/360 PL/I: 言語仕様 (C28-6571-1) (PDF) .
- ^ IBM Corporation (1966). IBM Operating System/360 PL/I: 言語仕様 (C28-6571-3) (PDF) .
- ^ IBM Corporation (1969). IBM System/360 PL/I リファレンス・マニュアル (C28-8201-3) (PDF) .
- ^ Rosin, Robert (1966 年 8 月). 「PL/I マクロ プロセッサ - 進捗レポート」(PDF) . PL/I 速報(2) . 2013 年1 月 22 日閲覧。
- ^ Rosin, Robert (1966 年 8 月). 「PL/I のマクロ」(PDF) . PL/I 速報(2) . 2013 年1 月 22 日閲覧。
外部リンク
- IBM Corporation (2009 年 10 月)。「エンタープライズ PL/I 言語リファレンス (SC27-1460-09): 第 21 章 プリプロセッサ機能」(PDF) 。2012年1 月 19 日閲覧。
- Micro Focus International plc (2011)。「Micro Focus ドキュメント: Open PL/I マクロ プリプロセッサ」 。2012年2 月 14 日閲覧。
- Kednos Enterprises (2007)。「Kednos PL/I for OpenVMS Systems リファレンス マニュアル: 第 10 章 プリプロセッサ」 。2012年2 月 14 日閲覧。
- Peter Flass (2010)。「PL/I プリプロセッサ Wiki」 。2017年 12 月 6 日閲覧。プリプロセッサ機能の比較
