#COBOLでスタックを実装するには?
インタープリタを実装するのに必要な機能として、スタックがあります。ということで、COBOLでスタックを実装します。配列しか使えないので、面倒だなぁと。スタックとはなんぞや?については説明はしません。
##ざっくり仕様:
スタックに格納できる要素は、可変長の文字列。
##設計:データ構造イメージ:
###1.スタックメモリ
スタックには内部的なメモリがあって、それは一本の紐のようなものをイメージ。まさしくString。
###2.スタック管理テーブル
1次元配列。配列の最後の要素がスタックのトップで、スタックメモリのアドレスを指している。この配列が伸び(PUSH)縮み(POP)することで、スタックを表現している。この後提示するサンプル実装では、POPで配列を縮めていないです。
###3.スタック管理テーブルインデックス
スタック管理テーブルの最後の要素のインデックスを指している。
###4.スタックメモリ空き番
スタックメモリの空きメモリ開始アドレス。
上記1.から4.を応用すればリンクリストやキューもCOBOLで実装できそう。やる気になったら実装してみよう。
##サンプル:スタックサブルーチンテストメイン処理とスタックサブルーチン、COPY句やビルドXMLなど。
###サンプルソース
サンプルソースgithub
t00stack.xmlをantで実行して、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���������