【PL/I学習|実務向け】PL/Iにおけるプリプロセッサの落とし穴:マクロ・キャラクタ「%」の制約と回避策

1. 導入

PL/Iで開発を行っている際、ソースコードの解析段階で不可解なコンパイルエラーに遭遇したことはないでしょうか。特に「%」記号が含まれるコードは、プリプロセッサの仕様により、意図しない解釈をされることがあります。本記事では、PL/Iにおけるマクロ・キャラクタ「%」の制約と、実務で安全に演算や文字列処理を行うための実装テクニックを解説します。

2. 基礎知識

PL/Iのコンパイラは、ソースコードを読み込む際、先頭に「%」が付いた記述を「プリプロセッサ文(コンパイル時実行命令)」として認識します。例えば、`%INCLUDE` や `%IF` などがこれに該当します。
問題は、プリプロセッサがソースコード全体をスキャンする際、「%」を見つけると、それが演算子(モジュロ)なのか、プリプロセッサ命令の開始なのかを区別しようとすることです。文字列リテラル内であれば問題ありませんが、コードの途中で唐突に「%」を記述すると、コンパイラはそれを「プリプロセッサ命令の不完全な構文」と見なし、スキャナエラーを発生させます。

3. 実装/解決策

PL/Iにおいて剰余(割り算の余り)を求める場合は、記号の「%」ではなく、組み込み関数の「MOD」を使用するのが標準です。また、SQLのLIKE演算子などで「%」をワイルドカードとして使う場合は、必ず文字列リテラルとして括ることで、プリプロセッサによる誤解釈を確実に回避できます。

4. サンプルプログラム

以下は、剰余の計算とSQL的なパターンマッチングを安全に行うための実装例です。

/ サンプルコード:安全な演算と文字列操作 /
PROCEDURE OPTIONS(MAIN);

DCL A FIXED BIN(15) INIT(10);
DCL B FIXED BIN(15) INIT(3);
DCL RESULT FIXED BIN(15);
DCL PATTERN CHAR(10) INIT(‘%ID%’); / 文字列リテラル内なら安全 /

/ 誤:RESULT = A % B; <- コンパイルエラーになる / / 正:MOD関数を使用する / RESULT = MOD(A, B); PUT SKIP LIST('剰余の結果は: ', RESULT); PUT SKIP LIST('検索パターンは: ', PATTERN); END;

5. 応用・注意点

現代の言語(JavaやC++など)からPL/Iへ移行する際、最も注意すべきは「癖」です。Javaでは `a % b` と書くのが当たり前ですが、PL/Iではこれが致命的なエラーになります。
また、SQLを埋め込みSQL(EXEC SQL)として記述する場合、文字列内の「%」はSQL側の処理対象となるためプリプロセッサは無視してくれますが、ホスト変数と連結して動的にパターンを生成する際は注意が必要です。文字列の途中に `%` を含める処理を行う際は、必ず明示的に文字リテラルとして定義し、プリプロセッサのスコープ外で安全に運用することを徹底してください。「%はプリプロセッサの特権記号である」という意識を持つことが、安定したソースコード管理の第一歩です。

コメント

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