表紙
OPEN COBOL生成
NEC COBOL85生成

プログラム生成(FACOM COBOL-G)


     WEBで見よう (cobol/cnvcblg.cgi)       更新日: 2007.6.27


ずいぶんと古くなったので少し変更して見ました。
WEBでCGIとして動作するよう変更しました。
テストした環境は玄箱Pro LINUX でLighttpd とPerl5.8.8
NKFモジュールでしました。見え方はCOBOL85と同じ

           *** 入力 ***
cobol_input

*** 変換後 ***
cobol_out
  ●玄箱/Proをいじるを参照してください。

        COBOL-G プログラム生成 説明書                  1999. 10. 13
          CNVCBL.PL  V1.0 (99.10.12)
                                                      Copyright (c) 1993-1999
                                                         下村 清

1.概要

        プログラム詳細設計を簡単な記号で記述して考えをまとめやすくするように
   して、なおかつその記述を利用して COBOL-G 言語に変換する。
      (COBOL-Gもどきを作文するようなものです。)
        少しは処理手順の論理チェックをしやすくなっていると思います。
   とりあえずは COBOL-G で FACOM K 用のものを考えてみました。
        なお、COBOL言語の文法チェック等のエラーチェックは一切行いません。
   翻訳対象マシンでの翻訳で行って下さい。
        変換は入力された行を論理、妥当性のチェックはほとんどしないで変換を
      します。
        このプログラムは1行1命令となることはもちろんですがIF、条件入出力
   命令で空白で挟まれた#文字で1行を分割して2命令を記述できます。
        また、入れ子となった場合はそれ以上が可能です。
        IF、条件入出力命令で次の行の一番右にある空白で挟まれた#文字で
   行を一端左右に分割する。空白で挟まれた#文字の行がなくなるまで。
   IFは左側の命令群を先に、条件入出力命令は右側を先に解析した後その
   反対側を解析して条件命令を終わる。なお分割中は命令の解析を行いません
   ので右側にはIF、条件入出力命令が書けません。なぜならば空白で挟まれ
   た#文字が出てくるからです。
        入れ子となった条件命令の行数は一番外側にある条件命令の最終行からはみ
   出さないこと。
        左右に分割した命令群にはコメントも、領域、画面の定義、<copy<, 
   >define>, >undefine>, >ifdef>, >endif>, =<.> .. =[?] .. =[*] .. = は
      左右に、左側には <?>, /rd/, /wt/, /rw/, /st/, /del/ の条件つきの命令が
      書けます。なお、条件繰り返しは条件命令の空白で挟まれた#文字が出てきま
      せんが COBOL を生成するときIF命令とラベルをつくりますので記述出来ま
      せん。
        領域定義は定義した順に各グループにとりまとめて作りますのでどの行に
   あってもかまいません。
        二重定義、未定義等のチェックは一切行いませんので注意して下さい。

        制御文字以外の文字は変換後全て大文字となります。

        +----------+       +---------------+      +---------+
        |          | ----> | jperl5.003    | ---> | COBOL-G |
        | 詳細設計 |       | 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  ファイル名 アクセス形式 定義体名
                                        :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


        画面定義をすると自動的に以下の領域が生成される。

                *------- DISPLAY CONTROL  <xxxxxx> ------
                 01  DSP-xxxxxx-CTT00.
                     03  GMED-NAME        PIC     X(08).
                     03  GROUP-NAME       PIC     X(08).
                     03  G-STATUS         PIC     X(02).
                     03  GSYUBETU         PIC     X(02).
                     03  G-ATTENTION      PIC     X(04).
                :
                :

                **---------------------------------------------**
                **    SCREEN     WORK     AREA     DEFINE
                **---------------------------------------------**
                 01  S-C-FUNC-KEY.
                     02  C-ZIKKOU         PIC     X(02)  VALUE "E000".
                     02  C-PF1            PIC     X(02)  VALUE "F001".
                     02  C-PF2            PIC     X(02)  VALUE "F002".
                     02  C-PF3            PIC     X(02)  VALUE "F003".
                     02  C-PF4            PIC     X(02)  VALUE "F004".
                     02  C-PF5            PIC     X(02)  VALUE "F005".
                     02  C-PF6            PIC     X(02)  VALUE "F006".
                     02  C-PF7            PIC     X(02)  VALUE "F007".
                     02  C-PF8            PIC     X(02)  VALUE "F008".
                     02  C-PF9            PIC     X(02)  VALUE "F009".
                     02  C-PF10           PIC     X(02)  VALUE "F010".
                     02  C-PF11           PIC     X(02)  VALUE "F011".
                     02  C-PF12           PIC     X(02)  VALUE "F012".
                     02  C-PF13           PIC     X(02)  VALUE "F013".
                     02  C-PF14           PIC     X(02)  VALUE "F014".
                     02  C-PF15           PIC     X(02)  VALUE "F015".
                     02  C-PF16           PIC     X(02)  VALUE "F016".
                     02  C-PF17           PIC     X(02)  VALUE "F017".
                     02  C-PF18           PIC     X(02)  VALUE "F018".
                     02  C-PF19           PIC     X(02)  VALUE "F019".
                     02  C-PF20           PIC     X(02)  VALUE "F020".
                     02  C-PF21           PIC     X(02)  VALUE "F021".
                     02  C-PF22           PIC     X(02)  VALUE "F022".


        定義体でのプリンターを定義すると自動的に以下の領域が生成される。

                *------- PRINTER CONTROL  <xxxx> ------
                 01  LPT-xxxx-CTT00.
                     03  P-MNAME          PIC     X(08).
                     03  P-GNAME          PIC     X(08).
                     03  P-SYUBETU        PIC     X(02).
                     03  P-CONTL          PIC     X(06).
                     03  P-STATUS         PIC     X(02).


        ◎レベル番号:ピリオドと等号の数で決まる。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)#COMP --- 数字
                    注)#マークの両端は空白を置かないこと

        ◎ファイル名:COBOLで決められた文字列
                   ファイルステータス域名は ファイル名-STS です
        ◎定義体名:COBOLで決められた文字列
        ◎アクセス形式: 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 です)
                         C --- 画面
                         P --- 印刷
                         PP -- 印刷 頁制御
                                印刷頁行数域名は ファイル名-PLSZ
                                印刷有効行数域名は ファイル名-FOOT です
        ◎ブロック化定数:数字
        ◎ファイルラベル:COBOLで決められた文字列
        ◎初期値:COBOLで決められた文字列。ただし、継続行指定は不可
                  ””で囲まれた”とコメントの”は \" とすること。


 (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                           <#>
                        <?> cc2              <#>           # *comnt4
                        <?> cc3   <#>         #            # -> 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 命令
                /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

ダウンロード

表紙