Advertisement
12Me21

12basic ]=[ interpreter

Mar 13th, 2019
428
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.17 KB | None | 0 0
  1. CODE$=INPUT$()
  2. STRICT=TRUE
  3. STACK#=[]
  4. CALLSTACK#=[]
  5. I:NUMBER=0
  6. CHAR$:STRING
  7. DO
  8. NEXTCHAR()
  9. SWITCH CHAR$
  10. CASE "["
  11. VALUE=0
  12. SIGN=1
  13. DO
  14. NEXTCHAR()
  15. SWITCH CHAR$
  16. CASE "]"
  17. IF !DONOTHING THEN STACK#.PUSH(VALUE*SIGN)
  18. BREAK
  19. CASE "["
  20. IF VALUE==0 THEN SIGN=-1
  21. VALUE=VALUE*10
  22. CASE "="
  23. VALUE=VALUE+1
  24. CASE ""
  25. PRINT "ERROR: UNTERMINATED NUMBER LITERAL"
  26. IF STRICT THEN STOP
  27. ENDSWITCH
  28. LOOP
  29. CASE "="
  30. START=I-1
  31. OPERATION$=""
  32. DO
  33. NEXTCHAR()
  34. SWITCH CHAR$
  35. CASE "="
  36. SWITCH OPERATION$
  37. CASE "" 'end loop
  38. IF DONOTHING THEN
  39. LEVEL=LEVEL-1
  40. IF LEVEL==0 THEN
  41. DONOTHING=FALSE
  42. ENDIF
  43. ELSE
  44. IF CALLSTACK#.LENGTH() THEN
  45. I=CALLSTACK#.POP()
  46. ELSE
  47. I=0
  48. ENDIF
  49. ENDIF
  50. CASE "]" 'loop
  51. IF DONOTHING THEN
  52. LEVEL=LEVEL+1
  53. ELSE
  54. CALLSTACK#.PUSH(START)
  55. ENDIF
  56. CASE "[" 'while
  57. IF DONOTHING THEN
  58. LEVEL=LEVEL+1
  59. ELSE
  60. IF STACK#.GET(STACK#.LENGTH()-1) THEN
  61. CALLSTACK#.PUSH(START)
  62. ELSE
  63. DONOTHING=TRUE
  64. LEVEL=1
  65. ENDIF
  66. ENDIF
  67. CASE "][" 'function def
  68. IF DONOTHING THEN
  69. LEVEL=LEVEL+1
  70. ELSE
  71. STACK#.PUSH(I)
  72. DONOTHING=TRUE
  73. LEVEL=1
  74. ENDIF
  75. CASE "[]" 'function call
  76. IF !DONOTHING THEN
  77. CALLSTACK#.PUSH(I)
  78. I=POPSTACK()
  79. ENDIF
  80. ELSE
  81. PRINT "ERROR: UNDEFINED LOOP ",OPERATION$
  82. IF STRICT THEN STOP
  83. ENDSWITCH
  84. BREAK
  85. CASE "]"
  86. OPERATION$=OPERATION$+"]"
  87. CASE "["
  88. OPERATION$=OPERATION$+"["
  89. CASE ""
  90. PRINT "ERROR: UNTERMINATED LOOP OPERATOR"
  91. IF STRICT THEN STOP
  92. ENDSWITCH
  93. LOOP
  94. CASE "]"
  95. OPERATION$=""
  96. DO
  97. NEXTCHAR()
  98. SWITCH CHAR$
  99. CASE "["
  100. IF !DONOTHING THEN
  101. SWITCH OPERATION$
  102. CASE ""
  103. PRINT POPSTACK()
  104. CASE "="
  105. OUTPUT(POPSTACK().CHR$())
  106. CASE "]" 'input number 'dup
  107. A=POPSTACK()
  108. STACK#.PUSH(A)
  109. STACK#.PUSH(A)
  110. CASE "==" 'compare
  111. A=POPSTACK()
  112. B=POPSTACK()
  113. STACK#.PUSH(A==B) 'maybe do sign subtract?
  114. CASE "=]" 'add
  115. A=POPSTACK()
  116. B=POPSTACK()
  117. STACK#.PUSH(A+B)
  118. CASE "]=" 'subtract
  119. A=POPSTACK()
  120. B=POPSTACK()
  121. STACK#.PUSH(A-B)
  122. CASE "]]"
  123.  
  124. CASE "==]" 'input char
  125.  
  126. CASE "=]]" 'input num
  127.  
  128. ELSE
  129. PRINT "ERROR: UNDEFINED OPERATION",OPERATION$
  130. IF STRICT THEN STOP
  131. ENDSWITCH
  132. ENDIF
  133. BREAK
  134. CASE "]"
  135. OPERATION$=OPERATION$+"]"
  136. CASE "="
  137. OPERATION$=OPERATION$+"="
  138. CASE ""
  139. PRINT "ERROR: UNTERMINATED OPERATOR"
  140. IF STRICT THEN STOP
  141. ENDSWITCH
  142. LOOP
  143. CASE ""
  144. BREAK
  145. ENDSWITCH
  146. LOOP
  147. FUNC NEXTCHAR
  148. CHAR$=CODE$.MID$(I)I=I+1
  149. ENDFUNC
  150. FUNC POPSTACK
  151. IF STACK#.LENGTH() THEN RETURN STACK#.POP()
  152. RETURN 0
  153. ENDFUNC
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement