Advertisement
Jakowlew

bf

Mar 12th, 2018
389
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 2.56 KB | None | 0 0
  1. local bf = {}
  2.  
  3. function bf:new(code)
  4.   local obj = { code }
  5.  
  6.   obj.code = code
  7.  
  8.   self.__index = self
  9.   return setmetatable(obj, self)
  10. end
  11. -- validate brainfuck code
  12. -- return 0 if code is valid
  13. -- return > 0 if opening bracket(s) missing
  14. -- return < 0 if closing bracket(s) missing
  15. function bf:validate()
  16.   local len, brackets = string.len(self.code), 0
  17.   for i = 1, len do
  18.     local char = string.byte(self.code, i)
  19.     if char == 91 then brackets = brackets + 1 -- 91 equ [
  20.     elseif char == 93 then brackets = brackets - 1 end -- 93 equ ]
  21.   end
  22.  
  23.   return brackets
  24. end
  25.  
  26. function bf:getError(errorCode)
  27.   if errorCode == 0 then
  28.     return "Code is valid"
  29.   elseif errorCode > 0 then
  30.     return "Error: Opening bracket(s) missing"
  31.   elseif errorCode < 0 then
  32.     return "Error: Closing bracket(s) missing"
  33.   else
  34.     return "Error: Unknown error"
  35.   end
  36. end
  37.  
  38. function bf:run()
  39.   errorCode = self:validate()
  40.   if errorCode ~= 0 then
  41.     return self:getError(errorCode)
  42.   end
  43.  
  44.   local memSize, range = 30000, 256
  45.   -- lvl is loop depth level
  46.   local mem, ptr, lvl = {}, 0, 0
  47.  
  48.   -- clear memory
  49.   for i = 0, memSize do mem[i] = 0 end
  50.  
  51.   -- run program
  52.   local i, len = 0, string.len(self.code)
  53.   while i <= len do
  54.     i = i + 1
  55.    
  56.     local char = string.byte(self.code, i)
  57.     -- 43 equ +
  58.     if char == 43 then mem[ptr] = (mem[ptr] + 1) % range
  59.     -- 45 equ -
  60.     elseif char == 45 then
  61.       if mem[ptr] > 0 then mem[ptr] = mem[ptr] - 1
  62.       else mem[ptr] = range - 1 end
  63.     -- 44 equ ,
  64.     elseif char == 44 then mem[ptr] = string.byte(io.stdin:read("*L"), 1)
  65.     -- 46 equ .
  66.     elseif char == 46 then io.stdout:write(string.char(mem[ptr]))
  67.     -- 60 equ <
  68.     elseif char == 60 then
  69.       ptr = ptr - 1
  70.       if ptr < 0 then ptr = memSize end
  71.     -- 62 equ >
  72.     elseif char == 62 then
  73.       ptr = ptr + 1
  74.       if ptr > memSize then ptr = 0 end
  75.     -- 91 equ [
  76.     elseif char == 91 then
  77.       if mem[ptr] == 0 then
  78.         while string.byte(self.code, i) ~= 93 or lvl > 0 do
  79.           i = i + 1
  80.           if string.byte(self.code, i) == 91 then lvl = lvl + 1 end
  81.           if string.byte(self.code, i) == 93 then lvl = lvl - 1 end
  82.         end
  83.       end
  84.     -- 93 equ [
  85.     elseif char == 93 then
  86.       if mem[ptr] ~= 0 then
  87.         while (string.byte(self.code, i) ~= 91) or (lvl > 0) do
  88.             i = i - 1
  89.             if string.byte(self.code, i) == 91 then lvl = lvl - 1 end
  90.             if string.byte(self.code, i) == 93 then lvl = lvl + 1 end
  91.         end
  92.       end
  93.     end
  94.   end
  95. end
  96.  
  97. return bf
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement