0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

COBOLで遊ぼう(4):珍獣「かものはし」

Posted at

はじめに

「珍しい動物」とか「深海魚の秘密」みたいな話が大好きです。以下はそのような路線で見てもらえたら嬉しいです。

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の少し変わった動きを楽しんでいただければと思います

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?