⚠️ Warning: This is a draft ⚠️
This means it might contain formatting issues, incorrect code, conceptual problems, or other severe issues.
If you want to help to improve and eventually enable this page, please fork RosettaGit's repository and open a merge request on GitHub.
{{implementation|Brainfuck}}{{collection|RCBF}}
An implementation of a Brainfuck interpreter in [[Lua]].
memory = {0} --memory is bounded on one side, at 1 program = io.read("*all") pointer = 1 instruction = 1 retpoints = {} functions = { [">"] = function() pointer = pointer + 1 if not memory[pointer] then memory[pointer] = 0 end end, ["<"] = function() if pointer == 1 then error"Memory out-of-bounds!" end pointer = pointer - 1 end, ["+"] = function() memory[pointer] = memory[pointer] + 1 end, ["-"] = function() memory[pointer] = memory[pointer] - 1 end, ["["] = function() if memory[pointer] ~= 0 then table.insert(retpoints, instruction) else -- if the memory at the pointer is zero, jump to the matching close bracket local b = 1 -- b stores number of unclosed brackets (when b == 0 the match has been found) while instruction <= #program and b ~= 0 do instruction = instruction + 1 if program:sub(instruction, instruction) == "[" then b = b + 1 elseif program:sub(instruction, instruction) == "]" then b = b - 1 end end if b ~= 0 then error"Missing ']'!" end end end, ["]"] = function() if #retpoints > 0 then if memory[pointer] ~= 0 then instruction = retpoints[#retpoints] else table.remove(retpoints) end else error"Missing '['!" end end, ["."] = function() io.write(string.char(memory[pointer])) end, [","] = function() memory[pointer] = io.read():byte() end} while instruction <= #program do local instr = functions[program:sub(instruction,instruction)] if instr then instr() end instruction = instruction + 1 end