はじめに
「珍しい動物」とか「深海魚の秘密」みたいな話が大好きです。以下はそのような路線で見てもらえたら嬉しいです。
2種類の字句解析
プログラム言語はソースを解析するときに、一般的に字句解析⇒構文解析と進みます。COBOLコンパイラは2種類の字句解析を持っています、少し変わりもののコンパイラですね、というのが本記事の趣旨です。
REPLACE文の動き
「COBOLで遊ぼう(2)」で書いたREPLACE文ですが以下を見てください。
009500 WORKING-STORAGE SECTION.
009600 01 A PIC 9 VALUE 4.
009700 01 B PIC 9 VALUE 1.
009800 01 C PIC 9 .
009900 PROCEDURE DIVISION.
010000 COMPUTE C = A+B.
010100 DISPLAY 'C=' C.
010200 REPLACE ==A+B== BY ==B==.
010300 COMPUTE C = A+B.
010400 DISPLAY 'C=' C.
010500 COMPUTE C = A + B.
010600 DISPLAY 'C=' C.
実行結果
C=5
C=1
C=5
COBOLを見慣れていないとわかりにくいかもしれませんが、010300行目はREPLACEされて「COMPUTE C = B.」に変わり、変数CにBの1が代入されます。010500行目は置換されないので「COMPUTE C = A + B.」のままでCには4 + 1の5が入っています。
なお、010000行目はREPLACE文の前なので、置換は起きず「COMPUTE C = A+B.」で結果は5。
たぶん、自然な動作に見えると思います。
実行は「Windows版 Rocket Visual COBOL Personal Edition Version 10.0.0.82 」を使っています。
見た目が違っていても置換される事もある
次に以下のプログラムを動かしてみます。
009800 WORKING-STORAGE SECTION.
009900 01 A PIC X(5) VALUE 'abcde'.
010000 PROCEDURE DIVISION.
010100 DISPLAY A(2:3).
010200 REPLACE ==2:3== BY ==4:==.
010300 DISPLAY A(2:3).
010400 DISPLAY A(2 : 3).
010400行目の : の前後には半角空白が入っています
実行結果
bcd
de
de
今度は結果の2行目と3行目が同じになりました。010400行目の「DISPLAY A(2 : 3)」が2:3で置換されています。
簡単な解説
後者ですがREPLACE文を字句解析するときに==2:3==の部分を"2", ":", "3"と別々の字句と解釈します。そのため、A(2:3)でもA(2 : 3)でも置換されます。
しかし前者の==A+B==はREPLACE文としては"A+B"という字句として解釈します。そのため空白が挟まっている A + B は置換されません。
ただREPLACE文でない字句解析ではA+Bは"A", "+", "B" と分解されます。これは前者のプログラムで010000行目のA+Bが結果5と加算の動作をしている点でわかります。
さいごに
何が言いたいかというとCOBOLはコンパイル時に解釈ルールが違う2種類の字句解析を行うという事です。ちょっと珍獣「かものはし」みたいな感じがしませんか?
本記事はかなり雑な説明になっています。ここでは細かい部分は抜きにして、COBOLの少し変わった動きを楽しんでいただければと思います