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

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

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

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

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

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

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

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

###データ構造イメージ図：
![IMG_20150419_0001_NEW.jpg](https://qiita-image-store.s3.amazonaws.com/0/76786/80889495-572a-567c-b101-2b66a165c174.jpeg)

##サンプル：スタックサブルーチンテストメイン処理とスタックサブルーチン、COPY句やビルドXMLなど。
###サンプルソース
[サンプルソースgithub](https://github.com/madilloar/PRJ_Calico)

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���������
```