I have already solved the first problem.

I had forgotten about the second one. I'll get right on that. Shouldn't be hard.

Actually, default textutils.unserialize works perfectly with this. At least it does with this example text of 621 lines representing some lasm language details.

## Spoiler

```
{
symbols = {
[")"] = true,
["("] = true
},
keywords = {
[".arguments"] = true,
[".options"] = true,
[".stacksize"] = true,
[".local"] = true,
[".upvalue"] = true,
[".argcount"] = true,
[".const"] = true,
[".params"] = true,
[".vararg"] = true,
[".upval"] = true,
[".end"] = true,
[".args"] = true,
[".function"] = true,
[".func"] = true,
[".maxstacksize"] = true
},
opcodes = {
NOT = {
type = "iABC",
arguments = {
{
type = "R",
index = "A"
},
{
type = "R",
index = "B"
}
},
code = 19
},
LOADK = {
type = "iABx",
arguments = {
{
type = "R",
index = "A"
},
{
type = "C",
index = "Bx"
}
},
code = 1
},
SETTABLE = {
type = "iABC",
arguments = {
{
type = "R",
index = "A"
},
{
type = "RK",
index = "B"
},
{
type = "RK",
index = "C"
}
},
code = 9
},
CLOSE = {
type = "iABC",
arguments = {
{
type = "R",
index = "A"
}
},
code = 35
},
GETTABLE = {
type = "iABC",
arguments = {
{
type = "R",
index = "A"
},
{
type = "R",
index = "B"
},
{
type = "RK",
index = "C"
}
},
code = 6
},
DIV = {
type = "iABC",
arguments = {
{
type = "R",
index = "A"
},
{
type = "RK",
index = "B"
},
{
type = "RK",
index = "C"
}
},
code = 15
},
TEST = {
type = "iABC",
arguments = {
{
type = "R",
index = "A"
},
{
type = "N",
index = "C"
}
},
code = 26
},
ADD = {
type = "iABC",
arguments = {
{
type = "R",
index = "A"
},
{
type = "RK",
index = "B"
},
{
type = "RK",
index = "C"
}
},
code = 12
},
SETLIST = {
type = "iABC",
arguments = {
{
type = "R",
index = "A"
},
{
type = "N",
index = "B"
},
{
type = "N",
index = "C"
}
},
code = 34
},
TFORLOOP = {
type = "iABC",
arguments = {
{
type = "R",
index = "A"
},
{
type = "N",
index = "C"
}
},
code = 33
},
LOADBOOL = {
type = "iABC",
arguments = {
{
type = "R",
index = "A"
},
{
type = "N",
index = "B"
},
{
type = "N",
index = "C"
}
},
code = 2
},
TESTSET = {
type = "iABC",
arguments = {
{
type = "R",
index = "A"
},
{
type = "R",
index = "B"
},
{
type = "N",
index = "C"
}
},
code = 27
},
FORLOOP = {
type = "iAsBx",
arguments = {
{
type = "R",
index = "A"
},
{
type = "N",
index = "sBx"
}
},
code = 31
},
UNM = {
type = "iABC",
arguments = {
{
type = "R",
index = "A"
},
{
type = "R",
index = "B"
}
},
code = 18
},
CALL = {
type = "iABC",
arguments = {
{
type = "R",
index = "A"
},
{
type = "N",
index = "B"
},
{
type = "N",
index = "C"
}
},
code = 28
},
EQ = {
type = "iABC",
arguments = {
{
type = "R",
index = "A"
},
{
type = "RK",
index = "B"
},
{
type = "RK",
index = "C"
}
},
code = 23
},
LT = {
type = "iABC",
arguments = {
{
type = "R",
index = "A"
},
{
type = "RK",
index = "B"
},
{
type = "RK",
index = "C"
}
},
code = 24
},
RETURN = {
type = "iABC",
arguments = {
{
type = "R",
index = "A"
},
{
type = "N",
index = "B"
}
},
code = 30
},
JMP = {
type = "iAsBx",
arguments = {
{
type = "N",
index = "sBx"
}
},
code = 22
},
CLOSURE = {
type = "iABx",
arguments = {
{
type = "R",
index = "A"
},
{
type = "P",
index = "Bx"
}
},
code = 36
},
SETGLOBAL = {
type = "iABx",
arguments = {
{
type = "R",
index = "A"
},
{
type = "C",
index = "Bx"
}
},
code = 7
},
MUL = {
type = "iABC",
arguments = {
{
type = "R",
index = "A"
},
{
type = "RK",
index = "B"
},
{
type = "RK",
index = "C"
}
},
code = 14
},
TAILCALL = {
type = "iABC",
arguments = {
{
type = "R",
index = "A"
},
{
type = "N",
index = "B"
}
},
code = 29
},
POW = {
type = "iABC",
arguments = {
{
type = "R",
index = "A"
},
{
type = "RK",
index = "B"
},
{
type = "RK",
index = "C"
}
},
code = 17
},
CONCAT = {
type = "iABC",
arguments = {
{
type = "R",
index = "A"
},
{
type = "R",
index = "B"
},
{
type = "R",
index = "C"
}
},
code = 21
},
GETUPVAL = {
type = "iABC",
arguments = {
{
type = "R",
index = "A"
},
{
type = "U",
index = "B"
}
},
code = 4
},
NEWTABLE = {
type = "iABC",
arguments = {
{
type = "R",
index = "A"
},
{
type = "N",
index = "B"
},
{
type = "N",
index = "C"
}
},
code = 10
},
SETUPVAL = {
type = "iABC",
arguments = {
{
type = "R",
index = "A"
},
{
type = "U",
index = "B"
}
},
code = 8
},
SELF = {
type = "iABC",
arguments = {
{
type = "R",
index = "A"
},
{
type = "R",
index = "B"
},
{
type = "RK",
index = "C"
}
},
code = 11
},
SUB = {
type = "iABC",
arguments = {
{
type = "R",
index = "A"
},
{
type = "RK",
index = "B"
},
{
type = "RK",
index = "C"
}
},
code = 13
},
LOADNIL = {
type = "iABC",
arguments = {
{
type = "R",
index = "A"
},
{
type = "R",
index = "B"
}
},
code = 3
},
LEN = {
type = "iABC",
arguments = {
{
type = "R",
index = "A"
},
{
type = "R",
index = "B"
}
},
code = 20
},
FORPREP = {
type = "iAsBx",
arguments = {
{
type = "R",
index = "A"
},
{
type = "N",
index = "sBx"
}
},
code = 32
},
MOD = {
type = "iABC",
arguments = {
{
type = "R",
index = "A"
},
{
type = "RK",
index = "B"
},
{
type = "RK",
index = "C"
}
},
code = 16
},
VARARG = {
type = "iABC",
arguments = {
{
type = "R",
index = "A"
},
{
type = "N",
index = "B"
}
},
code = 37
},
MOVE = {
type = "iABC",
arguments = {
{
type = "R",
index = "A"
},
{
type = "R",
index = "B"
}
},
code = 0
},
LE = {
type = "iABC",
arguments = {
{
type = "R",
index = "A"
},
{
type = "RK",
index = "B"
},
{
type = "RK",
index = "C"
}
},
code = 25
},
GETGLOBAL = {
type = "iABx",
arguments = {
{
type = "R",
index = "A"
},
{
type = "C",
index = "Bx"
}
},
code = 5
}
}
}
```

Which was originally written in json with my json API. But then I used these textutils functions to tranlate it, which is where I noticed the first problem you pointed out. Again, I fixed that. So now I just need to do stop recursive entries.

EDIT: Got it fixed. Only took a couple of minutes. Yea writing this quickly after a night of no sleep because I was working on various other things does not make for a programmer fit to remember all problems on the first version =P