A data format used by our game engine. It's just like a simpler version of yaml, or an enhanced version of json.
key should be a string without space, use : to separate value.
a = datalist.parse [[
x : 1 # comments ...
y : 2
100 : number
]]
-- a = { x = 1, y = 2, ["100"] = "number" }
Or you can use datalist.parse_list to parse dictionary into a list with key value pairs.
a = datalist.parse_list [[
x : 1
y : 2
]]
-- a = { x , 1, y , 2 }
Use white space ( space, tab, cr, newline , etc) to separate atoms.
a = datalist.parse[[
hello "world"
0x1p+0 # hex float 1.0
2
0x3 # hex integer
nil
true
false
on # true
off # false
yes # true
no # false
]]
-- a = { "hello", "world", 1.0, 2, 3, nil, true, false, true, false, true, false }
--- can be used to separate sections of a list.
a = datalist.parse [[
---
x : hello
y : world
---
1 2 3
]]
-- a = { { x = "hello", y = "world" }, { 1,2,3 } }
a = datalist.parse [[
x :
1 2 3
y :
dict : "hello world"
z : { foobar }
]]
-- a = { x = { 1,2,3 }, y = { dict = "hello world" }, z = { "foobar" } }
b = datalist.parse [[
---
hello world
---
x : 1
y : 2
]]
-- a = { "hello", "world", { x = 1, y = 2 } }
tag is a 64bit hex integer id.
a = datalist.parse [[
--- &1 # This structure tagged by 1
"hello\nworld"
---
x : *1 # The value is the structure with tag 1
]]
-- a = { { "hello\nworld" } , { x = { "hello\nworld" } } }
The structure in [] would be convert by a user function.
a = datalist.parse( "[ 1, 2, 3 ]" , function (t)
local s = 0
for _, v in ipairs(t) do -- t = { 1,2,3 }
s = s + v
end
return s)
-- a = { 6 }
a = datalist.parse([[
[ sum 1 2 3 ]
[ vec 4 5 6 ]
]], function (t)
if t[1] == "sum" then
local s = 0
for i = 2, #t do
s = s + t[i]
end
elseif t[2] == "vec" then
table.remove(t, 1)
end
return t)
-- a = { 6 , { 4,5,6 } }