User:Iconmaster/rb.lua
Jump to navigation
Jump to search
This is a program that implemets ] in Lua.
---------------------------
--
-- ] Interpreter
-- Made by Iconmaster
-- Implements ] programs.
--
---------------------------
function ex()
print("Invalid ] Program!")
--io.read()
os.exit()
end
function check(orig)
local inp
inp = orig:gsub("%b()","")
inp = inp:gsub("%b<>","")
inp = inp:gsub("%b[]","")
inp = inp:gsub("%b{}","")
if orig:match("[%(%)]") and not inp:match("[%(%)]") then return false end
if orig:match("[%<%>]") and not inp:match("[%<%>]") then return false end
if orig:match("[%[%]]") and not inp:match("[%[%]]") then return false end
if orig:match("[%{%}]") and not inp:match("[%{%}]") then return false end
return true
end
if not args or not args[1] then
io.write("Enter ] program:")
inp = io.read("*l")
else
inp = args[1]
end
if not check(inp) then ex() end
if inp:match("[^%(%)%<%>%{%}%[%]]") then ex() end
ptr = 1
stk = {}
mstk = {}
while true do
if ptr > #inp then break end
cmd = inp:sub(ptr,ptr)
if cmd=="(" then
table.insert(stk,true)
elseif cmd==")" then
table.insert(stk,false)
elseif cmd=="<" then
table.remove(stk)
elseif cmd==">" then
s1,s2 = table.remove(stk),table.remove(stk)
table.insert(stk,s1)
table.insert(stk,s2)
elseif cmd=="{" then
if stk[#stk] then
level = 0
repeat
ptr = ptr + 1
if inp:sub(ptr,ptr)=="{" then level = level + 1 end
if inp:sub(ptr,ptr)=="}" then level = level - 1 end
until level == -1
end
elseif cmd=="}" then
if stk[#stk] then
level = 0
repeat
ptr = ptr - 1
if inp:sub(ptr,ptr)=="{" then level = level + 1 end
if inp:sub(ptr,ptr)=="}" then level = level - 1 end
until level == -1
end
elseif cmd=="[" then
table.insert(mstk,stk)
stk = {}
elseif cmd=="]" then
stk = {unpack(stk),unpack(table.remove(mstk))}
end
end
--io.read()