OPEN COBOL生成
FACOM COBOL-G生成
プログラム生成(NEC COBOL85)
WEBで見よう (cobol/cnvcbl85.cgi) 更新日: 2007.6.27
ずいぶんと古くなったので少し変更して見ました。
WEBでCGIとして動作するよう変更しました。
テストした環境は玄箱Pro LINUX でLighttpd とPerl5.8.8
NKFモジュールでしました。
*** 入力 ***
*** 変換後 ***
●玄箱/Proをいじるを参照してください。
COBOL85 プログラム生成 説明書 1999. 10. 13
CNVCBL.PL V1.0 (99.10.12)
Copyright (c) 1993-1999
下村 清
1.概要
プログラム詳細設計を簡単な記号で記述して考えをまとめやすくするように
して、なおかつその記述を利用して COBOL85 言語に変換する。
(COBOL85もどきを作文するようなものです。)
少しは処理手順の論理チェックをしやすくなっていると思います。
とりあえずは COBOL85 で NEC N5200, ACOS 3100 用のものを考えて見ました。
なお、COBOL言語の文法チェック等のエラーチェックは一切行いません。
翻訳対象マシンでの翻訳で行って下さい。
変換は入力された行を論理、妥当性のチェックはほとんどしないで分割、
変換をします。
このプログラムは1行1命令となることはもちろんですがIF、条件入出力
命令で空白で挟まれた#文字で1行を分割して2命令を記述できます。
また、入れ子となった場合はそれ以上が可能です。
IF、条件入出力命令で次の行の一番右にある空白で挟まれた#文字で
行を一端左右に分割する。空白で挟まれた#文字の行がなくなるまで。
IFは左側の命令群を先に、条件入出力命令は右側を先に解析した後その
反対側を解析して条件命令を終わる。なお分割中は命令の解析を行いません
ので右側にはIF、条件入出力命令が書けません。なぜならば空白で挟まれ
た#文字が出てくるからです。
入れ子となった条件命令の行数は一番外側にある条件命令の最終行からはみ
出さないこと。
左右に分割した命令群にはコメントも、領域、画面の定義、<copy<,
>define>, >undefine>, >ifdef>, >endif>, =<.> .. =[?] .. =[*] .. = は
左右に、左側には <?>, /rd/, /wt/, /rw/, /st/, /del/ の条件つきの命令が
書けます。なお、条件繰り返しは条件命令の空白で挟まれた#文字が出てきま
せんが COBOL を生成するときIF命令とラベルをつくりますので記述出来ま
せん。
領域定義は定義した順に各グループにとりまとめて作りますのでどの行に
あってもかまいません。
二重定義、未定義等のチェックは一切行いませんので注意して下さい。
制御文字以外の文字は変換後全て大文字となります。
+----------+ +---------------+ +---------+
| | ----> | jperl5.003 | ---> | COBOL85 |
| 詳細設計 | | jperl5.005 | | ソース |
+----------+ +---------------+ +---------+
|
+------------+
| cnvcbl.pl |
+------------+
動作可能 jperl (Windows95) 5.003, 5.005
(UNIX) 5.003, 5.005 (大丈夫でしょう?)
2.記号の説明
解析は1行単位で行い、フリーフォーマットで記述します。
見やすさの基準から画面に納まる様にします。行先頭文字から最終文字まで
の128桁まで。継続行処理はソースプログラムが見にくくなるので行って
いません。
領域定義の先頭のID、命令の先頭のIDは全て小文字で記述すること。
ID、名前、オプション等の語の間はタブまたは空白をひとつ以上置く
こと。
【定義形式】
領域に関する定義1
セクション名1
処理手続き1
領域に関する定義2
セクション名2
処理手続き2
:
:
領域に関する定義n
セクション名n
処理手続きn
*コメント
;COBOL 記述 : ;の次がBカラム先頭より前方の命令
によりカラムが決定される
セミコロンはピリオドが付く
;− はピリオドなし
(1)領域に関する定義
【LINKAGE SECTION】
.ext * コメント :コメント
.ext ; 定義..... :COBOL記述 ; , ;-の次がAカラム先頭
より始まる様記述する
セミコロンはピリオドが付く
;− はピリオドなし
.ext. 名前 型 :LINKAGE SECTION で記述される外部参照
領域の定義
.ext.. 名前 型 : 02 xxx PIC xxx ....
.ext... 名前 型 : 03 xx PIC xxx ....
.ext=. 名前 型 : 02 xxx REDEFINES xxx
.ext=.. 名前 型 : 03 xxx REDEFINES xxx
【ENVIRONMENT SECTION】
.fd * コメント :コメント
.fd ; 定義..... :COBOL記述 ;, ;- の次がAカラム先頭
より始まる様記述する
セミコロンはピリオドが付く
;− はピリオドなし
.fd ファイル名 アクセス形式 ブロック化定数
”ファイルラベル” デバイス番号
:FD句 ASSIGN句の定義
ファイルのレコード定義は .fd , .f. と対で定義して下さい。
【FILE SECTION】
.f * コメント :コメント
.f ; 定義..... :COBOL記述 ; , ;- の次がAカラム先頭
より始まる様記述する
セミコロンはピリオドが付く
;− はピリオドなし
.f. 名前 型 :ファイルレコード領域名定義
.f.. 名前 型 : 02 xxx PIC xxx ....
.f... 名前 型 : 03 xx PIC xxx ....
.f=. 名前 型 : 02 xxx REDEFINES xxx
.f=.. 名前 型 : 03 xxx REDEFINES xxx
【WORKING-STRAGE SECTION】
.w * コメント :コメント
.w ; 定義..... :COBOL記述 ;, ;- の次がAカラム先頭
より始まる様記述する
セミコロンはピリオドが付く
;− はピリオドなし
.w. 名前 型 [初期値] :01 領域定義
.w.. 名前 型 [初期値] : 02 xxx PIC xxx ....
.w... 名前 型 [初期値] : 03 xx PIC xxx ....
.w=. 名前 型 : 02 xxx REDEFINES xxx
.w=.. 名前 型 : 03 xxx REDEFINES xxx
【SCREEN SECTION】
.s * コメント :コメント
.s ; 定義..... :COBOL記述 ;, ;- の次がAカラム先頭
より始まる様記述する
セミコロンはピリオドが付く
;− はピリオドなし
.s. 名前 [<<行,桁=初期値>> オプション]
:01 画面名定義 文字の表示
.s. 名前 [<<行,桁:型<->領域名>> オプション]
:01 画面名定義 文字の入出力
.s. 名前 [<<行,桁:型<-領域名>> オプション]
:01 画面名定義 文字の出力
.s. 名前 [<<行,桁:型->領域名>> オプション]
:01 画面名定義 文字の入力
.s.. [名前] [<<行,桁....>> オプション]
:02 画面名定義
.s... [名前] [<<行,桁....>> オプション]
:03 画面名定義
.s.... [名前] [<<行,桁....>> オプション]
:04 画面名定義
.s 定義をすると自動的に以下の領域が生成される。
**---------------------------------------------**
** SCREEN WORK AREA DEFINE
**---------------------------------------------**
01 S-C-FUNC-KEY.
02 C-ZIKKOU PIC X(02) VALUE "04".
02 C-ZIDOU PIC X(02) VALUE "00".
02 C-CR PIC X(02) VALUE "01".
02 C-I PIC X(02) VALUE "02".
02 C-II PIC X(02) VALUE "03".
02 C-SKIP PIC X(02) VALUE "06".
02 C-BSKIP PIC X(02) VALUE "09".
02 C-HELP PIC X(02) VALUE "P0".
02 C-PF1 PIC X(02) VALUE "P1".
02 C-PF2 PIC X(02) VALUE "P2".
02 C-PF3 PIC X(02) VALUE "P3".
02 C-PF4 PIC X(02) VALUE "P4".
02 C-PF5 PIC X(02) VALUE "P5".
02 C-PF6 PIC X(02) VALUE "P6".
02 C-PF7 PIC X(02) VALUE "P7".
02 C-PF8 PIC X(02) VALUE "P8".
02 C-PF9 PIC X(02) VALUE "P9".
02 C-PF10 PIC X(02) VALUE "PA".
02 C-PF11 PIC X(02) VALUE "PB".
02 C-PF12 PIC X(02) VALUE "PC".
02 C-PF13 PIC X(02) VALUE "PD".
02 C-PF14 PIC X(02) VALUE "PE".
02 C-PF15 PIC X(02) VALUE "PF".
02 C-PF16 PIC X(02) VALUE "FW".
02 C-PF17 PIC X(02) VALUE "BW".
02 C-PF20 PIC X(02) VALUE "FM".
02 C-PF21 PIC X(02) VALUE "UP".
02 C-PF22 PIC X(02) VALUE "DW".
01 S-W-L-NO-S PIC 9(3) VALUE 1.
01 S-W-L-NO-E PIC 9(3) VALUE 1.
S-C-FUNC-KEY 領域はファンクションキーのステータス
S-W-L-NO-S, S-W-L-NO-E は画面の行クリアの範囲指定で使用
SCREEN SECTION.
SD N-G (画面制御領域)
END STATUS IS GET-ATT
LINE LIN-POS
COLUMN COL-POS
BTAB BTB-POS.
***
01 S-S-C.
02 CLEAR SCREEN. (全画面クリア用)
01 S-L-C.
02 LINE S-W-L-NO-S CLEAR LINE (行クリア用)
TO S-W-L-NO-E.
◎レベル番号:ピリオドと等号の数で決まる。66、88レベルの記述
に関しては .w ;88 xxxx xxxx で記述する
REDEFINES の等号はレベル2以上でかつ、ピリオドの前に
指定すること
◎名前:COBOLで決められた文字列
配列定義は [ ] で囲んで指定する。先頭は数字でそのあとは
COBOL で決められた配列に関した文字列のこと
名前[99] --- OCCURS 99 句
名前[99 INDEXED BY MGF-IX]
--- OCCURS 句 INDEXED BY MGF-IX
◎型 : X(02) --- 英数字
9(09) --- 数字
9(04)#PACKED-DECIMAL --- 数字
注)#マークの両端は空白を置かないこと
◎ファイル名:COBOLで決められた文字列
ファイルステータス域名は ファイル名-STS です
◎アクセス形式: S --- sequential
SS -- sequential SHARED mode
IS --- indexed sequential --------+
ISS -- indexed sequential SHARED mode ---+
ID --- indexed dynamic --------+--+
IDS -- indexed dynamic SHARED mode -----+ |
IR --- indexed random --------+ |
IRS -- indexed random SHARED mode ------+ |
(キー領域名は ファイル名-KEY です)
P --- 印刷
PP -- 印刷 頁制御
印刷頁行数域名は ファイル名-PLSZ
印刷有効行数域名は ファイル名-FOOT です
◎ブロック化定数:数字
◎”ファイルラベル”:COBOLで決められた文字列
◎デバイス番号:COBOLで決められた番号
◎初期値:COBOLで決められた文字列。ただし、継続行指定は不可
””で囲まれた”とコメントの”は \" とすること。
◎行:1 〜 24
◎桁:1 〜 80
◎領域名:DATA DIVISION で定義される領域名
◎オプション:色、ブリンク等の指定
(2)手続きに関する定義
・セクション
<セクション名> :セクションの開始
セクションの手続き記述
<ext> :セクションの終わり
・プログラムの終わり
<end> :STOP RUN.
LINKAGE SECTION ができた時は
EXIT PROGURAM となる
・ラベル
名前 :英字で始まる英数字、−
・GOTO 命令
-> 名前 :ラベルへの飛び越し
-> <ext> :セクション終了への飛び越し
・条件繰り返し
:(?) 条件 :繰り返しの始め
: 命令
: 命令
:(o)= :繰り返しの終わり
:(o) :繰り返しの始め
: 命令
: 命令
:(?)= 条件 :繰り返しの終わり
: <break> :繰り返しを抜ける
・サブルーチン
<<セクション名>> :PERFORM xxxx.
<<セクション名>> VARYING xx FROM 99 BY 99 UNTIL cc
:PERFORM xxxx VARYING xx
FROM 99 BY 99 UNTIL cc.
>>セクション名|サブルーチン名<< p1 p2 p3 ,,,
:CALL xxx USING p1 p2 p3 ,,,.
・転送命令(−>)、演算命令(=>)
x1x -> x2x :MOVE x1x TO x2x.
x1x(i) -> x2x(i) :MOVE x1x(i) TO x2x(i).
x1x + 1 => x2x :COMPUTE x2x = x1x + 1.
・判断命令
<?> 条件 <#> :IF 条件 THEN -- ELSE -- END-IF.
then 命令群 # else 命令群 then 側のみ IF の入れ子が可能
# 命令群の中にはコメント、命令が
記述出来る。ただし、else側は
判断分岐がある命令は記述出来
ない
<?> 条件1
<?> 条件2 :IF の条件が複数の行に記述される
<?> 条件3 <#>
then 命令群 # else 命令群
#
<?> cc1 > 10 <#>
<?> cc2 > 2 <#> # *comnt4
<?> cc3 = 1 <#> # # -> xxx
xx -> xxx # xx -> xx # *comnt3 #
*comnt1 # *comnt2 # a + 1 => b #
=<.> 領域名 :EVALUATE xxx
=[?] 条件1 WHEN cc1
= 条件1の手続き xxxxxxxxx
=[?] 条件2 WHEN cc2
= 条件2の手続き xxxxxxxxx
=[*] WHEN OTHER
= その他条件の手続き xxxxxxxxx
END-EVALUATE
=<.> 領域名 & 領域名 :EVALUATE xxx ALSO xxxx
=[?] 条件10 & 条件11 WHEN cc10 ALSO cc11
= 条件1の手続き xxxxxxxxx
=[?] 条件20 & 条件21 WHEN cc20 ALSO cc21
= 条件2の手続き xxxxxxxxx
=[*] WHEN OTHER
= その他条件の手続き xxxxxxxxx
END-EVALUATE
<nxt> :CONTINUE
・入出力命令
/acc/ 領域名 DATE :ACCEPT 日付
/acc/ 領域名 TIME :ACCEPT 時刻
/acc/ 領域名 :ACCEPT
/dsp/ x1 x2 x3 ... :DISPLAY 命令
/clr/ ALL :全画面クリア
/clr/ 99 :画面 99 行クリア
/clr/ 99 99 :画面 99 行から 99 行までクリア
/o.o/ f1 f2 ... :OPEN OUTPUT 命令
/o.e/ f1 f2 ... :OPEN EXTEND 命令
/o.i/ f1 f2 ... :OPEN INPUT 命令
/o.i-o/ f1 f2 ... :OPEN I-O 命令
/rd/ f1 <:> :READ AT END 命令
正常命令群 # AT END 命令群
/rd/ f1 <#> :READ INVALID 命令
正常命令群 # INVALID 命令群
/wt/ rec :WRITE 命令
/wt/ rec AFTER xx :WRITE 命令
/wt/ rec BEFORE xx :WRITE 命令
/wt/ rec FROM xxx :WRITE 命令
/wt/ rec <#> :WRITE INVALID 命令
正常命令群 # INVALID 命令群
/rw/ rec :REWRITE 命令
/rw/ rec <#> :REWRITE INVALID 命令
正常命令群 # INVALID 命令群
/del/ rec :DELETE 命令
/del/ rec <#> :DELETE INVALID 命令
正常命令群 # INVALID 命令群
/st/ f1 :START 命令
/st/ f1 <#> :START INVALID 命令
正常命令群 # INVALID 命令群
/c/ f1 f2 f3 ... :CLOSE 命令
(3)記号の取り込み関する定義
<copy< ファイル名 p1 p2 p3 ... :記号で記述した命令群を展開する
p1, p2, p3 .. は id=置き換え文字列
と記述し、ファイル内では @id=@ と記
述する。id は英数字のみ。
展開時にそれが置き換え文字列と置き
替えられてから解析する。
(4)定義解析スキップに関する定義
>define> フラグ文字列 :解析制御用のフラグの定義
c言語での #define シンボル、#ifdef
のようにして使う。
英数字と_(下線)のみ。
>undefine> フラグ文字列 :解析制御用のフラグの削除
>ifdef> 正規表現 :>define> でフラグが定義されていたら
: >ifdef> と >endif> の間の命令を解析
: する。
>endif> 条件分岐記号の解析順に現れた順に解析
される。フラグ文字列、正規表現のあと
は何も書けない(#で分割される場合は
除く)
正規表現は ¥記号は入力できない。
先頭、最終一致の ^ , $ は左端、右端
のみ記述できる。
また、文字のみのチェックなので不正な
表現は perl が実行エラーメッセージを
出して終了する。
^[AFZ]
..X$ 等簡単なものにするのがよい
3.エラーメッセージ
CNVCBL: ERROR AT ファイル名:行番号 LINE ? ( 詳細 )
・詳細説明
end loop ? ------ 条件繰り返しの終了がない
continued IF statement
------ 条件命令が途中で終わった
too long field ------ ソース出力時60桁を越える長い項目があった
この時ソースは出力される。ソースの行番号が
表示される
too LONG field ------ 入力命令、領域定義に59桁を越える項目が
あった
break condition statement
------ 条件命令で空白で挟まれた#文字がある行が
なかったか、左右に命令記述がなかった
continued statement
------ 条件命令途中にプログラム終了命令、セクション
終了命令、ラベルがあった
no loop statement --- 繰り返し命令の始まりがなくて終わりがきた
empty copy file ----- <copy< で指定したファイル内に記述がないか、
指定したファイルが見つからなかった
bad statement ------ 記述に誤りがある
セクション定義をせずに <ext> 記号を使用した
4.環境変数
OSID : MSDOS OSID = "MSDOS"
MSDOS OSID = "MSDOS-MEM"
UNIX OSID = "UNIX"
UNIX OSID = "UNIX-MEM"
CPYLIB : <copy< で指定したファイル名のディレクトリ。
TMP : 作業ファイルで使用するディレクトリ。
OSID で MEM 指定がないとき。
5.その他
・著作権表示は変更しないこと。
・このプログラムを使用しての損害は一切補償はしません。
また、プログラムに不備があってもそれを訂正する義務は負いません。
・再配布等については営利目的でないこと。
ドキュメントも同封されますようお願いします。
転載された場合は連絡いただければ幸いです。
・改造した場合は改造されていることを記すること。
------- 参考資料 ----------
"The AWK Programming Language" ADDISON-WESLETY PUBBLISHING CO.
A.V. Aho, B. W. Kernighan, P. J. Weinberger 著
"AWK を 256 倍使うための本" (株)アスキー
志村拓、鷲北賢、西村克信 著
"決定版!ホームページサンプルスクリプト大全集" (株)技術評論社
古籏一浩+三津原敏 著
"新Perlの国へようこそ・Perl5対応版" (株)サイエンス社
斉藤靖、小山裕司、前田薫、布施有人 著
COBOL FAQ : http://home.comcast.net/~wmklein/FAQ/COBOLFAQ.htm
--------------------------------------------------------------------
下村 清
ea7k-smmr@asahi-net.or.jp
ダウンロード
表紙