RPG

467. フリー・フォーマット内では予約語は使えない

IBM i以外の開発言語ではコンパイラーが予め使うことになっている、
予約語という決められた用語があってユーザーの変数名としては
使用できないことになっている。

しかし RPGでは予約語の制限はほとんどなく
自由にどのようなフィールド名やタグ名なども定義して
使用することができる。
ただしILE-RPGのフリー・フォーマット内では予約語に制限がある。
変数名(=フィールド名)としてRPGの命令語を変数の名前として
使用することはできない。
予約語を使用してコンパイルするとコンパイル・エラーが
予約語が使用されていると指摘はせずに予約語をRPG命令と
解釈した上でのコンパイル・エラーを発生させてしまうので
開発者はなかなか自分が予約語を使用してしまったために
エラーが発生しているとは気づかないことが多い。
例えば

/FREE
   315    DOW (POS = %SCAN(%TRIMR(FLD13):SELECT)) > 0;                             
 5761WDS V6R1M0  080215 RN        IBM ILE RPG             V.PANEL/CRTSQLPRD        
 行    <----------------------  ソースの仕様 ------------------------------------><
 番号  ....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8.
   316       SELECT = %SUBST(SELECT:1:POS-1) + %TRIMR(PNO) +                       
======>             A                                                              
*RNF5507 30 A      030600   フリー・フォーム仕様の終わりにセミコロンが指定されてい 
                            ない。                                                 
   317                %SUBST(SELECT:POS+ LEN + 1);                                 
/END-FREE

[解説]

これは正しくセミコロン : を付加しているのにコンパイラーは
「セミコロンが指定されていない」とのエラーを送出しているが真の原因は
SELECT という予約語を変数名として使用してしまっているからである。
これを SELECT_ などに変更するとコンパイル・エラーはなくなるのだが
なかなか予約語を使用してしまっていることが原因であるとは気づきにくい。
予約語の拡張として付加する特殊文字は _ (=アンタースコア)が適切である。
文字 ¥(=円記号) は通過記号であるのでRPGソースでは絶対に使わないようにすべきである。

[予約語]

予約語とはコンパイラー自身が使う特殊用語として事前に割り当てられている用語のことである。
ユーザーは決められた予約語と同じ名前のフィールド名を定義することはできない。
RPGの場合はIBMが入門者でも使えるようにしているために予約語はないが
他の開発言語では予約語が数多く存在していて言語によって予約語の内容と種類は異なる。
RPGでは予約語などないと思っていたがフリー・フーマットでは予約語の制限が初めて現れたのである。

[通貨記号]

通貨記号とはお金の単位を示す文字のことである。日本では通貨記号はもちろん「¥」マークであるが
これはWindowsでは C:¥ とようにディレクトリーの区切りとして使われているが
英語環境では「\」(=バック・スラッシュ)である。フィールド名に「¥」を使うとPCにRPGソースを
タウンロードすると「\」に変換されてまう。STRPCCMD でも同じことが起こる。
このようにRPGソース内で「¥」を使うと余計なトラブルの元になってしまうので十分な知識のないままに
通貨記号を使うことは絶対に避けるべきである。