65 lines
1.4 KiB
Lua
65 lines
1.4 KiB
Lua
local C = 0
|
|
local class_registry = {}
|
|
local function class()
|
|
C = C + 1
|
|
class_registry[C] = {}
|
|
return C
|
|
end
|
|
local link = function(a,c,v,b)
|
|
if not a[c] then a[c] = {} end
|
|
if not b[-c] then b[-c] = {} end
|
|
a[c][b] = v
|
|
b[-c][a] = v
|
|
end
|
|
local classes = {}
|
|
for character in ("abcdefghijklmnopqrstuvwxyz "):gmatch(".") do
|
|
classes[character] = class()
|
|
end
|
|
classes.next = class()
|
|
classes.inp = class()
|
|
classes.out = class()
|
|
local function l(a,c,v,b)
|
|
|
|
end
|
|
local function r(it)
|
|
for class,link in pairs(it) do
|
|
for to,value in pairs(link) do
|
|
r(to)
|
|
if class > 0 then
|
|
l(it,class,value,to)
|
|
else
|
|
l(to,-class,value,it)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
while true do
|
|
local input = io.read()
|
|
local command,param = input:match("([^%s]+)(.*)")
|
|
local function say(author,text)
|
|
local previous
|
|
for character in text:gmatch(".") do
|
|
if classes[character] then
|
|
local it = {}
|
|
if previous then
|
|
link(previous,classes.next,I,it)
|
|
end
|
|
link(it,classes.inp,I,{})
|
|
link(it,classes[character],I,{})
|
|
previous = it
|
|
r(it)
|
|
end
|
|
end
|
|
end
|
|
(({
|
|
["inp"] = function(text)
|
|
say(classes.inp,text)
|
|
end,
|
|
["out"] = function(text)
|
|
say(classes.out,text)
|
|
end,
|
|
["exit"] = function()
|
|
os.exit()
|
|
end
|
|
})[command] or function(param) print("Unexpected command: '"..command.."' for '"..param.."''") end)(param)
|
|
end
|