ForeverDev

Brainfuck interpreter

Oct 18th, 2014
286
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 2.13 KB | None | 0 0
  1. local loop = {false, {}}
  2. local pointer = 1
  3. local data = {}
  4. for index = 1, 32 do
  5.     data[index] = 0
  6. end
  7.  
  8. function customHandleChar(perform)
  9.     repeat
  10.         for special in perform:gmatch(".") do
  11.             if special == "+" then
  12.                 data[pointer] = data[pointer] + 1
  13.             elseif special == "-" then
  14.                 data[pointer] = data[pointer] - 1
  15.             elseif special == ">" then
  16.                 pointer = pointer + 1
  17.             elseif special == "<" then
  18.                 pointer = pointer - 1
  19.             elseif special == "," then
  20.                 data[pointer] = io.read():sub(1, 1):byte()
  21.             elseif special == "." then
  22.                 io.write(string.char(data[pointer > 0 and pointer or 32]))
  23.             end
  24.         end
  25.     until data[pointer] == 0
  26. end
  27.  
  28. function handleChar(char)
  29.     if not loop[1] then
  30.         if char == "[" then
  31.             loop[1] = true
  32.         elseif char == "+" then
  33.             data[pointer] = data[pointer] + 1
  34.         elseif char == "-" then
  35.             data[pointer] = data[pointer] - 1
  36.         elseif char == ">" then
  37.             pointer = pointer + 1
  38.         elseif char == "<" then
  39.             pointer = pointer - 1
  40.         elseif char == "," then
  41.             data[pointer] = io.read():sub(1, 1):byte()
  42.         elseif char == "." then
  43.             io.write(string.char(data[pointer > 0 and pointer or 32]))
  44.         end
  45.     else
  46.         if char == "]" then
  47.             customHandleChar(table.concat(loop[2]))
  48.             loop[1] = false
  49.             loop[2] = {}
  50.         else
  51.             table.insert(loop[2], char)
  52.         end
  53.     end
  54. end
  55.  
  56. function run(code)
  57.     code = code:gsub("/%*.-%*/", "")
  58.     for char in code:gmatch(".") do
  59.         handleChar(char)
  60.     end
  61. end
  62.  
  63. run([[
  64.  
  65.     +++++ +++++ [           /* set [1] to 10 */
  66.         >+++++ ++       /* increase [2] by 7 */
  67.         >+++++ +++++        /* increase [3] by 10 */
  68.         >+++++ +++++ +      /* increase [4] by 11 */
  69.         >+++++ +++++ +      /* increase [5] by 11 */
  70.         >+++++ +++++ +      /* increase [6] by 11 */
  71.         <<<<<-          /* decrease [1] by 1 */
  72.     ]
  73.     >++             /* increase [2] by 2, reaching byte of 'H' */
  74.     >+              /* increase [3] by 1, reaching byte of 'e' */
  75.     >--             /* decrease [4] by 2, reaching byte of 'l' */
  76.     >--             /* decrease [5] by 2, reaching byte of 'l' */
  77.     >+              /* increase [6] by 1, reaching byte of 'o' */
  78.    
  79.     [<]             /* return to [1], can loop because it is 0 */                                  
  80.     [>.]                /* print bytes, [7] is 0, therefore will not reach infinite loop */
  81.  
  82. ]])
Advertisement
Add Comment
Please, Sign In to add comment