Advertisement
Rawoas13

Brainfuck

Aug 22nd, 2020
383
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 2.57 KB | None | 0 0
  1. brainfuck = {}
  2.  
  3. brainfuck.errorC = {
  4.     [1] = "Closing brackets are missed!",
  5.     [2] = "Openin brackets are missed!",
  6.     [3] = "No source!",
  7.     [4] = "Unknown error"
  8. }
  9.  
  10. brainfuck.verify = function(s)
  11.     local error,l = 0,0
  12.     for i = 1,#s,1 do
  13.         if s:byte(i) == 91 then
  14.             l = l + 1
  15.         elseif s:byte(i) == 93 then
  16.             l = l - 1
  17.             if l < 0 then
  18.                 return 2
  19.             end
  20.         end
  21.     end
  22.     if l > 0 then
  23.         return 1
  24.     elseif l < 0 then
  25.         return 2
  26.     else
  27.         return 0
  28.     end
  29. end
  30.  
  31. brainfuck.error = function(x)
  32.     error(brainfuck.errorC[x or 4])
  33. end
  34.  
  35. brainfuck.token = function(s)
  36.     local size,max,m,p,l = 3e4,255,{},0,0,0
  37.     local toReturn = {}
  38.     for i = 0,size,1 do
  39.         m[i] = 0
  40.     end
  41.     i = 0
  42.     while i <= #s do
  43.         i = i + 1
  44.         if s:byte(i) == 43 then
  45.             if m[p] < max then
  46.                 m[p] = m[p] + 1
  47.             end
  48.         elseif s:byte(i) == 45 then
  49.             if m[p] > 0 then
  50.                 m[p] = m[p] - 1
  51.             end
  52.         elseif s:byte(i) == 44 then
  53.             local copy = s:match("(.-)\n")
  54.             m[p] = copy:byte(1)
  55.         elseif s:byte(i) == 46 then
  56.             table.insert(toReturn,tostring(m[p]):char())
  57.         elseif s:byte(i) == 60 then
  58.             p = p - 1
  59.             if p < 0 then
  60.                 p = 0
  61.             end
  62.         elseif s:byte(i) == 62 then
  63.             p = p + 1
  64.             if p > size then
  65.                 p = size
  66.             end
  67.         elseif s:byte(i) == 91 then
  68.             if m[p] == 0 then
  69.                 while s:byte(i)~=93 or l>0 do
  70.                     i = i + 1
  71.                     if s:byte(i) == 91 then
  72.                         l = l + 1
  73.                     end
  74.                     if s:byte(i) == 93 then
  75.                         l = l - 1
  76.                     end
  77.                 end
  78.             end
  79.         elseif s:byte(i) == 93 then
  80.             if m[p] ~= 0 then
  81.                 while s:byte(i)~=91 or l>0 do
  82.                     i = i - 1
  83.                     if s:byte(i) == 91 then
  84.                         l = l - 1
  85.                     end
  86.                     if s:byte(i) == 93 then
  87.                         l = l + 1
  88.                     end
  89.                 end
  90.             end
  91.         end
  92.     end
  93.     return table.concat(toReturn,nil,1,#toReturn-1)
  94. end
  95.  
  96. brainfuck.compile = function(s)
  97.     local error = brainfuck.verify(s)
  98.     if error == 0 then
  99.         return brainfuck.token(s)
  100.     else
  101.         brainfuck.error(error)
  102.     end
  103. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement