【PL/I学習|初心者向け】メインフレーム開発の必須スキル!PL/Iプリプロセッサにおける「引用符の除去(QUOTE)」を理解しよう

1. 導入:なぜ引用符の処理が重要なのか

メインフレームでPL/I開発を行っていると、マクロを使ってコードを自動生成する場面に出くわします。その際、最も頭を悩ませるのが「引用符(シングルクォーテーション)」の扱いです。「文字として出力したいのか」「変数として展開したいのか」という制御をミスすると、コンパイル時に「ステートメントが不正です」というエラーが頻発します。このQUOTE機能は、複雑な文字列操作を正しく行い、意図通りのコードを生成するための必須技術です。

2. 基礎知識:PL/Iプリプロセッサとは

PL/Iにおけるプリプロセッサは、コンパイルの「前段階」でソースコードを書き換えるツールです。現代のプログラミング言語のように自動で型を判定してくれるわけではなく、物理的なテキストの切り貼りを行っています。
「QUOTE」という処理は、マクロ変数に含まれる文字列から、囲んでいる引用符を取り除いたり、あるいは付与したりする操作です。これが正しく制御できていないと、生成されたコードが文法的に崩れてしまい、機械的に処理を終えることができません。

3. 実装・解決策:引用符を操る考え方

引用符の制御には、主にマクロ関数である「QUOTE」や「UNQUOTE」を使用します。
・QUOTE: 文字列を引用符で囲む。
・UNQUOTE: 引用符で囲まれた文字列から、外側の引用符を取り除く。
これらを使い分けることで、例えば「特定のパス名」や「動的なメッセージ」を、プログラムが期待する形式(’文字列’)に正確に整形することができます。

4. サンプルプログラム

以下のコードは、マクロ変数内の文字列から引用符を一度取り除き、再度安全に組み立てる例です。

/ マクロプロセッサによる引用符の制御例 /
%DCL MY_VAR CHAR;
%MY_VAR = ”’SAMPLE_DATA”’; / マクロ変数に引用符付きで代入 /

/ UNQUOTEを用いて引用符を除去し、処理後に再構築する /
%DCL NEW_VAR CHAR;
%NEW_VAR = QUOTE(UNQUOTE(MY_VAR));

/ 以下のコードが生成されます /
DCL DATA_STR CHAR(20) INIT(MY_VAR);
/ 展開結果:DCL DATA_STR CHAR(20) INIT(‘SAMPLE_DATA’); /

/
解説:
1. UNQUOTEで ‘SAMPLE_DATA’ から ‘ を剥がして SAMPLE_DATA にします。
2. QUOTEで再度 ‘ で囲み、コンパイル時に文字列リテラルとして認識させます。
/

5. 応用・注意点:現場で陥りやすい罠

現場で最も多いトラブルは「引用符の重ね合わせ」です。PL/Iでは、文字列の中に引用符を含めたい場合、シングルクォーテーションを2つ重ねて(”)記述する必要があります。
プリプロセッサを通す際、マクロ展開の段階で引用符が二重に変換されているのか、そのまま出力されているのかを、コンパイラのリスト出力(SYSINの展開結果)で必ず確認してください。

また、複雑なコード生成を行う際は、一度「%PUT」文を使って、プリプロセス後のコードをログに出力させるのが定石です。いきなりコンパイルを通そうとせず、生成されたテキストが人間から見て正しいかを確認する癖をつけるだけで、デバッグ時間は劇的に短縮されます。

コメント

タイトルとURLをコピーしました