Advertisement
Necr0

MoonScript TISfuck Interpreter

Aug 16th, 2017
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 4.73 KB | None | 0 0
  1. class TISfuck
  2.     maximum_runtime: 16384
  3.    
  4.     new: (code,input,output_callback) =>
  5.         @code=code
  6.         @input=input
  7.         @output_callback=output_callback
  8.         @matrix={0}
  9.         @memory_pointer=1
  10.         @col_pointer=1
  11.         @line_pointer=1
  12.         @tranferable_memory=0
  13.    
  14.     shift_right: =>
  15.         num=@try_read_number!
  16.         @memory_pointer += (num or 1)
  17.         if @matrix[@memory_pointer]==nil
  18.             @matrix[@memory_pointer]=0
  19.     shift_left: =>
  20.         num=@try_read_number!
  21.         @memory_pointer -= (num or 1)
  22.         if @matrix[@memory_pointer]==nil
  23.             @matrix[@memory_pointer]=0
  24.    
  25.     increment: =>
  26.         num=@try_read_number!
  27.         @set_value (@get_value!+(num or 1))%256
  28.     decrement: =>
  29.         num=@try_read_number!
  30.         @set_value (@get_value!-(num or 1))%256
  31.    
  32.     jump_forward: =>
  33.         num=@try_read_number true
  34.         if @get_value! == (num or 0)
  35.             depth = 0
  36.             while true
  37.                 if @move_forward!
  38.                     return nil
  39.                 switch @get_current_char!
  40.                     when "["
  41.                         depth += 1
  42.                     when "]"
  43.                         if depth == 0
  44.                             @try_read_number!
  45.                             return nil
  46.                         else
  47.                             depth -= 1
  48.                     when nil
  49.                         return nil
  50.         else
  51.             @try_read_number
  52.     jump_backward: =>
  53.         num=@try_read_number true
  54.         if @get_value! != (num or 0)
  55.             depth = 0
  56.             while true
  57.                 if @move_backward!
  58.                     return nil
  59.                 switch @get_current_char!
  60.                     when "["
  61.                         if depth == 0
  62.                             @try_read_number!
  63.                             return nil
  64.                         else
  65.                             depth -= 1
  66.                     when "]"
  67.                         depth += 1
  68.                     when nil
  69.                         return nil
  70.         else
  71.             @try_read_number
  72.    
  73.     halt: =>
  74.         num=@try_read_number!
  75.         if(num!=nil)
  76.             return @get_value! == num
  77.         return true
  78.    
  79.     set: =>
  80.         num=@try_read_number!
  81.         @set_value (num or 0)
  82.     set_tranferable: =>
  83.         num=@try_read_number!
  84.         @tranferable_memory = (num==nil and @get_value! or num)%256
  85.    
  86.     jump_upward: =>
  87.         num=@try_read_number!
  88.         @set_line(@line_pointer-(num or 1))
  89.     jump_downward: =>
  90.         num=@try_read_number!
  91.         @set_line(@line_pointer+(num or 1))
  92.    
  93.     swap_memory: =>
  94.         buf = @get_value!
  95.         @set_value @tranferable_memory
  96.         @tranferable_memory = buf
  97.    
  98.     try_read_number: (move_back) =>
  99.         line,col = @line_pointer,@col_pointer
  100.         if @move_forward! != true
  101.             cur_char = @get_current_char!
  102.             if cur_char=="~"
  103.                 if(move_back)
  104.                     @line_pointer,@col_pointer=line,col
  105.                 else
  106.                     @move_forward!
  107.                 return get_value
  108.             elseif cur_char=="?"
  109.                 if(move_back)
  110.                     @line_pointer,@col_pointer=line,col
  111.                 else
  112.                     @move_forward!
  113.                 return @tranferable_memory
  114.             elseif (string.find cur_char, "[A-F0-9~?]") != nil
  115.                 num=cur_char
  116.                 if @move_forward! != true
  117.                     if (string.find @get_current_char!, "[A-F,0-9]") != nil
  118.                         num..=@get_current_char!
  119.                         @move_forward!
  120.                 if(move_back)
  121.                     @line_pointer,@col_pointer=line,col
  122.                 return tonumber(num,16)
  123.             else
  124.                 if(move_back)
  125.                     @line_pointer,@col_pointer=line,col
  126.                 return nil
  127.         else
  128.             if(move_back)
  129.                 @line_pointer,@col_pointer=line,col
  130.             return nil
  131.    
  132.     read_input: =>
  133.         char = string.sub @input, 1, 1
  134.         if char!=""
  135.             @set_value string.byte char
  136.         else
  137.             @set_value 0
  138.         @input = string.sub @input, 2
  139.        
  140.     move_forward: =>
  141.         @col_pointer+=1
  142.         if @get_current_char! == nil
  143.             @set_line(@line_pointer+1)
  144.             return true
  145.     move_backward: =>
  146.         @col_pointer-=1
  147.         if @get_current_char! == nil
  148.             @set_line(@line_pointer-1)
  149.             return true
  150.        
  151.     set_line: (l) =>
  152.         @line_pointer = ((l-1) % #@code)+1
  153.         @col_pointer = 1
  154.     get_current_line: (l) =>
  155.         @get_line(@line_pointer)
  156.     get_line: (l) =>
  157.         @code[((l-1) % #@code)+1]
  158.    
  159.     get_char: (l,c) =>
  160.         if(c>#@code[l] or c<1)
  161.             return nil
  162.         else
  163.             return string.sub @code[l], c, c
  164.     get_current_char: => @get_char(@line_pointer,@col_pointer)
  165.    
  166.     get_value: => @matrix[@memory_pointer]
  167.     set_value: (value) => @matrix[@memory_pointer]=value
  168.    
  169.     append_input: (input) => @input ..= input
  170.    
  171.     step: =>
  172.         ret = nil
  173.         switch @get_current_char!
  174.             when "["
  175.                 @jump_forward!
  176.             when "]"
  177.                 @jump_backward!
  178.             when "+"
  179.                 @increment!
  180.             when "-"
  181.                 @decrement!
  182.             when "."
  183.                 num=@try_read_number!
  184.                 ret=string.char (num or @get_value!)
  185.                 if @output_callback != nil
  186.                     @output_callback ret
  187.             when ","
  188.                 @read_input!
  189.                 @move_forward!
  190.             when ">"
  191.                 @shift_right!
  192.             when "<"
  193.                 @shift_left!
  194.             when ";"
  195.                 if @halt!
  196.                     return false
  197.             when "*"
  198.                 @set!
  199.             when "!"
  200.                 @set_tranferable!
  201.             when "^"
  202.                 @jump_upward!
  203.             when "v"
  204.                 @jump_downward!
  205.             when ":"
  206.                 @swap_memory!
  207.                 @move_forward!
  208.             when nil
  209.                 return false
  210.         ret
  211.    
  212.     run: =>
  213.         output=""
  214.         for i=1,@maximum_runtime
  215.             step=@step!
  216.             if step==false
  217.                 break
  218.             elseif step!=nil
  219.                 output ..= step
  220.         output
  221.  
  222. --print TISfuck({".48.65*6C...6F.20.57.6F.72..64.21;"},"")\run!
  223. print TISfuck({".48.65*6C...6F.20v.57.6F.72..64.21;",".46!:*6F..?.6B","+4..21;"},"")\run!
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement