fork(1) download
  1. //
  2. // Whitespace interpreter beta0 (C)2011 unarist
  3. //
  4.  
  5. PrintMemoを、メモとして、作成
  6. その、レイアウトは、左
  7. StdOutを、メモとして、作成
  8. その、レイアウトは、全体
  9. StackMemoを、メモとして、作成
  10. その、レイアウトは、下
  11. S=メモ記入()
  12. Space=0
  13. Tab=1
  14. LF=2
  15. S=正規表現置換(S,`s/[^ \t\r\n]//kg`)
  16. S=置換(S,"\n",LF)
  17. S=正規表現入換(S,`tr/[ \t]/[01]/`)
  18. Size=LENB(S)
  19. LL=""
  20. GenLabel=1
  21. init
  22. PrintStr("[GenLabel]")
  23. Parse
  24. GenLabel=0
  25. init
  26. PrintStr("[Run]")
  27. Parse
  28. 待機
  29. *Parse
  30. Stack=""
  31. "Ptr<Size"で、ループ(
  32. GetByteで、条件分岐
  33. Spaceの時、impStack
  34. Tabの時、(
  35. GetByteで、条件分岐
  36. Spaceの時、impCalc
  37. Tabの時、impHeap
  38. LFの時、impIO
  39. )
  40. LFの時、impFlow
  41. もし、MOD(Count,10)=0ならば、描画処理反映
  42. Count=Count+1
  43. )
  44. 戻る
  45. *init
  46. Stack=""
  47. CallStack=""
  48. Heap=""
  49. Ptr=1
  50. Count=0
  51. 戻る
  52. '----IMP別ルーチン
  53. *impStack
  54. GetByte
  55. 条件分岐
  56. Spaceの時、(StackPush(GetNum);PrintStr("Push"))
  57. LFの時、(GetByteで、条件分岐
  58. Spaceの時、(StackCopy(0);PrintStr("CopyTop"))
  59. Tabの時、(StackSwap;PrintStr("Swap"))
  60. LFの時、(StackPop;PrintStr("Destroy"))
  61. )
  62. Tabの時、(
  63. GetByteで、条件分岐
  64. Spaceの時、(StackCopy(GetNum);PrintStr("Pick"))
  65. LFの時、(StackSlide(GetNum);PrintStr("Slide"))
  66. )
  67. 戻る
  68. *impCalc
  69. GetWord
  70. 条件分岐
  71. "{Space}{Space}"の時、(
  72. StackPop
  73. StackPush(StackPop+それ)
  74. PrintStr("Add")
  75. )
  76. "{Space}{Tab}"の時、(
  77. StackPop
  78. StackPush(StackPop-それ)
  79. PrintStr("Sub")
  80. )
  81. "{Space}{LF}"の時、(
  82. StackPop
  83. StackPush(StackPop*それ)
  84. PrintStr("Mul")
  85. )
  86. "{Tab}{Space}"の時、(
  87. StackPop
  88. StackPush(StackPop/それ)
  89. PrintStr("Div")
  90. )
  91. "{Tab}{Tab}"の時、(
  92. StackPop
  93. StackPush(MOD(StackPop,それ))
  94. PrintStr("Mod")
  95. )
  96. その他の時、Error("構文エラー:Calc.{それ}")
  97. 戻る
  98. *impHeap
  99. GetByte
  100. 条件分岐
  101. Spaceの時、(StackPop;Heap#それ=StackPop;PrintStr("Store"))
  102. Tabの時、(StackPush(Heap#StackPop);PrintStr("Retrieve"))
  103. その他の時、Error("構文エラー:Heap.{それ}")
  104. 戻る
  105. *impFlow
  106. GetWord
  107. 条件分岐
  108. "{Space}{Space}"の時、(
  109. GetString
  110. もし、GenLabelならば、(LLの、それ=Ptr;PrintStr("CreateLabel"))
  111. )
  112. "{Space}{Tab}"の時、(
  113. GetString
  114. CallStack=CallStack&"{Ptr}\n"
  115. Ptr=(LLの、それ)
  116. PrintStr("Call")
  117. )
  118. "{Space}{LF}"の時、(Ptr=(LLの、GetString);PrintStr("Jump");)
  119. "{Tab}{Space}"の時、(
  120. GetString
  121. もし、(GenLabel=0)&&(StackPop=0)ならば、Ptr=(LLの、それ);PrintStr("JumpZero")
  122. )
  123. "{Tab}{LF}"の時、(
  124. もし、(GenLabel=0)&&(CallStack="")ならば、Error("Returnエラー:戻り先が不明")
  125. Ptr=CallStack#0
  126. CallStack=行削除(CallStack,0)
  127. )
  128. "{Tab}{Tab}"の時、(
  129. GetString
  130. もし、(GenLabel=0)&&(StackPop<0)ならば、Ptr=(LLの、それ);PrintStr("JumpNegative")
  131. )
  132. "{LF}{LF}"の時、(Ptr=Size;PrintStr("End"))
  133. その他の時、Error("構文エラー:Flow.{それ}")
  134. もし、GenLabelならば、Ptr=PtrT
  135. 戻る
  136. *impIO
  137. GetWord
  138. 条件分岐
  139. "{Space}{Space}"の時、(StackPop;Print;PrintStr("PrintCh"))
  140. "{Space}{Tab}"の時、(PrintNum(StackPop);PrintStr("PrintNum"))
  141. "{Tab}{Space}"の時、もし、GenLabel=0ならば(尋ねる("Char");StackPush(ASC(MID(それ,1,1))))
  142. "{Tab}{Tab}"の時、もし、GenLabel=0ならば(尋ねる("Num");StackPush(それ))
  143. その他の時、Error("構文エラー:IO.{それ}")
  144. 戻る
  145. '----補助関数
  146. *Print(?)
  147. 'PrintStr("Print")
  148. もし、GenLabel<>0ならば、戻る
  149. 引数取得
  150. もし、それ=10ならば、それ="\n"
  151. 違えば、CHR(それ)
  152. StdOut=StdOut&それ
  153. 戻る
  154. *PrintNum(?)
  155. もし、GenLabel=0ならば、StdOut=StdOut&"{引数取得}"
  156. 戻る
  157. *PrintStr(?)
  158. PrintMemo=PrintMemo&"{Ptr}:{引数取得}\n"
  159. 戻る
  160. *GetByte
  161. MID(S,Ptr,1)
  162. Ptr=Ptr+1
  163. PtrT=Ptr
  164. 戻る
  165. *GetWord
  166. MID(S,Ptr,2)
  167. Ptr=Ptr+2
  168. PtrT=Ptr
  169. 戻る
  170. *StackPush(?)
  171. 引数取得
  172. Stack=それ&"\n"&Stack
  173. StackMemo=Stack
  174. 'PrintStr("Push{それ}")
  175. 戻る
  176. *StackPop
  177. 表示() //NOP
  178. それ=Stack#0
  179. Stack=行削除(Stack,0)
  180. StackMemo=Stack
  181. 'PrintStr("Pop")
  182. 戻る
  183. 'Top=0
  184. *StackCopy(?)
  185. 引数取得
  186. StackPush(Stack#それ)
  187. 'PrintStr("Copy{それ}")
  188. 戻る
  189. *StackSlide(?)
  190. 引数取得回、Stack=行削除(Stack,1)
  191. StackMemo=Stack
  192. 'PrintStr("Slide{それ}")
  193. 戻る
  194. *StackSwap
  195. StackPush(Stack#1)
  196. Stack=行削除(Stack,2)
  197. StackMemmo=Stack
  198. 'PrintStr("Swap")
  199. 戻る
  200. *Jump(?)
  201. もし、LL=""ならば、戻る
  202. 戻る
  203. *GetNum
  204. Sign=GetByte
  205. D=""
  206. 1で、ループ(GetByte;もし、それ=LFならば、抜ける;D=D&(それ=Tab))
  207. もし、D=""ならば、それ=0
  208. 違えば(
  209. BinDec(D)
  210. もし、Sign=Tabならば、それ=それ*(-1)
  211. )
  212. 戻る
  213. *GetString
  214. D=""
  215. 1で、ループ(GetByte;もし、それ=LFならば、抜ける;D=D&それ)
  216. それ=D
  217. 戻る
  218. *Error(?)
  219. 言う(引数取得)
  220. Ptr=Size
  221. 戻る
  222. *BinDec(?)
  223. ローカル変数(in)
  224. in=引数得(1)
  225. それ=0
  226. (LEN(in))回、(
  227. それ=SHL(それ,1)+左端切取(in,1)
  228. )
  229. 戻る
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty