local L = require "lpeg"
local ws = L.S" \r\n\t"^0 -- whitespace
local id = L.C(L.R("az","AZ","09")^1) -- identifiers
local value = id -- values (currently same as identifiers)
local entry = ws * id * ws * value + L.V(1) -- key value OR block
local function makepairs(kvkv_array)
local t = {}
for i = 1, #kvkv_array, 2 do
t[kvkv_array[i]] = kvkv_array[i+1]
end
return t
end
local pattern = L.P {ws * id * ws * "{" * (L.Ct(entry^0) / makepairs) * ws * "}"} / function(k, v)
return {[k] = v}
end
local result = pattern:match[[
blockname1 {
key1 value1
key2 value2
blockname2 {
key3 value3
blockname3 {
key4 value4
}
key5 value5
}
}
]]
function pretty(t, prefix)
print("{")
for k, v in pairs(t) do
io.write(prefix .. k .. " = ")
if type(v) == "table" then
pretty(v, prefix .. " ")
else
print(v)
end
end
print(prefix .. "}")
end
pretty(result, "")