//
// Whitespace interpreter beta0 (C)2011 unarist
//
PrintMemoを、メモとして、作成
その、レイアウトは、左
StdOutを、メモとして、作成
その、レイアウトは、全体
StackMemoを、メモとして、作成
その、レイアウトは、下
S=メモ記入()
Space=0
Tab=1
LF=2
S=正規表現置換(S,`s/[^ \t\r\n]//kg`)
S=置換(S,"\n",LF)
S=正規表現入換(S,`tr/[ \t]/[01]/`)
Size=LENB(S)
LL=""
GenLabel=1
init
PrintStr("[GenLabel]")
Parse
GenLabel=0
init
PrintStr("[Run]")
Parse
待機
*Parse
Stack=""
"Ptr<Size"で、ループ(
GetByteで、条件分岐
Spaceの時、impStack
Tabの時、(
GetByteで、条件分岐
Spaceの時、impCalc
Tabの時、impHeap
LFの時、impIO
)
LFの時、impFlow
もし、MOD(Count,10)=0ならば、描画処理反映
Count=Count+1
)
戻る
*init
Stack=""
CallStack=""
Heap=""
Ptr=1
Count=0
戻る
'----IMP別ルーチン
*impStack
GetByte
条件分岐
Spaceの時、(StackPush(GetNum);PrintStr("Push"))
LFの時、(GetByteで、条件分岐
Spaceの時、(StackCopy(0);PrintStr("CopyTop"))
Tabの時、(StackSwap;PrintStr("Swap"))
LFの時、(StackPop;PrintStr("Destroy"))
)
Tabの時、(
GetByteで、条件分岐
Spaceの時、(StackCopy(GetNum);PrintStr("Pick"))
LFの時、(StackSlide(GetNum);PrintStr("Slide"))
)
戻る
*impCalc
GetWord
条件分岐
"{Space}{Space}"の時、(
StackPop
StackPush(StackPop+それ)
PrintStr("Add")
)
"{Space}{Tab}"の時、(
StackPop
StackPush(StackPop-それ)
PrintStr("Sub")
)
"{Space}{LF}"の時、(
StackPop
StackPush(StackPop*それ)
PrintStr("Mul")
)
"{Tab}{Space}"の時、(
StackPop
StackPush(StackPop/それ)
PrintStr("Div")
)
"{Tab}{Tab}"の時、(
StackPop
StackPush(MOD(StackPop,それ))
PrintStr("Mod")
)
その他の時、Error("構文エラー:Calc.{それ}")
戻る
*impHeap
GetByte
条件分岐
Spaceの時、(StackPop;Heap#それ=StackPop;PrintStr("Store"))
Tabの時、(StackPush(Heap#StackPop);PrintStr("Retrieve"))
その他の時、Error("構文エラー:Heap.{それ}")
戻る
*impFlow
GetWord
条件分岐
"{Space}{Space}"の時、(
GetString
もし、GenLabelならば、(LLの、それ=Ptr;PrintStr("CreateLabel"))
)
"{Space}{Tab}"の時、(
GetString
CallStack=CallStack&"{Ptr}\n"
Ptr=(LLの、それ)
PrintStr("Call")
)
"{Space}{LF}"の時、(Ptr=(LLの、GetString);PrintStr("Jump");)
"{Tab}{Space}"の時、(
GetString
もし、(GenLabel=0)&&(StackPop=0)ならば、Ptr=(LLの、それ);PrintStr("JumpZero")
)
"{Tab}{LF}"の時、(
もし、(GenLabel=0)&&(CallStack="")ならば、Error("Returnエラー:戻り先が不明")
Ptr=CallStack#0
CallStack=行削除(CallStack,0)
)
"{Tab}{Tab}"の時、(
GetString
もし、(GenLabel=0)&&(StackPop<0)ならば、Ptr=(LLの、それ);PrintStr("JumpNegative")
)
"{LF}{LF}"の時、(Ptr=Size;PrintStr("End"))
その他の時、Error("構文エラー:Flow.{それ}")
もし、GenLabelならば、Ptr=PtrT
戻る
*impIO
GetWord
条件分岐
"{Space}{Space}"の時、(StackPop;Print;PrintStr("PrintCh"))
"{Space}{Tab}"の時、(PrintNum(StackPop);PrintStr("PrintNum"))
"{Tab}{Space}"の時、もし、GenLabel=0ならば(尋ねる("Char");StackPush(ASC(MID(それ,1,1))))
"{Tab}{Tab}"の時、もし、GenLabel=0ならば(尋ねる("Num");StackPush(それ))
その他の時、Error("構文エラー:IO.{それ}")
戻る
'----補助関数
*Print(?)
'PrintStr("Print")
もし、GenLabel<>0ならば、戻る
引数取得
もし、それ=10ならば、それ="\n"
違えば、CHR(それ)
StdOut=StdOut&それ
戻る
*PrintNum(?)
もし、GenLabel=0ならば、StdOut=StdOut&"{引数取得}"
戻る
*PrintStr(?)
PrintMemo=PrintMemo&"{Ptr}:{引数取得}\n"
戻る
*GetByte
MID(S,Ptr,1)
Ptr=Ptr+1
PtrT=Ptr
戻る
*GetWord
MID(S,Ptr,2)
Ptr=Ptr+2
PtrT=Ptr
戻る
*StackPush(?)
引数取得
Stack=それ&"\n"&Stack
StackMemo=Stack
'PrintStr("Push{それ}")
戻る
*StackPop
表示() //NOP
それ=Stack#0
Stack=行削除(Stack,0)
StackMemo=Stack
'PrintStr("Pop")
戻る
'Top=0
*StackCopy(?)
引数取得
StackPush(Stack#それ)
'PrintStr("Copy{それ}")
戻る
*StackSlide(?)
引数取得回、Stack=行削除(Stack,1)
StackMemo=Stack
'PrintStr("Slide{それ}")
戻る
*StackSwap
StackPush(Stack#1)
Stack=行削除(Stack,2)
StackMemmo=Stack
'PrintStr("Swap")
戻る
*Jump(?)
もし、LL=""ならば、戻る
戻る
*GetNum
Sign=GetByte
D=""
1で、ループ(GetByte;もし、それ=LFならば、抜ける;D=D&(それ=Tab))
もし、D=""ならば、それ=0
違えば(
BinDec(D)
もし、Sign=Tabならば、それ=それ*(-1)
)
戻る
*GetString
D=""
1で、ループ(GetByte;もし、それ=LFならば、抜ける;D=D&それ)
それ=D
戻る
*Error(?)
言う(引数取得)
Ptr=Size
戻る
*BinDec(?)
ローカル変数(in)
in=引数得(1)
それ=0
(LEN(in))回、(
それ=SHL(それ,1)+左端切取(in,1)
)
戻る
Ly8KLy8gIFdoaXRlc3BhY2UgaW50ZXJwcmV0ZXIgYmV0YTAgKEMpMjAxMSB1bmFyaXN0Ci8vCgpQcmludE1lbW/jgpLjgIHjg6Hjg6LjgajjgZfjgabjgIHkvZzmiJAK44Gd44Gu44CB44Os44Kk44Ki44Km44OI44Gv44CB5bemClN0ZE91dOOCkuOAgeODoeODouOBqOOBl+OBpuOAgeS9nOaIkArjgZ3jga7jgIHjg6zjgqTjgqLjgqbjg4jjga/jgIHlhajkvZMKU3RhY2tNZW1v44KS44CB44Oh44Oi44Go44GX44Gm44CB5L2c5oiQCuOBneOBruOAgeODrOOCpOOCouOCpuODiOOBr+OAgeS4iwpTPeODoeODouiomOWFpSgpClNwYWNlPTAKVGFiPTEKTEY9MgpTPeato+imj+ihqOePvue9ruaPmyhTLGBzL1teIFx0XHJcbl0vL2tnYCkKUz3nva7mj5soUywiXG4iLExGKQpTPeato+imj+ihqOePvuWFpeaPmyhTLGB0ci9bIFx0XS9bMDFdL2ApClNpemU9TEVOQihTKQpMTD0iIgpHZW5MYWJlbD0xCmluaXQKUHJpbnRTdHIoIltHZW5MYWJlbF0iKQpQYXJzZQpHZW5MYWJlbD0wCmluaXQKUHJpbnRTdHIoIltSdW5dIikKUGFyc2UK5b6F5qmfCu+8ilBhcnNlClN0YWNrPSIiCiJQdHI8U2l6ZSLjgafjgIHjg6vjg7zjg5coCiAgICBHZXRCeXRl44Gn44CB5p2h5Lu25YiG5bKQCiAgICAgICAgU3BhY2Xjga7mmYLjgIFpbXBTdGFjawogICAgICAgIFRhYuOBruaZguOAgSgKICAgICAgICAgICAgR2V0Qnl0ZeOBp+OAgeadoeS7tuWIhuWykAogICAgICAgICAgICAgICAgU3BhY2Xjga7mmYLjgIFpbXBDYWxjCiAgICAgICAgICAgICAgICBUYWLjga7mmYLjgIFpbXBIZWFwCiAgICAgICAgICAgICAgICBMRuOBruaZguOAgWltcElPCiAgICAgICAgKQogICAgICAgIExG44Gu5pmC44CBaW1wRmxvdwogICAgICAgIOOCguOBl+OAgU1PRChDb3VudCwxMCk9MOOBquOCieOBsOOAgeaPj+eUu+WHpueQhuWPjeaYoAogICAgICAgIENvdW50PUNvdW50KzEKKQrmiLvjgosK77yKaW5pdApTdGFjaz0iIgpDYWxsU3RhY2s9IiIKSGVhcD0iIgpQdHI9MQpDb3VudD0wCuaIu+OCiwonLS0tLUlNUOWIpeODq+ODvOODgeODswrvvIppbXBTdGFjawpHZXRCeXRlCuadoeS7tuWIhuWykAogICAgU3BhY2Xjga7mmYLjgIEoU3RhY2tQdXNoKEdldE51bSk7UHJpbnRTdHIoIlB1c2giKSkKICAgIExG44Gu5pmC44CBKEdldEJ5dGXjgafjgIHmnaHku7bliIblspAKICAgICAgICAgICAgU3BhY2Xjga7mmYLjgIEoU3RhY2tDb3B5KDApO1ByaW50U3RyKCJDb3B5VG9wIikpCiAgICAgICAgICAgIFRhYuOBruaZguOAgShTdGFja1N3YXA7UHJpbnRTdHIoIlN3YXAiKSkKICAgICAgICAgICAgTEbjga7mmYLjgIEoU3RhY2tQb3A7UHJpbnRTdHIoIkRlc3Ryb3kiKSkKICAgICkKICAgIFRhYuOBruaZguOAgSgKICAgICAgICBHZXRCeXRl44Gn44CB5p2h5Lu25YiG5bKQCiAgICAgICAgICAgIFNwYWNl44Gu5pmC44CBKFN0YWNrQ29weShHZXROdW0pO1ByaW50U3RyKCJQaWNrIikpCiAgICAgICAgICAgIExG44Gu5pmC44CBKFN0YWNrU2xpZGUoR2V0TnVtKTtQcmludFN0cigiU2xpZGUiKSkKICAgICkK5oi744KLCu+8imltcENhbGMKR2V0V29yZArmnaHku7bliIblspAKICAgICJ7U3BhY2V9e1NwYWNlfSLjga7mmYLjgIEoCiAgICAgICAgU3RhY2tQb3AKICAgICAgICBTdGFja1B1c2goU3RhY2tQb3Ar44Gd44KMKQogICAgICAgIFByaW50U3RyKCJBZGQiKQogICAgKQogICAgIntTcGFjZX17VGFifSLjga7mmYLjgIEoCiAgICAgICAgU3RhY2tQb3AKICAgICAgICBTdGFja1B1c2goU3RhY2tQb3At44Gd44KMKQogICAgICAgIFByaW50U3RyKCJTdWIiKQogICAgKQogICAgIntTcGFjZX17TEZ9IuOBruaZguOAgSgKICAgICAgICBTdGFja1BvcAogICAgICAgIFN0YWNrUHVzaChTdGFja1BvcCrjgZ3jgowpCiAgICAgICAgUHJpbnRTdHIoIk11bCIpCiAgICApCiAgICAie1RhYn17U3BhY2V9IuOBruaZguOAgSgKICAgICAgICBTdGFja1BvcAogICAgICAgIFN0YWNrUHVzaChTdGFja1BvcC/jgZ3jgowpCiAgICAgICAgUHJpbnRTdHIoIkRpdiIpCiAgICApCiAgICAie1RhYn17VGFifSLjga7mmYLjgIEoCiAgICAgICAgU3RhY2tQb3AKICAgICAgICBTdGFja1B1c2goTU9EKFN0YWNrUG9wLOOBneOCjCkpCiAgICAgICAgUHJpbnRTdHIoIk1vZCIpCiAgICApCiAgICDjgZ3jga7ku5bjga7mmYLjgIFFcnJvcigi5qeL5paH44Ko44Op44O8OkNhbGMue+OBneOCjH0iKQrmiLvjgosK77yKaW1wSGVhcApHZXRCeXRlCuadoeS7tuWIhuWykAogICAgU3BhY2Xjga7mmYLjgIEoU3RhY2tQb3A7SGVhcCPjgZ3jgow9U3RhY2tQb3A7UHJpbnRTdHIoIlN0b3JlIikpCiAgICBUYWLjga7mmYLjgIEoU3RhY2tQdXNoKEhlYXAjU3RhY2tQb3ApO1ByaW50U3RyKCJSZXRyaWV2ZSIpKQogICAg44Gd44Gu5LuW44Gu5pmC44CBRXJyb3IoIuani+aWh+OCqOODqeODvDpIZWFwLnvjgZ3jgox9IikK5oi744KLCu+8imltcEZsb3cKR2V0V29yZArmnaHku7bliIblspAKICAgICJ7U3BhY2V9e1NwYWNlfSLjga7mmYLjgIEoCiAgICAgICAgR2V0U3RyaW5nCiAgICAgICAg44KC44GX44CBR2VuTGFiZWzjgarjgonjgbDjgIEoTEzjga7jgIHjgZ3jgow9UHRyO1ByaW50U3RyKCJDcmVhdGVMYWJlbCIpKQogICAgKQogICAgIntTcGFjZX17VGFifSLjga7mmYLjgIEoCiAgICAgICAgR2V0U3RyaW5nCiAgICAgICAgQ2FsbFN0YWNrPUNhbGxTdGFjayYie1B0cn1cbiIKICAgICAgICBQdHI9KExM44Gu44CB44Gd44KMKQogICAgICAgIFByaW50U3RyKCJDYWxsIikKICAgICkKICAgICJ7U3BhY2V9e0xGfSLjga7mmYLjgIEoUHRyPShMTOOBruOAgUdldFN0cmluZyk7UHJpbnRTdHIoIkp1bXAiKTspCiAgICAie1RhYn17U3BhY2V9IuOBruaZguOAgSgKICAgICAgICBHZXRTdHJpbmcKICAgICAgICDjgoLjgZfjgIEoR2VuTGFiZWw9MCkmJihTdGFja1BvcD0wKeOBquOCieOBsOOAgVB0cj0oTEzjga7jgIHjgZ3jgowpO1ByaW50U3RyKCJKdW1wWmVybyIpCiAgICApCiAgICAie1RhYn17TEZ9IuOBruaZguOAgSgKICAgICAgICDjgoLjgZfjgIEoR2VuTGFiZWw9MCkmJihDYWxsU3RhY2s9IiIp44Gq44KJ44Gw44CBRXJyb3IoIlJldHVybuOCqOODqeODvDrmiLvjgorlhYjjgYzkuI3mmI4iKQogICAgICAgIFB0cj1DYWxsU3RhY2sjMAogICAgICAgIENhbGxTdGFjaz3ooYzliYrpmaQoQ2FsbFN0YWNrLDApCiAgICApCiAgICAie1RhYn17VGFifSLjga7mmYLjgIEoCiAgICAgICAgR2V0U3RyaW5nCiAgICAgICAg44KC44GX44CBKEdlbkxhYmVsPTApJiYoU3RhY2tQb3A8MCnjgarjgonjgbDjgIFQdHI9KExM44Gu44CB44Gd44KMKTtQcmludFN0cigiSnVtcE5lZ2F0aXZlIikKICAgICkKICAgICJ7TEZ9e0xGfSLjga7mmYLjgIEoUHRyPVNpemU7UHJpbnRTdHIoIkVuZCIpKQogICAg44Gd44Gu5LuW44Gu5pmC44CBRXJyb3IoIuani+aWh+OCqOODqeODvDpGbG93LnvjgZ3jgox9IikK44KC44GX44CBR2VuTGFiZWzjgarjgonjgbDjgIFQdHI9UHRyVArmiLvjgosK77yKaW1wSU8KR2V0V29yZArmnaHku7bliIblspAKICAgICJ7U3BhY2V9e1NwYWNlfSLjga7mmYLjgIEoU3RhY2tQb3A7UHJpbnQ7UHJpbnRTdHIoIlByaW50Q2giKSkKICAgICJ7U3BhY2V9e1RhYn0i44Gu5pmC44CBKFByaW50TnVtKFN0YWNrUG9wKTtQcmludFN0cigiUHJpbnROdW0iKSkKICAgICJ7VGFifXtTcGFjZX0i44Gu5pmC44CB44KC44GX44CBR2VuTGFiZWw9MOOBquOCieOBsCjlsIvjga3jgosoIkNoYXIiKTtTdGFja1B1c2goQVNDKE1JRCjjgZ3jgowsMSwxKSkpKQogICAgIntUYWJ9e1RhYn0i44Gu5pmC44CB44KC44GX44CBR2VuTGFiZWw9MOOBquOCieOBsCjlsIvjga3jgosoIk51bSIpO1N0YWNrUHVzaCjjgZ3jgowpKQogICAg44Gd44Gu5LuW44Gu5pmC44CBRXJyb3IoIuani+aWh+OCqOODqeODvDpJTy5744Gd44KMfSIpCuaIu+OCiwonLS0tLeijnOWKqemWouaVsArvvIpQcmludCg/KQonUHJpbnRTdHIoIlByaW50IikK44KC44GX44CBR2VuTGFiZWw8PjDjgarjgonjgbDjgIHmiLvjgosK5byV5pWw5Y+W5b6XCuOCguOBl+OAgeOBneOCjD0xMOOBquOCieOBsOOAgeOBneOCjD0iXG4iCumBleOBiOOBsOOAgUNIUijjgZ3jgowpClN0ZE91dD1TdGRPdXQm44Gd44KMCuaIu+OCiwrvvIpQcmludE51bSg/KQrjgoLjgZfjgIFHZW5MYWJlbD0w44Gq44KJ44Gw44CBU3RkT3V0PVN0ZE91dCYie+W8leaVsOWPluW+l30iCuaIu+OCiwrvvIpQcmludFN0cig/KQpQcmludE1lbW89UHJpbnRNZW1vJiJ7UHRyfTp75byV5pWw5Y+W5b6XfVxuIgrmiLvjgosK77yKR2V0Qnl0ZQpNSUQoUyxQdHIsMSkKUHRyPVB0cisxClB0clQ9UHRyCuaIu+OCiwrvvIpHZXRXb3JkCk1JRChTLFB0ciwyKQpQdHI9UHRyKzIKUHRyVD1QdHIK5oi744KLCu+8ilN0YWNrUHVzaCg/KQrlvJXmlbDlj5blvpcKU3RhY2s944Gd44KMJiJcbiImU3RhY2sKU3RhY2tNZW1vPVN0YWNrCidQcmludFN0cigiUHVzaHvjgZ3jgox9IikK5oi744KLCu+8ilN0YWNrUG9wCuihqOekuigpIC8vTk9QCuOBneOCjD1TdGFjayMwClN0YWNrPeihjOWJiumZpChTdGFjaywwKQpTdGFja01lbW89U3RhY2sKJ1ByaW50U3RyKCJQb3AiKQrmiLvjgosKJ1RvcD0wCu+8ilN0YWNrQ29weSg/KQrlvJXmlbDlj5blvpcKU3RhY2tQdXNoKFN0YWNrI+OBneOCjCkKJ1ByaW50U3RyKCJDb3B5e+OBneOCjH0iKQrmiLvjgosK77yKU3RhY2tTbGlkZSg/KQrlvJXmlbDlj5blvpflm57jgIFTdGFjaz3ooYzliYrpmaQoU3RhY2ssMSkKU3RhY2tNZW1vPVN0YWNrCidQcmludFN0cigiU2xpZGV744Gd44KMfSIpCuaIu+OCiwrvvIpTdGFja1N3YXAKU3RhY2tQdXNoKFN0YWNrIzEpClN0YWNrPeihjOWJiumZpChTdGFjaywyKQpTdGFja01lbW1vPVN0YWNrCidQcmludFN0cigiU3dhcCIpCuaIu+OCiwrvvIpKdW1wKD8pCuOCguOBl+OAgUxMPSIi44Gq44KJ44Gw44CB5oi744KLCuaIu+OCiwrvvIpHZXROdW0KU2lnbj1HZXRCeXRlCkQ9IiIKMeOBp+OAgeODq+ODvOODlyhHZXRCeXRlO+OCguOBl+OAgeOBneOCjD1MRuOBquOCieOBsOOAgeaKnOOBkeOCiztEPUQmKOOBneOCjD1UYWIpKQrjgoLjgZfjgIFEPSIi44Gq44KJ44Gw44CB44Gd44KMPTAK6YGV44GI44GwKAogICAgQmluRGVjKEQpCiAgICDjgoLjgZfjgIFTaWduPVRhYuOBquOCieOBsOOAgeOBneOCjD3jgZ3jgowqKC0xKQopCuaIu+OCiwrvvIpHZXRTdHJpbmcKRD0iIgox44Gn44CB44Or44O844OXKEdldEJ5dGU744KC44GX44CB44Gd44KMPUxG44Gq44KJ44Gw44CB5oqc44GR44KLO0Q9RCbjgZ3jgowpCuOBneOCjD1ECuaIu+OCiwrvvIpFcnJvcig/KQroqIDjgYYo5byV5pWw5Y+W5b6XKQpQdHI9U2l6ZQrmiLvjgosK77yKQmluRGVjKD8pCuODreODvOOCq+ODq+WkieaVsChpbikKaW495byV5pWw5b6XKDEpCuOBneOCjD0wCihMRU4oaW4pKeWbnuOAgSgKICAgIOOBneOCjD1TSEwo44Gd44KMLDEpK+W3puerr+WIh+WPlihpbiwxKQopCuaIu+OCiw==