Execute Brain****/Lua: Difference between revisions

From Rosetta Code
Content added Content deleted
No edit summary
Line 1: Line 1:
{{implementation|Brainf***}}{{collection|RCBF}}
{{implementation|Brainf***}}{{collection|RCBF}}
{{incorrect|Lua|Instead of jumping to the *next* close bracket when reaching a [ and memory[pointer] == 0, it should jump to the next *matching* close bracket such that embedded loops work}}
An implementation of a Brainf*** interpreter in [[Lua]].
An implementation of a Brainf*** interpreter in [[Lua]].
<lang lua>memory = {0} --memory is bounded on one side, at 1
<lang lua>memory = {0} --memory is bounded on one side, at 1
Line 29: Line 30:
if memory[pointer] ~= 0 then
if memory[pointer] ~= 0 then
table.insert(retpoints, instruction)
table.insert(retpoints, instruction)
else --if the pointer is zero, jump to the next close bracket
else
while program:sub(instruction, instruction) ~= "]" do
while program:sub(instruction, instruction) ~= "]" do
instruction = instruction + 1 --if the pointer is not zero, jump to the next close bracket
instruction = instruction + 1
end
end
end
end

Revision as of 14:24, 15 February 2012

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.
This example is incorrect. It does not accomplish the given task. Please fix the code and remove this message.

An implementation of a Brainf*** interpreter in Lua. <lang lua>memory = {0} --memory is bounded on one side, at 1

program = io.read() --loads an entire program at once, must not contain newlines

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 pointer is zero, jump to the next close bracket
   while program:sub(instruction, instruction) ~= "]" do
     instruction = instruction + 1
   end
 end

end, ["]"] = function()

 if memory[pointer] ~= 0 then
   instruction = retpoints[#retpoints]
 else
   table.remove(retpoints)
 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</lang>