1
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?

More than 5 years have passed since last update.

スタックを実装するには?:COBOLでチェックインタープリタ

Last updated at Posted at 2015-04-27

#COBOLでスタックを実装するには?
インタープリタを実装するのに必要な機能として、スタックがあります。ということで、COBOLでスタックを実装します。配列しか使えないので、面倒だなぁと。スタックとはなんぞや?については説明はしません。

##ざっくり仕様:
スタックに格納できる要素は、可変長の文字列。

##設計:データ構造イメージ:
###1.スタックメモリ
スタックには内部的なメモリがあって、それは一本の紐のようなものをイメージ。まさしくString。

###2.スタック管理テーブル
1次元配列。配列の最後の要素がスタックのトップで、スタックメモリのアドレスを指している。この配列が伸び(PUSH)縮み(POP)することで、スタックを表現している。この後提示するサンプル実装では、POPで配列を縮めていないです。

###3.スタック管理テーブルインデックス
スタック管理テーブルの最後の要素のインデックスを指している。

###4.スタックメモリ空き番
スタックメモリの空きメモリ開始アドレス。

上記1.から4.を応用すればリンクリストやキューもCOBOLで実装できそう。やる気になったら実装してみよう。

###データ構造イメージ図:
IMG_20150419_0001_NEW.jpg

##サンプル:スタックサブルーチンテストメイン処理とスタックサブルーチン、COPY句やビルドXMLなど。
###サンプルソース
サンプルソースgithub

t00stack.xmlをantで実行して、T00STACK.exeを実行すると、次のような標準出力をします。

T00STACK.EXEの実行結果。
PRM:(PUSH     00005     0PROGRAM-ID:SUBSTACKC00-010. ,NORMAL END.                                        )
VAL:(HELLO)
CTR:(00100000070000100001                                                                                )
MEM:(HELLO������������������������������������������������
PRM:(PUSH     00006     0PROGRAM-ID:SUBSTACKC00-010. ,NORMAL END.                                        )
VAL:(WORLD!)
CTR:(0010000014000020000100007                                                                           )
MEM:(HELLO�ORLD!��������������������������������������������)
PRM:(POP_     00006     0PROGRAM-ID:SUBSTACKE00-010. ,NORMAL END.                                        )
VAL:(WORLD!)
CTR:(0010000007000010000100007                                                                           )
MEM:(HELLO������������������������������������������������
PRM:(PEEK     00005     0PROGRAM-ID:SUBSTACKD00-010. ,NORMAL END.                                        )
VAL:(HELLO)
CTR:(0010000007000010000100007                                                                           )
MEM:(HELLO������������������������������������������������
PRM:(PEEK     00005     0PROGRAM-ID:SUBSTACKD00-010. ,NORMAL END.                                        )
VAL:(HELLO)
CTR:(0010000007000010000100007                                                                           )
MEM:(HELLO������������������������������������������������
PRM:(POP_     00005     0PROGRAM-ID:SUBSTACKE00-010. ,NORMAL END.                                        )
VAL:(HELLO)
CTR:(0010000001000000000100007                                                                           )
MEM:(��������������������������������������������������)
PRM:(POP_     00000     0PROGRAM-ID:SUBSTACKE00-010. ,NORMAL END.                                        )
VAL:()
CTR:(0010000001000000000100007                                                                           )
MEM:(��������������������������������������������������)
PRM:(POP_     00000     0PROGRAM-ID:SUBSTACKE00-010. ,NORMAL END.                                        )
VAL:()
CTR:(0010000001000000000100007                                                                           )
MEM:(��������������������������������������������������)
PRM:(PUSH     00020     0PROGRAM-ID:SUBSTACKC00-010. ,NORMAL END.                                        )
VAL:(11111111111111111111)
CTR:(0010000022000010000100007                                                                           )
MEM:(11111111111111111111����������������������������������������)
PRM:(PUSH     00020     0PROGRAM-ID:SUBSTACKC00-010. ,NORMAL END.                                        )
VAL:(22222222222222222222)
CTR:(0010000043000020000100022                                                                           )
MEM:(11111111111111111111�2222222222222222222������������������������������
PRM:(PUSH     00020     0PROGRAM-ID:SUBSTACKC00-010. ,NORMAL END.                                        )
VAL:(33333333333333333333)
CTR:(001000006400003000010002200043                                                                      )
MEM:(11111111111111111111�2222222222222222222�3333333333333333333�������������������)
PRM:(PUSH     00020     0PROGRAM-ID:SUBSTACKC00-010. ,NORMAL END.                                        )
VAL:(44444444444444444444)
CTR:(00100000850000400001000220004300064                                                                 )
MEM:(11111111111111111111�2222222222222222222�3333333333333333333�4444444444444444444���������
PRM:(PUSH     00020     qPROGRAM-ID:SUBSTACKC00-010. ,ABNORMAL END.                                      )
VAL:(55555555555555555555)
CTR:(00100000850000400001000220004300064                                                                 )
MEM:(11111111111111111111�2222222222222222222�3333333333333333333�4444444444444444444���������
PRM:(PUSH     00020     qPROGRAM-ID:SUBSTACKC00-010. ,ABNORMAL END.                                      )
VAL:(55555555555555555555)
CTR:(00100000850000400001000220004300064                                                                 )
MEM:(11111111111111111111�2222222222222222222�3333333333333333333�4444444444444444444���������
1
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
1
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?