⚠️ 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