Execute Brain****/Lua: Difference between revisions
Content added Content deleted
m (Changed `io.read()` to `io.read("*all")` (reads the entire input until EOF, not just one line).) |
m (Fixed syntax highlighting.) |
||
Line 2: | Line 2: | ||
An implementation of a Brainf*** interpreter in [[Lua]]. |
An implementation of a Brainf*** interpreter in [[Lua]]. |
||
< |
<syntaxhighlight lang="lua">memory = {0} --memory is bounded on one side, at 1 |
||
program = io.read("*all") |
program = io.read("*all") |
||
Line 66: | Line 66: | ||
if instr then instr() end |
if instr then instr() end |
||
instruction = instruction + 1 |
instruction = instruction + 1 |
||
end</ |
end</syntaxhighlight> |
Latest revision as of 11:45, 1 September 2022
Execute Brain****/Lua is an implementation of Brainf***.
Other implementations of Brainf***.
Execute Brain****/Lua is part of RCBF. You may find other members of RCBF at Category:RCBF.
An implementation of a Brainf*** 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