1
0
Fork 0
mirror of https://github.com/Reuh/candran.git synced 2025-10-27 09:59:29 +00:00
candran/candran.lua

3110 lines
173 KiB
Lua

local function _() -- candran.can:2
local util = {} -- ./lib/util.can:1
util["search"] = function(modpath, exts) -- ./lib/util.can:3
if exts == nil then exts = { -- ./lib/util.can:3
"can", -- ./lib/util.can:3
"lua" -- ./lib/util.can:3
} end -- ./lib/util.can:3
for _, ext in ipairs(exts) do -- ./lib/util.can:4
for path in package["path"]:gmatch("[^;]+") do -- ./lib/util.can:5
local fpath = path:gsub("%.lua", "." .. ext):gsub("%?", (modpath:gsub("%.", "/"))) -- ./lib/util.can:6
local f = io["open"](fpath) -- ./lib/util.can:7
if f then -- ./lib/util.can:8
f:close() -- ./lib/util.can:9
return fpath -- ./lib/util.can:10
end -- ./lib/util.can:10
end -- ./lib/util.can:10
end -- ./lib/util.can:10
end -- ./lib/util.can:10
util["load"] = function(str, name, env) -- ./lib/util.can:16
if _VERSION == "Lua 5.1" then -- ./lib/util.can:17
local fn, err = loadstring(str, name) -- ./lib/util.can:18
if not fn then -- ./lib/util.can:19
return fn, err -- ./lib/util.can:19
end -- ./lib/util.can:19
return env ~= nil and setfenv(fn, env) or fn -- ./lib/util.can:20
else -- ./lib/util.can:20
if env then -- ./lib/util.can:22
return load(str, name, nil, env) -- ./lib/util.can:23
else -- ./lib/util.can:23
return load(str, name) -- ./lib/util.can:25
end -- ./lib/util.can:25
end -- ./lib/util.can:25
end -- ./lib/util.can:25
util["merge"] = function(...) -- ./lib/util.can:30
local r = {} -- ./lib/util.can:31
for _, t in ipairs({ ... }) do -- ./lib/util.can:32
for k, v in pairs(t) do -- ./lib/util.can:33
r[k] = v -- ./lib/util.can:34
end -- ./lib/util.can:34
end -- ./lib/util.can:34
return r -- ./lib/util.can:37
end -- ./lib/util.can:37
return util -- ./lib/util.can:40
end -- ./lib/util.can:40
local util = _() or util -- ./lib/util.can:44
package["loaded"]["lib.util"] = util or true -- ./lib/util.can:45
local function _() -- ./lib/util.can:48
local ipairs, pairs, setfenv, tonumber, loadstring, type = ipairs, pairs, setfenv, tonumber, loadstring, type -- ./lib/cmdline.lua:5
local tinsert, tconcat = table["insert"], table["concat"] -- ./lib/cmdline.lua:6
local function commonerror(msg) -- ./lib/cmdline.lua:8
return nil, ("[cmdline]: " .. msg) -- ./lib/cmdline.lua:9
end -- ./lib/cmdline.lua:9
local function argerror(msg, numarg) -- ./lib/cmdline.lua:12
msg = msg and (": " .. msg) or "" -- ./lib/cmdline.lua:13
return nil, ("[cmdline]: bad argument #" .. numarg .. msg) -- ./lib/cmdline.lua:14
end -- ./lib/cmdline.lua:14
local function iderror(numarg) -- ./lib/cmdline.lua:17
return argerror("ID not valid", numarg) -- ./lib/cmdline.lua:18
end -- ./lib/cmdline.lua:18
local function idcheck(id) -- ./lib/cmdline.lua:21
return id:match("^[%a_][%w_]*$") and true -- ./lib/cmdline.lua:22
end -- ./lib/cmdline.lua:22
return function(t_in, options, params) -- ./lib/cmdline.lua:73
local t_out = {} -- ./lib/cmdline.lua:74
for i, v in ipairs(t_in) do -- ./lib/cmdline.lua:75
local prefix, command = v:sub(1, 1), v:sub(2) -- ./lib/cmdline.lua:76
if prefix == "$" then -- ./lib/cmdline.lua:77
tinsert(t_out, command) -- ./lib/cmdline.lua:78
elseif prefix == "-" then -- ./lib/cmdline.lua:79
for id in command:gmatch("[^,;]+") do -- ./lib/cmdline.lua:80
if not idcheck(id) then -- ./lib/cmdline.lua:81
return iderror(i) -- ./lib/cmdline.lua:81
end -- ./lib/cmdline.lua:81
t_out[id] = true -- ./lib/cmdline.lua:82
end -- ./lib/cmdline.lua:82
elseif prefix == "!" then -- ./lib/cmdline.lua:84
local f, err = loadstring(command) -- ./lib/cmdline.lua:85
if not f then -- ./lib/cmdline.lua:86
return argerror(err, i) -- ./lib/cmdline.lua:86
end -- ./lib/cmdline.lua:86
setfenv(f, t_out)() -- ./lib/cmdline.lua:87
elseif v:find("=") then -- ./lib/cmdline.lua:88
local ids, val = v:match("^([^=]+)%=(.*)") -- no space around = -- ./lib/cmdline.lua:89
if not ids then -- ./lib/cmdline.lua:90
return argerror("invalid assignment syntax", i) -- ./lib/cmdline.lua:90
end -- ./lib/cmdline.lua:90
if val == "false" then -- ./lib/cmdline.lua:91
val = false -- ./lib/cmdline.lua:92
elseif val == "true" then -- ./lib/cmdline.lua:93
val = true -- ./lib/cmdline.lua:94
else -- ./lib/cmdline.lua:94
val = val:sub(1, 1) == "$" and val:sub(2) or tonumber(val) or val -- ./lib/cmdline.lua:96
end -- ./lib/cmdline.lua:96
for id in ids:gmatch("[^,;]+") do -- ./lib/cmdline.lua:98
if not idcheck(id) then -- ./lib/cmdline.lua:99
return iderror(i) -- ./lib/cmdline.lua:99
end -- ./lib/cmdline.lua:99
t_out[id] = val -- ./lib/cmdline.lua:100
end -- ./lib/cmdline.lua:100
else -- ./lib/cmdline.lua:100
tinsert(t_out, v) -- ./lib/cmdline.lua:103
end -- ./lib/cmdline.lua:103
end -- ./lib/cmdline.lua:103
if options then -- ./lib/cmdline.lua:106
local lookup, unknown = {}, {} -- ./lib/cmdline.lua:107
for _, v in ipairs(options) do -- ./lib/cmdline.lua:108
lookup[v] = true -- ./lib/cmdline.lua:108
end -- ./lib/cmdline.lua:108
for k, _ in pairs(t_out) do -- ./lib/cmdline.lua:109
if lookup[k] == nil and type(k) == "string" then -- ./lib/cmdline.lua:110
tinsert(unknown, k) -- ./lib/cmdline.lua:110
end -- ./lib/cmdline.lua:110
end -- ./lib/cmdline.lua:110
if # unknown > 0 then -- ./lib/cmdline.lua:112
return commonerror("unknown options: " .. tconcat(unknown, ", ")) -- ./lib/cmdline.lua:113
end -- ./lib/cmdline.lua:113
end -- ./lib/cmdline.lua:113
if params then -- ./lib/cmdline.lua:116
local missing = {} -- ./lib/cmdline.lua:117
for _, v in ipairs(params) do -- ./lib/cmdline.lua:118
if t_out[v] == nil then -- ./lib/cmdline.lua:119
tinsert(missing, v) -- ./lib/cmdline.lua:119
end -- ./lib/cmdline.lua:119
end -- ./lib/cmdline.lua:119
if # missing > 0 then -- ./lib/cmdline.lua:121
return commonerror("missing parameters: " .. tconcat(missing, ", ")) -- ./lib/cmdline.lua:122
end -- ./lib/cmdline.lua:122
end -- ./lib/cmdline.lua:122
return t_out -- ./lib/cmdline.lua:125
end -- ./lib/cmdline.lua:125
end -- ./lib/cmdline.lua:125
local cmdline = _() or cmdline -- ./lib/cmdline.lua:130
package["loaded"]["lib.cmdline"] = cmdline or true -- ./lib/cmdline.lua:131
local function _() -- ./lib/cmdline.lua:135
return function(code, ast, options) -- ./compiler/lua53.can:1
local lastInputPos = 1 -- last token position in the input code -- ./compiler/lua53.can:3
local prevLinePos = 1 -- last token position in the previous line of code in the input code -- ./compiler/lua53.can:4
local lastSource = options["chunkname"] or "nil" -- last found code source name (from the original file) -- ./compiler/lua53.can:5
local lastLine = 1 -- last found line number (from the original file) -- ./compiler/lua53.can:6
local indentLevel = 0 -- ./compiler/lua53.can:9
local function newline() -- ./compiler/lua53.can:11
local r = options["newline"] .. string["rep"](options["indentation"], indentLevel) -- ./compiler/lua53.can:12
if options["mapLines"] then -- ./compiler/lua53.can:13
local sub = code:sub(lastInputPos) -- ./compiler/lua53.can:14
local source, line = sub:sub(1, sub:find("\
")):match("%-%- (.-)%:(%d+)\
") -- ./compiler/lua53.can:15
if source and line then -- ./compiler/lua53.can:17
lastSource = source -- ./compiler/lua53.can:18
lastLine = tonumber(line) -- ./compiler/lua53.can:19
else -- ./compiler/lua53.can:19
for _ in code:sub(prevLinePos, lastInputPos):gmatch("\
") do -- ./compiler/lua53.can:21
lastLine = lastLine + (1) -- ./compiler/lua53.can:22
end -- ./compiler/lua53.can:22
end -- ./compiler/lua53.can:22
prevLinePos = lastInputPos -- ./compiler/lua53.can:26
r = " -- " .. lastSource .. ":" .. lastLine .. r -- ./compiler/lua53.can:28
end -- ./compiler/lua53.can:28
return r -- ./compiler/lua53.can:30
end -- ./compiler/lua53.can:30
local function indent() -- ./compiler/lua53.can:33
indentLevel = indentLevel + (1) -- ./compiler/lua53.can:34
return newline() -- ./compiler/lua53.can:35
end -- ./compiler/lua53.can:35
local function unindent() -- ./compiler/lua53.can:38
indentLevel = indentLevel - (1) -- ./compiler/lua53.can:39
return newline() -- ./compiler/lua53.can:40
end -- ./compiler/lua53.can:40
local required = {} -- { ["module"] = true, ... } -- ./compiler/lua53.can:44
local requireStr = "" -- ./compiler/lua53.can:45
local function addRequire(mod, name, field) -- ./compiler/lua53.can:47
if not required[mod] then -- ./compiler/lua53.can:48
requireStr = requireStr .. ("local " .. options["variablePrefix"] .. name .. (" = require(%q)"):format(mod) .. (field and "." .. field or "") .. options["newline"]) -- ./compiler/lua53.can:49
required[mod] = true -- ./compiler/lua53.can:50
end -- ./compiler/lua53.can:50
end -- ./compiler/lua53.can:50
local function var(name) -- ./compiler/lua53.can:56
return options["variablePrefix"] .. name -- ./compiler/lua53.can:57
end -- ./compiler/lua53.can:57
local loop = { -- loops tags -- ./compiler/lua53.can:61
"While", -- loops tags -- ./compiler/lua53.can:61
"Repeat", -- loops tags -- ./compiler/lua53.can:61
"Fornum", -- loops tags -- ./compiler/lua53.can:61
"Forin" -- loops tags -- ./compiler/lua53.can:61
} -- loops tags -- ./compiler/lua53.can:61
local func = { -- function scope tags -- ./compiler/lua53.can:62
"Function", -- function scope tags -- ./compiler/lua53.can:62
"TableCompr", -- function scope tags -- ./compiler/lua53.can:62
"DoExpr", -- function scope tags -- ./compiler/lua53.can:62
"WhileExpr", -- function scope tags -- ./compiler/lua53.can:62
"RepeatExpr", -- function scope tags -- ./compiler/lua53.can:62
"IfExpr", -- function scope tags -- ./compiler/lua53.can:62
"FornumExpr", -- function scope tags -- ./compiler/lua53.can:62
"ForinExpr" -- function scope tags -- ./compiler/lua53.can:62
} -- function scope tags -- ./compiler/lua53.can:62
local function any(list, tags, nofollow) -- ./compiler/lua53.can:65
if nofollow == nil then nofollow = {} end -- ./compiler/lua53.can:65
local tagsCheck = {} -- ./compiler/lua53.can:66
for _, tag in ipairs(tags) do -- ./compiler/lua53.can:67
tagsCheck[tag] = true -- ./compiler/lua53.can:68
end -- ./compiler/lua53.can:68
local nofollowCheck = {} -- ./compiler/lua53.can:70
for _, tag in ipairs(nofollow) do -- ./compiler/lua53.can:71
nofollowCheck[tag] = true -- ./compiler/lua53.can:72
end -- ./compiler/lua53.can:72
for _, node in ipairs(list) do -- ./compiler/lua53.can:74
if type(node) == "table" then -- ./compiler/lua53.can:75
if tagsCheck[node["tag"]] then -- ./compiler/lua53.can:76
return node -- ./compiler/lua53.can:77
end -- ./compiler/lua53.can:77
if not nofollowCheck[node["tag"]] then -- ./compiler/lua53.can:79
local r = any(node, tags, nofollow) -- ./compiler/lua53.can:80
if r then -- ./compiler/lua53.can:81
return r -- ./compiler/lua53.can:81
end -- ./compiler/lua53.can:81
end -- ./compiler/lua53.can:81
end -- ./compiler/lua53.can:81
end -- ./compiler/lua53.can:81
return nil -- ./compiler/lua53.can:85
end -- ./compiler/lua53.can:85
local states = { ["push"] = {} } -- push stack variable names -- ./compiler/lua53.can:91
local function push(name, state) -- ./compiler/lua53.can:94
table["insert"](states[name], state) -- ./compiler/lua53.can:95
return "" -- ./compiler/lua53.can:96
end -- ./compiler/lua53.can:96
local function pop(name) -- ./compiler/lua53.can:99
table["remove"](states[name]) -- ./compiler/lua53.can:100
return "" -- ./compiler/lua53.can:101
end -- ./compiler/lua53.can:101
local function peek(name) -- ./compiler/lua53.can:104
return states[name][# states[name]] -- ./compiler/lua53.can:105
end -- ./compiler/lua53.can:105
local tags -- ./compiler/lua53.can:109
local function lua(ast, forceTag, ...) -- ./compiler/lua53.can:111
if options["mapLines"] and ast["pos"] then -- ./compiler/lua53.can:112
lastInputPos = ast["pos"] -- ./compiler/lua53.can:113
end -- ./compiler/lua53.can:113
return tags[forceTag or ast["tag"]](ast, ...) -- ./compiler/lua53.can:115
end -- ./compiler/lua53.can:115
local UNPACK = function(list, i, j) -- table.unpack -- ./compiler/lua53.can:119
return "table.unpack(" .. list .. (i and (", " .. i .. (j and (", " .. j) or "")) or "") .. ")" -- ./compiler/lua53.can:120
end -- ./compiler/lua53.can:120
local APPEND = function(t, toAppend) -- append values "toAppend" (multiple values possible) to t -- ./compiler/lua53.can:122
return "do" .. indent() .. "local a = table.pack(" .. toAppend .. ")" .. newline() .. "table.move(a, 1, a.n, #" .. t .. "+1, " .. t .. ")" .. unindent() .. "end" -- ./compiler/lua53.can:123
end -- ./compiler/lua53.can:123
tags = setmetatable({ -- ./compiler/lua53.can:127
["Block"] = function(t) -- ./compiler/lua53.can:129
local hasPush = peek("push") == nil and any(t, { "Push" }, func) -- push in block and push context not yet defined -- ./compiler/lua53.can:130
if hasPush and hasPush == t[# t] then -- if the first push is the last statement, it's just a return -- ./compiler/lua53.can:131
hasPush["tag"] = "Return" -- ./compiler/lua53.can:132
hasPush = false -- ./compiler/lua53.can:133
end -- ./compiler/lua53.can:133
local r = "" -- ./compiler/lua53.can:135
if hasPush then -- ./compiler/lua53.can:136
r = r .. (push("push", var("push")) .. "local " .. var("push") .. " = {}" .. newline()) -- ./compiler/lua53.can:137
end -- ./compiler/lua53.can:137
for i = 1, # t - 1, 1 do -- ./compiler/lua53.can:139
r = r .. (lua(t[i]) .. newline()) -- ./compiler/lua53.can:140
end -- ./compiler/lua53.can:140
if t[# t] then -- ./compiler/lua53.can:142
r = r .. (lua(t[# t])) -- ./compiler/lua53.can:143
end -- ./compiler/lua53.can:143
if hasPush and (t[# t] and t[# t]["tag"] ~= "Return") then -- add return only if needed -- ./compiler/lua53.can:145
r = r .. (newline() .. "return " .. UNPACK(var("push")) .. pop("push")) -- ./compiler/lua53.can:146
end -- ./compiler/lua53.can:146
return r -- ./compiler/lua53.can:148
end, -- ./compiler/lua53.can:148
["Do"] = function(t) -- ./compiler/lua53.can:154
return "do" .. indent() .. lua(t, "Block") .. unindent() .. "end" -- ./compiler/lua53.can:155
end, -- ./compiler/lua53.can:155
["Set"] = function(t) -- ./compiler/lua53.can:158
if # t == 2 then -- ./compiler/lua53.can:159
return lua(t[1], "_lhs") .. " = " .. lua(t[2], "_lhs") -- ./compiler/lua53.can:160
elseif # t == 3 then -- ./compiler/lua53.can:161
return lua(t[1], "_lhs") .. " = " .. lua(t[3], "_lhs") -- ./compiler/lua53.can:162
elseif # t == 4 then -- ./compiler/lua53.can:163
if t[3] == "=" then -- ./compiler/lua53.can:164
local r = lua(t[1], "_lhs") .. " = " .. lua({ -- ./compiler/lua53.can:165
t[2], -- ./compiler/lua53.can:165
t[1][1], -- ./compiler/lua53.can:165
{ -- ./compiler/lua53.can:165
["tag"] = "Paren", -- ./compiler/lua53.can:165
t[4][1] -- ./compiler/lua53.can:165
} -- ./compiler/lua53.can:165
}, "Op") -- ./compiler/lua53.can:165
for i = 2, math["min"](# t[4], # t[1]), 1 do -- ./compiler/lua53.can:166
r = r .. (", " .. lua({ -- ./compiler/lua53.can:167
t[2], -- ./compiler/lua53.can:167
t[1][i], -- ./compiler/lua53.can:167
{ -- ./compiler/lua53.can:167
["tag"] = "Paren", -- ./compiler/lua53.can:167
t[4][i] -- ./compiler/lua53.can:167
} -- ./compiler/lua53.can:167
}, "Op")) -- ./compiler/lua53.can:167
end -- ./compiler/lua53.can:167
return r -- ./compiler/lua53.can:169
else -- ./compiler/lua53.can:169
local r = lua(t[1], "_lhs") .. " = " .. lua({ -- ./compiler/lua53.can:171
t[3], -- ./compiler/lua53.can:171
{ -- ./compiler/lua53.can:171
["tag"] = "Paren", -- ./compiler/lua53.can:171
t[4][1] -- ./compiler/lua53.can:171
}, -- ./compiler/lua53.can:171
t[1][1] -- ./compiler/lua53.can:171
}, "Op") -- ./compiler/lua53.can:171
for i = 2, math["min"](# t[4], # t[1]), 1 do -- ./compiler/lua53.can:172
r = r .. (", " .. lua({ -- ./compiler/lua53.can:173
t[3], -- ./compiler/lua53.can:173
{ -- ./compiler/lua53.can:173
["tag"] = "Paren", -- ./compiler/lua53.can:173
t[4][i] -- ./compiler/lua53.can:173
}, -- ./compiler/lua53.can:173
t[1][i] -- ./compiler/lua53.can:173
}, "Op")) -- ./compiler/lua53.can:173
end -- ./compiler/lua53.can:173
return r -- ./compiler/lua53.can:175
end -- ./compiler/lua53.can:175
else -- ./compiler/lua53.can:175
local r = lua(t[1], "_lhs") .. " = " .. lua({ -- ./compiler/lua53.can:178
t[2], -- ./compiler/lua53.can:178
t[1][1], -- ./compiler/lua53.can:178
{ -- ./compiler/lua53.can:178
["tag"] = "Op", -- ./compiler/lua53.can:178
t[4], -- ./compiler/lua53.can:178
{ -- ./compiler/lua53.can:178
["tag"] = "Paren", -- ./compiler/lua53.can:178
t[5][1] -- ./compiler/lua53.can:178
}, -- ./compiler/lua53.can:178
t[1][1] -- ./compiler/lua53.can:178
} -- ./compiler/lua53.can:178
}, "Op") -- ./compiler/lua53.can:178
for i = 2, math["min"](# t[5], # t[1]), 1 do -- ./compiler/lua53.can:179
r = r .. (", " .. lua({ -- ./compiler/lua53.can:180
t[2], -- ./compiler/lua53.can:180
t[1][i], -- ./compiler/lua53.can:180
{ -- ./compiler/lua53.can:180
["tag"] = "Op", -- ./compiler/lua53.can:180
t[4], -- ./compiler/lua53.can:180
{ -- ./compiler/lua53.can:180
["tag"] = "Paren", -- ./compiler/lua53.can:180
t[5][i] -- ./compiler/lua53.can:180
}, -- ./compiler/lua53.can:180
t[1][i] -- ./compiler/lua53.can:180
} -- ./compiler/lua53.can:180
}, "Op")) -- ./compiler/lua53.can:180
end -- ./compiler/lua53.can:180
return r -- ./compiler/lua53.can:182
end -- ./compiler/lua53.can:182
end, -- ./compiler/lua53.can:182
["While"] = function(t) -- ./compiler/lua53.can:186
local hasContinue = any(t[2], { "Continue" }, loop) -- ./compiler/lua53.can:187
local r = "while " .. lua(t[1]) .. " do" .. indent() -- ./compiler/lua53.can:188
if hasContinue then -- ./compiler/lua53.can:189
r = r .. ("repeat" .. indent()) -- ./compiler/lua53.can:190
end -- ./compiler/lua53.can:190
r = r .. (lua(t[2])) -- ./compiler/lua53.can:192
if hasContinue then -- ./compiler/lua53.can:193
r = r .. (unindent() .. "until true") -- ./compiler/lua53.can:194
end -- ./compiler/lua53.can:194
r = r .. (unindent() .. "end") -- ./compiler/lua53.can:196
return r -- ./compiler/lua53.can:197
end, -- ./compiler/lua53.can:197
["Repeat"] = function(t) -- ./compiler/lua53.can:200
local hasContinue = any(t[2], { "Continue" }, loop) -- ./compiler/lua53.can:201
local r = "repeat" .. indent() -- ./compiler/lua53.can:202
if hasContinue then -- ./compiler/lua53.can:203
r = r .. ("repeat" .. indent()) -- ./compiler/lua53.can:204
end -- ./compiler/lua53.can:204
r = r .. (lua(t[1])) -- ./compiler/lua53.can:206
if hasContinue then -- ./compiler/lua53.can:207
r = r .. (unindent() .. "until true") -- ./compiler/lua53.can:208
end -- ./compiler/lua53.can:208
r = r .. (unindent() .. "until " .. lua(t[2])) -- ./compiler/lua53.can:210
return r -- ./compiler/lua53.can:211
end, -- ./compiler/lua53.can:211
["If"] = function(t) -- ./compiler/lua53.can:214
local r = "if " .. lua(t[1]) .. " then" .. indent() .. lua(t[2]) .. unindent() -- ./compiler/lua53.can:215
for i = 3, # t - 1, 2 do -- ./compiler/lua53.can:216
r = r .. ("elseif " .. lua(t[i]) .. " then" .. indent() .. lua(t[i + 1]) .. unindent()) -- ./compiler/lua53.can:217
end -- ./compiler/lua53.can:217
if # t % 2 == 1 then -- ./compiler/lua53.can:219
r = r .. ("else" .. indent() .. lua(t[# t]) .. unindent()) -- ./compiler/lua53.can:220
end -- ./compiler/lua53.can:220
return r .. "end" -- ./compiler/lua53.can:222
end, -- ./compiler/lua53.can:222
["Fornum"] = function(t) -- ./compiler/lua53.can:225
local r = "for " .. lua(t[1]) .. " = " .. lua(t[2]) .. ", " .. lua(t[3]) -- ./compiler/lua53.can:226
if # t == 5 then -- ./compiler/lua53.can:227
local hasContinue = any(t[5], { "Continue" }, loop) -- ./compiler/lua53.can:228
r = r .. (", " .. lua(t[4]) .. " do" .. indent()) -- ./compiler/lua53.can:229
if hasContinue then -- ./compiler/lua53.can:230
r = r .. ("repeat" .. indent()) -- ./compiler/lua53.can:231
end -- ./compiler/lua53.can:231
r = r .. (lua(t[5])) -- ./compiler/lua53.can:233
if hasContinue then -- ./compiler/lua53.can:234
r = r .. (unindent() .. "until true") -- ./compiler/lua53.can:235
end -- ./compiler/lua53.can:235
return r .. unindent() .. "end" -- ./compiler/lua53.can:237
else -- ./compiler/lua53.can:237
local hasContinue = any(t[4], { "Continue" }, loop) -- ./compiler/lua53.can:239
r = r .. (" do" .. indent()) -- ./compiler/lua53.can:240
if hasContinue then -- ./compiler/lua53.can:241
r = r .. ("repeat" .. indent()) -- ./compiler/lua53.can:242
end -- ./compiler/lua53.can:242
r = r .. (lua(t[4])) -- ./compiler/lua53.can:244
if hasContinue then -- ./compiler/lua53.can:245
r = r .. (unindent() .. "until true") -- ./compiler/lua53.can:246
end -- ./compiler/lua53.can:246
return r .. unindent() .. "end" -- ./compiler/lua53.can:248
end -- ./compiler/lua53.can:248
end, -- ./compiler/lua53.can:248
["Forin"] = function(t) -- ./compiler/lua53.can:252
local hasContinue = any(t[3], { "Continue" }, loop) -- ./compiler/lua53.can:253
local r = "for " .. lua(t[1], "_lhs") .. " in " .. lua(t[2], "_lhs") .. " do" .. indent() -- ./compiler/lua53.can:254
if hasContinue then -- ./compiler/lua53.can:255
r = r .. ("repeat" .. indent()) -- ./compiler/lua53.can:256
end -- ./compiler/lua53.can:256
r = r .. (lua(t[3])) -- ./compiler/lua53.can:258
if hasContinue then -- ./compiler/lua53.can:259
r = r .. (unindent() .. "until true") -- ./compiler/lua53.can:260
end -- ./compiler/lua53.can:260
return r .. unindent() .. "end" -- ./compiler/lua53.can:262
end, -- ./compiler/lua53.can:262
["Local"] = function(t) -- ./compiler/lua53.can:265
local r = "local " .. lua(t[1], "_lhs") -- ./compiler/lua53.can:266
if t[2][1] then -- ./compiler/lua53.can:267
r = r .. (" = " .. lua(t[2], "_lhs")) -- ./compiler/lua53.can:268
end -- ./compiler/lua53.can:268
return r -- ./compiler/lua53.can:270
end, -- ./compiler/lua53.can:270
["Let"] = function(t) -- ./compiler/lua53.can:273
local nameList = lua(t[1], "_lhs") -- ./compiler/lua53.can:274
local r = "local " .. nameList -- ./compiler/lua53.can:275
if t[2][1] then -- ./compiler/lua53.can:276
if any(t[2], { -- predeclaration doesn't matter otherwise -- ./compiler/lua53.can:277
"Function", -- predeclaration doesn't matter otherwise -- ./compiler/lua53.can:277
"Table", -- predeclaration doesn't matter otherwise -- ./compiler/lua53.can:277
"Paren" -- predeclaration doesn't matter otherwise -- ./compiler/lua53.can:277
}) then -- predeclaration doesn't matter otherwise -- ./compiler/lua53.can:277
r = r .. (newline() .. nameList .. " = " .. lua(t[2], "_lhs")) -- ./compiler/lua53.can:278
else -- ./compiler/lua53.can:278
r = r .. (" = " .. lua(t[2], "_lhs")) -- ./compiler/lua53.can:280
end -- ./compiler/lua53.can:280
end -- ./compiler/lua53.can:280
return r -- ./compiler/lua53.can:283
end, -- ./compiler/lua53.can:283
["Localrec"] = function(t) -- ./compiler/lua53.can:286
return "local function " .. lua(t[1][1]) .. lua(t[2][1], "_functionWithoutKeyword") -- ./compiler/lua53.can:287
end, -- ./compiler/lua53.can:287
["Goto"] = function(t) -- ./compiler/lua53.can:290
return "goto " .. lua(t, "Id") -- ./compiler/lua53.can:291
end, -- ./compiler/lua53.can:291
["Label"] = function(t) -- ./compiler/lua53.can:294
return "::" .. lua(t, "Id") .. "::" -- ./compiler/lua53.can:295
end, -- ./compiler/lua53.can:295
["Return"] = function(t) -- ./compiler/lua53.can:298
local push = peek("push") -- ./compiler/lua53.can:299
if push then -- ./compiler/lua53.can:300
local r = "" -- ./compiler/lua53.can:301
for _, val in ipairs(t) do -- ./compiler/lua53.can:302
r = r .. (push .. "[#" .. push .. "+1] = " .. lua(val) .. newline()) -- ./compiler/lua53.can:303
end -- ./compiler/lua53.can:303
return r .. "return " .. UNPACK(push) -- ./compiler/lua53.can:305
else -- ./compiler/lua53.can:305
return "return " .. lua(t, "_lhs") -- ./compiler/lua53.can:307
end -- ./compiler/lua53.can:307
end, -- ./compiler/lua53.can:307
["Push"] = function(t) -- ./compiler/lua53.can:311
local var = assert(peek("push"), "no context given for push") -- ./compiler/lua53.can:312
r = "" -- ./compiler/lua53.can:313
for i = 1, # t - 1, 1 do -- ./compiler/lua53.can:314
r = r .. (var .. "[#" .. var .. "+1] = " .. lua(t[i]) .. newline()) -- ./compiler/lua53.can:315
end -- ./compiler/lua53.can:315
if t[# t] then -- ./compiler/lua53.can:317
if t[# t]["tag"] == "Call" or t[# t]["tag"] == "Invoke" then -- ./compiler/lua53.can:318
r = r .. (APPEND(var, lua(t[# t]))) -- ./compiler/lua53.can:319
else -- ./compiler/lua53.can:319
r = r .. (var .. "[#" .. var .. "+1] = " .. lua(t[# t])) -- ./compiler/lua53.can:321
end -- ./compiler/lua53.can:321
end -- ./compiler/lua53.can:321
return r -- ./compiler/lua53.can:324
end, -- ./compiler/lua53.can:324
["Break"] = function() -- ./compiler/lua53.can:327
return "break" -- ./compiler/lua53.can:328
end, -- ./compiler/lua53.can:328
["Continue"] = function() -- ./compiler/lua53.can:331
return "break" -- ./compiler/lua53.can:332
end, -- ./compiler/lua53.can:332
["Nil"] = function() -- ./compiler/lua53.can:339
return "nil" -- ./compiler/lua53.can:340
end, -- ./compiler/lua53.can:340
["Dots"] = function() -- ./compiler/lua53.can:343
return "..." -- ./compiler/lua53.can:344
end, -- ./compiler/lua53.can:344
["Boolean"] = function(t) -- ./compiler/lua53.can:347
return tostring(t[1]) -- ./compiler/lua53.can:348
end, -- ./compiler/lua53.can:348
["Number"] = function(t) -- ./compiler/lua53.can:351
return tostring(t[1]) -- ./compiler/lua53.can:352
end, -- ./compiler/lua53.can:352
["String"] = function(t) -- ./compiler/lua53.can:355
return ("%q"):format(t[1]) -- ./compiler/lua53.can:356
end, -- ./compiler/lua53.can:356
["_functionWithoutKeyword"] = function(t) -- ./compiler/lua53.can:359
local r = "(" -- ./compiler/lua53.can:360
local decl = {} -- ./compiler/lua53.can:361
if t[1][1] then -- ./compiler/lua53.can:362
if t[1][1]["tag"] == "ParPair" then -- ./compiler/lua53.can:363
local id = lua(t[1][1][1]) -- ./compiler/lua53.can:364
indentLevel = indentLevel + (1) -- ./compiler/lua53.can:365
table["insert"](decl, "if " .. id .. " == nil then " .. id .. " = " .. lua(t[1][1][2]) .. " end") -- ./compiler/lua53.can:366
indentLevel = indentLevel - (1) -- ./compiler/lua53.can:367
r = r .. (id) -- ./compiler/lua53.can:368
else -- ./compiler/lua53.can:368
r = r .. (lua(t[1][1])) -- ./compiler/lua53.can:370
end -- ./compiler/lua53.can:370
for i = 2, # t[1], 1 do -- ./compiler/lua53.can:372
if t[1][i]["tag"] == "ParPair" then -- ./compiler/lua53.can:373
local id = lua(t[1][i][1]) -- ./compiler/lua53.can:374
indentLevel = indentLevel + (1) -- ./compiler/lua53.can:375
table["insert"](decl, "if " .. id .. " == nil then " .. id .. " = " .. lua(t[1][i][2]) .. " end") -- ./compiler/lua53.can:376
indentLevel = indentLevel - (1) -- ./compiler/lua53.can:377
r = r .. (", " .. id) -- ./compiler/lua53.can:378
else -- ./compiler/lua53.can:378
r = r .. (", " .. lua(t[1][i])) -- ./compiler/lua53.can:380
end -- ./compiler/lua53.can:380
end -- ./compiler/lua53.can:380
end -- ./compiler/lua53.can:380
r = r .. (")" .. indent()) -- ./compiler/lua53.can:384
for _, d in ipairs(decl) do -- ./compiler/lua53.can:385
r = r .. (d .. newline()) -- ./compiler/lua53.can:386
end -- ./compiler/lua53.can:386
if t[2][# t[2]] and t[2][# t[2]]["tag"] == "Push" then -- convert final push to return -- ./compiler/lua53.can:388
t[2][# t[2]]["tag"] = "Return" -- ./compiler/lua53.can:389
end -- ./compiler/lua53.can:389
local hasPush = any(t[2], { "Push" }, func) -- ./compiler/lua53.can:391
if hasPush then -- ./compiler/lua53.can:392
r = r .. (push("push", var("push")) .. "local " .. var("push") .. " = {}" .. newline()) -- ./compiler/lua53.can:393
else -- ./compiler/lua53.can:393
push("push", false) -- no push here (make sure higher push don't affect us) -- ./compiler/lua53.can:395
end -- no push here (make sure higher push don't affect us) -- ./compiler/lua53.can:395
r = r .. (lua(t[2])) -- ./compiler/lua53.can:397
if hasPush and (t[2][# t[2]] and t[2][# t[2]]["tag"] ~= "Return") then -- add return only if needed -- ./compiler/lua53.can:398
r = r .. (newline() .. "return " .. UNPACK(var("push"))) -- ./compiler/lua53.can:399
end -- ./compiler/lua53.can:399
pop("push") -- ./compiler/lua53.can:401
return r .. unindent() .. "end" -- ./compiler/lua53.can:402
end, -- ./compiler/lua53.can:402
["Function"] = function(t) -- ./compiler/lua53.can:404
return "function" .. lua(t, "_functionWithoutKeyword") -- ./compiler/lua53.can:405
end, -- ./compiler/lua53.can:405
["Pair"] = function(t) -- ./compiler/lua53.can:408
return "[" .. lua(t[1]) .. "] = " .. lua(t[2]) -- ./compiler/lua53.can:409
end, -- ./compiler/lua53.can:409
["Table"] = function(t) -- ./compiler/lua53.can:411
if # t == 0 then -- ./compiler/lua53.can:412
return "{}" -- ./compiler/lua53.can:413
elseif # t == 1 then -- ./compiler/lua53.can:414
return "{ " .. lua(t, "_lhs") .. " }" -- ./compiler/lua53.can:415
else -- ./compiler/lua53.can:415
return "{" .. indent() .. lua(t, "_lhs", nil, true) .. unindent() .. "}" -- ./compiler/lua53.can:417
end -- ./compiler/lua53.can:417
end, -- ./compiler/lua53.can:417
["TableCompr"] = function(t) -- ./compiler/lua53.can:421
return push("push", "self") .. "(function()" .. indent() .. "local self = {}" .. newline() .. lua(t[1]) .. newline() .. "return self" .. unindent() .. "end)()" .. pop("push") -- ./compiler/lua53.can:422
end, -- ./compiler/lua53.can:422
["Op"] = function(t) -- ./compiler/lua53.can:425
local r -- ./compiler/lua53.can:426
if # t == 2 then -- ./compiler/lua53.can:427
if type(tags["_opid"][t[1]]) == "string" then -- ./compiler/lua53.can:428
r = tags["_opid"][t[1]] .. " " .. lua(t[2]) -- ./compiler/lua53.can:429
else -- ./compiler/lua53.can:429
r = tags["_opid"][t[1]](t[2]) -- ./compiler/lua53.can:431
end -- ./compiler/lua53.can:431
else -- ./compiler/lua53.can:431
if type(tags["_opid"][t[1]]) == "string" then -- ./compiler/lua53.can:434
r = lua(t[2]) .. " " .. tags["_opid"][t[1]] .. " " .. lua(t[3]) -- ./compiler/lua53.can:435
else -- ./compiler/lua53.can:435
r = tags["_opid"][t[1]](t[2], t[3]) -- ./compiler/lua53.can:437
end -- ./compiler/lua53.can:437
end -- ./compiler/lua53.can:437
return r -- ./compiler/lua53.can:440
end, -- ./compiler/lua53.can:440
["Paren"] = function(t) -- ./compiler/lua53.can:443
return "(" .. lua(t[1]) .. ")" -- ./compiler/lua53.can:444
end, -- ./compiler/lua53.can:444
["_statexpr"] = function(t, stat) -- ./compiler/lua53.can:451
local hasPush = any(t, { "Push" }, func) -- ./compiler/lua53.can:452
local r = "(function()" .. indent() -- ./compiler/lua53.can:453
if hasPush then -- ./compiler/lua53.can:454
r = r .. (push("push", var("push")) .. "local " .. var("push") .. " = {}" .. newline()) -- ./compiler/lua53.can:455
else -- ./compiler/lua53.can:455
push("push", false) -- no push here (make sure higher push don't affect us) -- ./compiler/lua53.can:457
end -- no push here (make sure higher push don't affect us) -- ./compiler/lua53.can:457
r = r .. (lua(t, stat)) -- ./compiler/lua53.can:459
if hasPush then -- ./compiler/lua53.can:460
r = r .. (newline() .. "return " .. UNPACK(var("push"))) -- ./compiler/lua53.can:461
end -- ./compiler/lua53.can:461
pop("push") -- ./compiler/lua53.can:463
r = r .. (unindent() .. "end)()") -- ./compiler/lua53.can:464
return r -- ./compiler/lua53.can:465
end, -- ./compiler/lua53.can:465
["DoExpr"] = function(t) -- ./compiler/lua53.can:468
if t[# t]["tag"] == "Push" then -- convert final push to return -- ./compiler/lua53.can:469
t[# t]["tag"] = "Return" -- ./compiler/lua53.can:470
end -- ./compiler/lua53.can:470
return lua(t, "_statexpr", "Do") -- ./compiler/lua53.can:472
end, -- ./compiler/lua53.can:472
["WhileExpr"] = function(t) -- ./compiler/lua53.can:475
return lua(t, "_statexpr", "While") -- ./compiler/lua53.can:476
end, -- ./compiler/lua53.can:476
["RepeatExpr"] = function(t) -- ./compiler/lua53.can:479
return lua(t, "_statexpr", "Repeat") -- ./compiler/lua53.can:480
end, -- ./compiler/lua53.can:480
["IfExpr"] = function(t) -- ./compiler/lua53.can:483
for i = 2, # t do -- convert final pushes to returns -- ./compiler/lua53.can:484
local block = t[i] -- ./compiler/lua53.can:485
if block[# block] and block[# block]["tag"] == "Push" then -- ./compiler/lua53.can:486
block[# block]["tag"] = "Return" -- ./compiler/lua53.can:487
end -- ./compiler/lua53.can:487
end -- ./compiler/lua53.can:487
return lua(t, "_statexpr", "If") -- ./compiler/lua53.can:490
end, -- ./compiler/lua53.can:490
["FornumExpr"] = function(t) -- ./compiler/lua53.can:493
return lua(t, "_statexpr", "Fornum") -- ./compiler/lua53.can:494
end, -- ./compiler/lua53.can:494
["ForinExpr"] = function(t) -- ./compiler/lua53.can:497
return lua(t, "_statexpr", "Forin") -- ./compiler/lua53.can:498
end, -- ./compiler/lua53.can:498
["Call"] = function(t) -- ./compiler/lua53.can:504
return lua(t[1]) .. "(" .. lua(t, "_lhs", 2) .. ")" -- ./compiler/lua53.can:505
end, -- ./compiler/lua53.can:505
["Invoke"] = function(t) -- ./compiler/lua53.can:509
return lua(t[1]) .. ":" .. lua(t[2], "Id") .. "(" .. lua(t, "_lhs", 3) .. ")" -- ./compiler/lua53.can:510
end, -- ./compiler/lua53.can:510
["_lhs"] = function(t, start, newlines) -- ./compiler/lua53.can:514
if start == nil then start = 1 end -- ./compiler/lua53.can:514
local r -- ./compiler/lua53.can:515
if t[start] then -- ./compiler/lua53.can:516
r = lua(t[start]) -- ./compiler/lua53.can:517
for i = start + 1, # t, 1 do -- ./compiler/lua53.can:518
r = r .. ("," .. (newlines and newline() or " ") .. lua(t[i])) -- ./compiler/lua53.can:519
end -- ./compiler/lua53.can:519
else -- ./compiler/lua53.can:519
r = "" -- ./compiler/lua53.can:522
end -- ./compiler/lua53.can:522
return r -- ./compiler/lua53.can:524
end, -- ./compiler/lua53.can:524
["Id"] = function(t) -- ./compiler/lua53.can:527
return t[1] -- ./compiler/lua53.can:528
end, -- ./compiler/lua53.can:528
["Index"] = function(t) -- ./compiler/lua53.can:531
return lua(t[1]) .. "[" .. lua(t[2]) .. "]" -- ./compiler/lua53.can:532
end, -- ./compiler/lua53.can:532
["_opid"] = { -- ./compiler/lua53.can:536
["add"] = "+", -- ./compiler/lua53.can:537
["sub"] = "-", -- ./compiler/lua53.can:537
["mul"] = "*", -- ./compiler/lua53.can:537
["div"] = "/", -- ./compiler/lua53.can:537
["idiv"] = "//", -- ./compiler/lua53.can:538
["mod"] = "%", -- ./compiler/lua53.can:538
["pow"] = "^", -- ./compiler/lua53.can:538
["concat"] = "..", -- ./compiler/lua53.can:538
["band"] = "&", -- ./compiler/lua53.can:539
["bor"] = "|", -- ./compiler/lua53.can:539
["bxor"] = "~", -- ./compiler/lua53.can:539
["shl"] = "<<", -- ./compiler/lua53.can:539
["shr"] = ">>", -- ./compiler/lua53.can:539
["eq"] = "==", -- ./compiler/lua53.can:540
["ne"] = "~=", -- ./compiler/lua53.can:540
["lt"] = "<", -- ./compiler/lua53.can:540
["gt"] = ">", -- ./compiler/lua53.can:540
["le"] = "<=", -- ./compiler/lua53.can:540
["ge"] = ">=", -- ./compiler/lua53.can:540
["and"] = "and", -- ./compiler/lua53.can:541
["or"] = "or", -- ./compiler/lua53.can:541
["unm"] = "-", -- ./compiler/lua53.can:541
["len"] = "#", -- ./compiler/lua53.can:541
["bnot"] = "~", -- ./compiler/lua53.can:541
["not"] = "not" -- ./compiler/lua53.can:541
} -- ./compiler/lua53.can:541
}, { ["__index"] = function(self, key) -- ./compiler/lua53.can:544
error("don't know how to compile a " .. tostring(key) .. " to Lua 5.3") -- ./compiler/lua53.can:545
end }) -- ./compiler/lua53.can:545
local code = lua(ast) .. newline() -- ./compiler/lua53.can:551
return requireStr .. code -- ./compiler/lua53.can:552
end -- ./compiler/lua53.can:552
end -- ./compiler/lua53.can:552
local lua53 = _() or lua53 -- ./compiler/lua53.can:557
package["loaded"]["compiler.lua53"] = lua53 or true -- ./compiler/lua53.can:558
local function _() -- ./compiler/lua53.can:561
local function _() -- ./compiler/lua53.can:563
return function(code, ast, options) -- ./compiler/lua53.can:1
local lastInputPos = 1 -- last token position in the input code -- ./compiler/lua53.can:3
local prevLinePos = 1 -- last token position in the previous line of code in the input code -- ./compiler/lua53.can:4
local lastSource = options["chunkname"] or "nil" -- last found code source name (from the original file) -- ./compiler/lua53.can:5
local lastLine = 1 -- last found line number (from the original file) -- ./compiler/lua53.can:6
local indentLevel = 0 -- ./compiler/lua53.can:9
local function newline() -- ./compiler/lua53.can:11
local r = options["newline"] .. string["rep"](options["indentation"], indentLevel) -- ./compiler/lua53.can:12
if options["mapLines"] then -- ./compiler/lua53.can:13
local sub = code:sub(lastInputPos) -- ./compiler/lua53.can:14
local source, line = sub:sub(1, sub:find("\
")):match("%-%- (.-)%:(%d+)\
") -- ./compiler/lua53.can:15
if source and line then -- ./compiler/lua53.can:17
lastSource = source -- ./compiler/lua53.can:18
lastLine = tonumber(line) -- ./compiler/lua53.can:19
else -- ./compiler/lua53.can:19
for _ in code:sub(prevLinePos, lastInputPos):gmatch("\
") do -- ./compiler/lua53.can:21
lastLine = lastLine + (1) -- ./compiler/lua53.can:22
end -- ./compiler/lua53.can:22
end -- ./compiler/lua53.can:22
prevLinePos = lastInputPos -- ./compiler/lua53.can:26
r = " -- " .. lastSource .. ":" .. lastLine .. r -- ./compiler/lua53.can:28
end -- ./compiler/lua53.can:28
return r -- ./compiler/lua53.can:30
end -- ./compiler/lua53.can:30
local function indent() -- ./compiler/lua53.can:33
indentLevel = indentLevel + (1) -- ./compiler/lua53.can:34
return newline() -- ./compiler/lua53.can:35
end -- ./compiler/lua53.can:35
local function unindent() -- ./compiler/lua53.can:38
indentLevel = indentLevel - (1) -- ./compiler/lua53.can:39
return newline() -- ./compiler/lua53.can:40
end -- ./compiler/lua53.can:40
local required = {} -- { ["module"] = true, ... } -- ./compiler/lua53.can:44
local requireStr = "" -- ./compiler/lua53.can:45
local function addRequire(mod, name, field) -- ./compiler/lua53.can:47
if not required[mod] then -- ./compiler/lua53.can:48
requireStr = requireStr .. ("local " .. options["variablePrefix"] .. name .. (" = require(%q)"):format(mod) .. (field and "." .. field or "") .. options["newline"]) -- ./compiler/lua53.can:49
required[mod] = true -- ./compiler/lua53.can:50
end -- ./compiler/lua53.can:50
end -- ./compiler/lua53.can:50
local function var(name) -- ./compiler/lua53.can:56
return options["variablePrefix"] .. name -- ./compiler/lua53.can:57
end -- ./compiler/lua53.can:57
local loop = { -- loops tags -- ./compiler/lua53.can:61
"While", -- loops tags -- ./compiler/lua53.can:61
"Repeat", -- loops tags -- ./compiler/lua53.can:61
"Fornum", -- loops tags -- ./compiler/lua53.can:61
"Forin" -- loops tags -- ./compiler/lua53.can:61
} -- loops tags -- ./compiler/lua53.can:61
local func = { -- function scope tags -- ./compiler/lua53.can:62
"Function", -- function scope tags -- ./compiler/lua53.can:62
"TableCompr", -- function scope tags -- ./compiler/lua53.can:62
"DoExpr", -- function scope tags -- ./compiler/lua53.can:62
"WhileExpr", -- function scope tags -- ./compiler/lua53.can:62
"RepeatExpr", -- function scope tags -- ./compiler/lua53.can:62
"IfExpr", -- function scope tags -- ./compiler/lua53.can:62
"FornumExpr", -- function scope tags -- ./compiler/lua53.can:62
"ForinExpr" -- function scope tags -- ./compiler/lua53.can:62
} -- function scope tags -- ./compiler/lua53.can:62
local function any(list, tags, nofollow) -- ./compiler/lua53.can:65
if nofollow == nil then nofollow = {} end -- ./compiler/lua53.can:65
local tagsCheck = {} -- ./compiler/lua53.can:66
for _, tag in ipairs(tags) do -- ./compiler/lua53.can:67
tagsCheck[tag] = true -- ./compiler/lua53.can:68
end -- ./compiler/lua53.can:68
local nofollowCheck = {} -- ./compiler/lua53.can:70
for _, tag in ipairs(nofollow) do -- ./compiler/lua53.can:71
nofollowCheck[tag] = true -- ./compiler/lua53.can:72
end -- ./compiler/lua53.can:72
for _, node in ipairs(list) do -- ./compiler/lua53.can:74
if type(node) == "table" then -- ./compiler/lua53.can:75
if tagsCheck[node["tag"]] then -- ./compiler/lua53.can:76
return node -- ./compiler/lua53.can:77
end -- ./compiler/lua53.can:77
if not nofollowCheck[node["tag"]] then -- ./compiler/lua53.can:79
local r = any(node, tags, nofollow) -- ./compiler/lua53.can:80
if r then -- ./compiler/lua53.can:81
return r -- ./compiler/lua53.can:81
end -- ./compiler/lua53.can:81
end -- ./compiler/lua53.can:81
end -- ./compiler/lua53.can:81
end -- ./compiler/lua53.can:81
return nil -- ./compiler/lua53.can:85
end -- ./compiler/lua53.can:85
local states = { ["push"] = {} } -- push stack variable names -- ./compiler/lua53.can:91
local function push(name, state) -- ./compiler/lua53.can:94
table["insert"](states[name], state) -- ./compiler/lua53.can:95
return "" -- ./compiler/lua53.can:96
end -- ./compiler/lua53.can:96
local function pop(name) -- ./compiler/lua53.can:99
table["remove"](states[name]) -- ./compiler/lua53.can:100
return "" -- ./compiler/lua53.can:101
end -- ./compiler/lua53.can:101
local function peek(name) -- ./compiler/lua53.can:104
return states[name][# states[name]] -- ./compiler/lua53.can:105
end -- ./compiler/lua53.can:105
local tags -- ./compiler/lua53.can:109
local function lua(ast, forceTag, ...) -- ./compiler/lua53.can:111
if options["mapLines"] and ast["pos"] then -- ./compiler/lua53.can:112
lastInputPos = ast["pos"] -- ./compiler/lua53.can:113
end -- ./compiler/lua53.can:113
return tags[forceTag or ast["tag"]](ast, ...) -- ./compiler/lua53.can:115
end -- ./compiler/lua53.can:115
local UNPACK = function(list, i, j) -- table.unpack -- ./compiler/lua53.can:119
return "table.unpack(" .. list .. (i and (", " .. i .. (j and (", " .. j) or "")) or "") .. ")" -- ./compiler/lua53.can:120
end -- ./compiler/lua53.can:120
local APPEND = function(t, toAppend) -- append values "toAppend" (multiple values possible) to t -- ./compiler/lua53.can:122
return "do" .. indent() .. "local a = table.pack(" .. toAppend .. ")" .. newline() .. "table.move(a, 1, a.n, #" .. t .. "+1, " .. t .. ")" .. unindent() .. "end" -- ./compiler/lua53.can:123
end -- ./compiler/lua53.can:123
tags = setmetatable({ -- ./compiler/lua53.can:127
["Block"] = function(t) -- ./compiler/lua53.can:129
local hasPush = peek("push") == nil and any(t, { "Push" }, func) -- push in block and push context not yet defined -- ./compiler/lua53.can:130
if hasPush and hasPush == t[# t] then -- if the first push is the last statement, it's just a return -- ./compiler/lua53.can:131
hasPush["tag"] = "Return" -- ./compiler/lua53.can:132
hasPush = false -- ./compiler/lua53.can:133
end -- ./compiler/lua53.can:133
local r = "" -- ./compiler/lua53.can:135
if hasPush then -- ./compiler/lua53.can:136
r = r .. (push("push", var("push")) .. "local " .. var("push") .. " = {}" .. newline()) -- ./compiler/lua53.can:137
end -- ./compiler/lua53.can:137
for i = 1, # t - 1, 1 do -- ./compiler/lua53.can:139
r = r .. (lua(t[i]) .. newline()) -- ./compiler/lua53.can:140
end -- ./compiler/lua53.can:140
if t[# t] then -- ./compiler/lua53.can:142
r = r .. (lua(t[# t])) -- ./compiler/lua53.can:143
end -- ./compiler/lua53.can:143
if hasPush and (t[# t] and t[# t]["tag"] ~= "Return") then -- add return only if needed -- ./compiler/lua53.can:145
r = r .. (newline() .. "return " .. UNPACK(var("push")) .. pop("push")) -- ./compiler/lua53.can:146
end -- ./compiler/lua53.can:146
return r -- ./compiler/lua53.can:148
end, -- ./compiler/lua53.can:148
["Do"] = function(t) -- ./compiler/lua53.can:154
return "do" .. indent() .. lua(t, "Block") .. unindent() .. "end" -- ./compiler/lua53.can:155
end, -- ./compiler/lua53.can:155
["Set"] = function(t) -- ./compiler/lua53.can:158
if # t == 2 then -- ./compiler/lua53.can:159
return lua(t[1], "_lhs") .. " = " .. lua(t[2], "_lhs") -- ./compiler/lua53.can:160
elseif # t == 3 then -- ./compiler/lua53.can:161
return lua(t[1], "_lhs") .. " = " .. lua(t[3], "_lhs") -- ./compiler/lua53.can:162
elseif # t == 4 then -- ./compiler/lua53.can:163
if t[3] == "=" then -- ./compiler/lua53.can:164
local r = lua(t[1], "_lhs") .. " = " .. lua({ -- ./compiler/lua53.can:165
t[2], -- ./compiler/lua53.can:165
t[1][1], -- ./compiler/lua53.can:165
{ -- ./compiler/lua53.can:165
["tag"] = "Paren", -- ./compiler/lua53.can:165
t[4][1] -- ./compiler/lua53.can:165
} -- ./compiler/lua53.can:165
}, "Op") -- ./compiler/lua53.can:165
for i = 2, math["min"](# t[4], # t[1]), 1 do -- ./compiler/lua53.can:166
r = r .. (", " .. lua({ -- ./compiler/lua53.can:167
t[2], -- ./compiler/lua53.can:167
t[1][i], -- ./compiler/lua53.can:167
{ -- ./compiler/lua53.can:167
["tag"] = "Paren", -- ./compiler/lua53.can:167
t[4][i] -- ./compiler/lua53.can:167
} -- ./compiler/lua53.can:167
}, "Op")) -- ./compiler/lua53.can:167
end -- ./compiler/lua53.can:167
return r -- ./compiler/lua53.can:169
else -- ./compiler/lua53.can:169
local r = lua(t[1], "_lhs") .. " = " .. lua({ -- ./compiler/lua53.can:171
t[3], -- ./compiler/lua53.can:171
{ -- ./compiler/lua53.can:171
["tag"] = "Paren", -- ./compiler/lua53.can:171
t[4][1] -- ./compiler/lua53.can:171
}, -- ./compiler/lua53.can:171
t[1][1] -- ./compiler/lua53.can:171
}, "Op") -- ./compiler/lua53.can:171
for i = 2, math["min"](# t[4], # t[1]), 1 do -- ./compiler/lua53.can:172
r = r .. (", " .. lua({ -- ./compiler/lua53.can:173
t[3], -- ./compiler/lua53.can:173
{ -- ./compiler/lua53.can:173
["tag"] = "Paren", -- ./compiler/lua53.can:173
t[4][i] -- ./compiler/lua53.can:173
}, -- ./compiler/lua53.can:173
t[1][i] -- ./compiler/lua53.can:173
}, "Op")) -- ./compiler/lua53.can:173
end -- ./compiler/lua53.can:173
return r -- ./compiler/lua53.can:175
end -- ./compiler/lua53.can:175
else -- ./compiler/lua53.can:175
local r = lua(t[1], "_lhs") .. " = " .. lua({ -- ./compiler/lua53.can:178
t[2], -- ./compiler/lua53.can:178
t[1][1], -- ./compiler/lua53.can:178
{ -- ./compiler/lua53.can:178
["tag"] = "Op", -- ./compiler/lua53.can:178
t[4], -- ./compiler/lua53.can:178
{ -- ./compiler/lua53.can:178
["tag"] = "Paren", -- ./compiler/lua53.can:178
t[5][1] -- ./compiler/lua53.can:178
}, -- ./compiler/lua53.can:178
t[1][1] -- ./compiler/lua53.can:178
} -- ./compiler/lua53.can:178
}, "Op") -- ./compiler/lua53.can:178
for i = 2, math["min"](# t[5], # t[1]), 1 do -- ./compiler/lua53.can:179
r = r .. (", " .. lua({ -- ./compiler/lua53.can:180
t[2], -- ./compiler/lua53.can:180
t[1][i], -- ./compiler/lua53.can:180
{ -- ./compiler/lua53.can:180
["tag"] = "Op", -- ./compiler/lua53.can:180
t[4], -- ./compiler/lua53.can:180
{ -- ./compiler/lua53.can:180
["tag"] = "Paren", -- ./compiler/lua53.can:180
t[5][i] -- ./compiler/lua53.can:180
}, -- ./compiler/lua53.can:180
t[1][i] -- ./compiler/lua53.can:180
} -- ./compiler/lua53.can:180
}, "Op")) -- ./compiler/lua53.can:180
end -- ./compiler/lua53.can:180
return r -- ./compiler/lua53.can:182
end -- ./compiler/lua53.can:182
end, -- ./compiler/lua53.can:182
["While"] = function(t) -- ./compiler/lua53.can:186
local hasContinue = any(t[2], { "Continue" }, loop) -- ./compiler/lua53.can:187
local r = "while " .. lua(t[1]) .. " do" .. indent() -- ./compiler/lua53.can:188
if hasContinue then -- ./compiler/lua53.can:189
r = r .. ("repeat" .. indent()) -- ./compiler/lua53.can:190
end -- ./compiler/lua53.can:190
r = r .. (lua(t[2])) -- ./compiler/lua53.can:192
if hasContinue then -- ./compiler/lua53.can:193
r = r .. (unindent() .. "until true") -- ./compiler/lua53.can:194
end -- ./compiler/lua53.can:194
r = r .. (unindent() .. "end") -- ./compiler/lua53.can:196
return r -- ./compiler/lua53.can:197
end, -- ./compiler/lua53.can:197
["Repeat"] = function(t) -- ./compiler/lua53.can:200
local hasContinue = any(t[2], { "Continue" }, loop) -- ./compiler/lua53.can:201
local r = "repeat" .. indent() -- ./compiler/lua53.can:202
if hasContinue then -- ./compiler/lua53.can:203
r = r .. ("repeat" .. indent()) -- ./compiler/lua53.can:204
end -- ./compiler/lua53.can:204
r = r .. (lua(t[1])) -- ./compiler/lua53.can:206
if hasContinue then -- ./compiler/lua53.can:207
r = r .. (unindent() .. "until true") -- ./compiler/lua53.can:208
end -- ./compiler/lua53.can:208
r = r .. (unindent() .. "until " .. lua(t[2])) -- ./compiler/lua53.can:210
return r -- ./compiler/lua53.can:211
end, -- ./compiler/lua53.can:211
["If"] = function(t) -- ./compiler/lua53.can:214
local r = "if " .. lua(t[1]) .. " then" .. indent() .. lua(t[2]) .. unindent() -- ./compiler/lua53.can:215
for i = 3, # t - 1, 2 do -- ./compiler/lua53.can:216
r = r .. ("elseif " .. lua(t[i]) .. " then" .. indent() .. lua(t[i + 1]) .. unindent()) -- ./compiler/lua53.can:217
end -- ./compiler/lua53.can:217
if # t % 2 == 1 then -- ./compiler/lua53.can:219
r = r .. ("else" .. indent() .. lua(t[# t]) .. unindent()) -- ./compiler/lua53.can:220
end -- ./compiler/lua53.can:220
return r .. "end" -- ./compiler/lua53.can:222
end, -- ./compiler/lua53.can:222
["Fornum"] = function(t) -- ./compiler/lua53.can:225
local r = "for " .. lua(t[1]) .. " = " .. lua(t[2]) .. ", " .. lua(t[3]) -- ./compiler/lua53.can:226
if # t == 5 then -- ./compiler/lua53.can:227
local hasContinue = any(t[5], { "Continue" }, loop) -- ./compiler/lua53.can:228
r = r .. (", " .. lua(t[4]) .. " do" .. indent()) -- ./compiler/lua53.can:229
if hasContinue then -- ./compiler/lua53.can:230
r = r .. ("repeat" .. indent()) -- ./compiler/lua53.can:231
end -- ./compiler/lua53.can:231
r = r .. (lua(t[5])) -- ./compiler/lua53.can:233
if hasContinue then -- ./compiler/lua53.can:234
r = r .. (unindent() .. "until true") -- ./compiler/lua53.can:235
end -- ./compiler/lua53.can:235
return r .. unindent() .. "end" -- ./compiler/lua53.can:237
else -- ./compiler/lua53.can:237
local hasContinue = any(t[4], { "Continue" }, loop) -- ./compiler/lua53.can:239
r = r .. (" do" .. indent()) -- ./compiler/lua53.can:240
if hasContinue then -- ./compiler/lua53.can:241
r = r .. ("repeat" .. indent()) -- ./compiler/lua53.can:242
end -- ./compiler/lua53.can:242
r = r .. (lua(t[4])) -- ./compiler/lua53.can:244
if hasContinue then -- ./compiler/lua53.can:245
r = r .. (unindent() .. "until true") -- ./compiler/lua53.can:246
end -- ./compiler/lua53.can:246
return r .. unindent() .. "end" -- ./compiler/lua53.can:248
end -- ./compiler/lua53.can:248
end, -- ./compiler/lua53.can:248
["Forin"] = function(t) -- ./compiler/lua53.can:252
local hasContinue = any(t[3], { "Continue" }, loop) -- ./compiler/lua53.can:253
local r = "for " .. lua(t[1], "_lhs") .. " in " .. lua(t[2], "_lhs") .. " do" .. indent() -- ./compiler/lua53.can:254
if hasContinue then -- ./compiler/lua53.can:255
r = r .. ("repeat" .. indent()) -- ./compiler/lua53.can:256
end -- ./compiler/lua53.can:256
r = r .. (lua(t[3])) -- ./compiler/lua53.can:258
if hasContinue then -- ./compiler/lua53.can:259
r = r .. (unindent() .. "until true") -- ./compiler/lua53.can:260
end -- ./compiler/lua53.can:260
return r .. unindent() .. "end" -- ./compiler/lua53.can:262
end, -- ./compiler/lua53.can:262
["Local"] = function(t) -- ./compiler/lua53.can:265
local r = "local " .. lua(t[1], "_lhs") -- ./compiler/lua53.can:266
if t[2][1] then -- ./compiler/lua53.can:267
r = r .. (" = " .. lua(t[2], "_lhs")) -- ./compiler/lua53.can:268
end -- ./compiler/lua53.can:268
return r -- ./compiler/lua53.can:270
end, -- ./compiler/lua53.can:270
["Let"] = function(t) -- ./compiler/lua53.can:273
local nameList = lua(t[1], "_lhs") -- ./compiler/lua53.can:274
local r = "local " .. nameList -- ./compiler/lua53.can:275
if t[2][1] then -- ./compiler/lua53.can:276
if any(t[2], { -- predeclaration doesn't matter otherwise -- ./compiler/lua53.can:277
"Function", -- predeclaration doesn't matter otherwise -- ./compiler/lua53.can:277
"Table", -- predeclaration doesn't matter otherwise -- ./compiler/lua53.can:277
"Paren" -- predeclaration doesn't matter otherwise -- ./compiler/lua53.can:277
}) then -- predeclaration doesn't matter otherwise -- ./compiler/lua53.can:277
r = r .. (newline() .. nameList .. " = " .. lua(t[2], "_lhs")) -- ./compiler/lua53.can:278
else -- ./compiler/lua53.can:278
r = r .. (" = " .. lua(t[2], "_lhs")) -- ./compiler/lua53.can:280
end -- ./compiler/lua53.can:280
end -- ./compiler/lua53.can:280
return r -- ./compiler/lua53.can:283
end, -- ./compiler/lua53.can:283
["Localrec"] = function(t) -- ./compiler/lua53.can:286
return "local function " .. lua(t[1][1]) .. lua(t[2][1], "_functionWithoutKeyword") -- ./compiler/lua53.can:287
end, -- ./compiler/lua53.can:287
["Goto"] = function(t) -- ./compiler/lua53.can:290
return "goto " .. lua(t, "Id") -- ./compiler/lua53.can:291
end, -- ./compiler/lua53.can:291
["Label"] = function(t) -- ./compiler/lua53.can:294
return "::" .. lua(t, "Id") .. "::" -- ./compiler/lua53.can:295
end, -- ./compiler/lua53.can:295
["Return"] = function(t) -- ./compiler/lua53.can:298
local push = peek("push") -- ./compiler/lua53.can:299
if push then -- ./compiler/lua53.can:300
local r = "" -- ./compiler/lua53.can:301
for _, val in ipairs(t) do -- ./compiler/lua53.can:302
r = r .. (push .. "[#" .. push .. "+1] = " .. lua(val) .. newline()) -- ./compiler/lua53.can:303
end -- ./compiler/lua53.can:303
return r .. "return " .. UNPACK(push) -- ./compiler/lua53.can:305
else -- ./compiler/lua53.can:305
return "return " .. lua(t, "_lhs") -- ./compiler/lua53.can:307
end -- ./compiler/lua53.can:307
end, -- ./compiler/lua53.can:307
["Push"] = function(t) -- ./compiler/lua53.can:311
local var = assert(peek("push"), "no context given for push") -- ./compiler/lua53.can:312
r = "" -- ./compiler/lua53.can:313
for i = 1, # t - 1, 1 do -- ./compiler/lua53.can:314
r = r .. (var .. "[#" .. var .. "+1] = " .. lua(t[i]) .. newline()) -- ./compiler/lua53.can:315
end -- ./compiler/lua53.can:315
if t[# t] then -- ./compiler/lua53.can:317
if t[# t]["tag"] == "Call" or t[# t]["tag"] == "Invoke" then -- ./compiler/lua53.can:318
r = r .. (APPEND(var, lua(t[# t]))) -- ./compiler/lua53.can:319
else -- ./compiler/lua53.can:319
r = r .. (var .. "[#" .. var .. "+1] = " .. lua(t[# t])) -- ./compiler/lua53.can:321
end -- ./compiler/lua53.can:321
end -- ./compiler/lua53.can:321
return r -- ./compiler/lua53.can:324
end, -- ./compiler/lua53.can:324
["Break"] = function() -- ./compiler/lua53.can:327
return "break" -- ./compiler/lua53.can:328
end, -- ./compiler/lua53.can:328
["Continue"] = function() -- ./compiler/lua53.can:331
return "break" -- ./compiler/lua53.can:332
end, -- ./compiler/lua53.can:332
["Nil"] = function() -- ./compiler/lua53.can:339
return "nil" -- ./compiler/lua53.can:340
end, -- ./compiler/lua53.can:340
["Dots"] = function() -- ./compiler/lua53.can:343
return "..." -- ./compiler/lua53.can:344
end, -- ./compiler/lua53.can:344
["Boolean"] = function(t) -- ./compiler/lua53.can:347
return tostring(t[1]) -- ./compiler/lua53.can:348
end, -- ./compiler/lua53.can:348
["Number"] = function(t) -- ./compiler/lua53.can:351
return tostring(t[1]) -- ./compiler/lua53.can:352
end, -- ./compiler/lua53.can:352
["String"] = function(t) -- ./compiler/lua53.can:355
return ("%q"):format(t[1]) -- ./compiler/lua53.can:356
end, -- ./compiler/lua53.can:356
["_functionWithoutKeyword"] = function(t) -- ./compiler/lua53.can:359
local r = "(" -- ./compiler/lua53.can:360
local decl = {} -- ./compiler/lua53.can:361
if t[1][1] then -- ./compiler/lua53.can:362
if t[1][1]["tag"] == "ParPair" then -- ./compiler/lua53.can:363
local id = lua(t[1][1][1]) -- ./compiler/lua53.can:364
indentLevel = indentLevel + (1) -- ./compiler/lua53.can:365
table["insert"](decl, "if " .. id .. " == nil then " .. id .. " = " .. lua(t[1][1][2]) .. " end") -- ./compiler/lua53.can:366
indentLevel = indentLevel - (1) -- ./compiler/lua53.can:367
r = r .. (id) -- ./compiler/lua53.can:368
else -- ./compiler/lua53.can:368
r = r .. (lua(t[1][1])) -- ./compiler/lua53.can:370
end -- ./compiler/lua53.can:370
for i = 2, # t[1], 1 do -- ./compiler/lua53.can:372
if t[1][i]["tag"] == "ParPair" then -- ./compiler/lua53.can:373
local id = lua(t[1][i][1]) -- ./compiler/lua53.can:374
indentLevel = indentLevel + (1) -- ./compiler/lua53.can:375
table["insert"](decl, "if " .. id .. " == nil then " .. id .. " = " .. lua(t[1][i][2]) .. " end") -- ./compiler/lua53.can:376
indentLevel = indentLevel - (1) -- ./compiler/lua53.can:377
r = r .. (", " .. id) -- ./compiler/lua53.can:378
else -- ./compiler/lua53.can:378
r = r .. (", " .. lua(t[1][i])) -- ./compiler/lua53.can:380
end -- ./compiler/lua53.can:380
end -- ./compiler/lua53.can:380
end -- ./compiler/lua53.can:380
r = r .. (")" .. indent()) -- ./compiler/lua53.can:384
for _, d in ipairs(decl) do -- ./compiler/lua53.can:385
r = r .. (d .. newline()) -- ./compiler/lua53.can:386
end -- ./compiler/lua53.can:386
if t[2][# t[2]] and t[2][# t[2]]["tag"] == "Push" then -- convert final push to return -- ./compiler/lua53.can:388
t[2][# t[2]]["tag"] = "Return" -- ./compiler/lua53.can:389
end -- ./compiler/lua53.can:389
local hasPush = any(t[2], { "Push" }, func) -- ./compiler/lua53.can:391
if hasPush then -- ./compiler/lua53.can:392
r = r .. (push("push", var("push")) .. "local " .. var("push") .. " = {}" .. newline()) -- ./compiler/lua53.can:393
else -- ./compiler/lua53.can:393
push("push", false) -- no push here (make sure higher push don't affect us) -- ./compiler/lua53.can:395
end -- no push here (make sure higher push don't affect us) -- ./compiler/lua53.can:395
r = r .. (lua(t[2])) -- ./compiler/lua53.can:397
if hasPush and (t[2][# t[2]] and t[2][# t[2]]["tag"] ~= "Return") then -- add return only if needed -- ./compiler/lua53.can:398
r = r .. (newline() .. "return " .. UNPACK(var("push"))) -- ./compiler/lua53.can:399
end -- ./compiler/lua53.can:399
pop("push") -- ./compiler/lua53.can:401
return r .. unindent() .. "end" -- ./compiler/lua53.can:402
end, -- ./compiler/lua53.can:402
["Function"] = function(t) -- ./compiler/lua53.can:404
return "function" .. lua(t, "_functionWithoutKeyword") -- ./compiler/lua53.can:405
end, -- ./compiler/lua53.can:405
["Pair"] = function(t) -- ./compiler/lua53.can:408
return "[" .. lua(t[1]) .. "] = " .. lua(t[2]) -- ./compiler/lua53.can:409
end, -- ./compiler/lua53.can:409
["Table"] = function(t) -- ./compiler/lua53.can:411
if # t == 0 then -- ./compiler/lua53.can:412
return "{}" -- ./compiler/lua53.can:413
elseif # t == 1 then -- ./compiler/lua53.can:414
return "{ " .. lua(t, "_lhs") .. " }" -- ./compiler/lua53.can:415
else -- ./compiler/lua53.can:415
return "{" .. indent() .. lua(t, "_lhs", nil, true) .. unindent() .. "}" -- ./compiler/lua53.can:417
end -- ./compiler/lua53.can:417
end, -- ./compiler/lua53.can:417
["TableCompr"] = function(t) -- ./compiler/lua53.can:421
return push("push", "self") .. "(function()" .. indent() .. "local self = {}" .. newline() .. lua(t[1]) .. newline() .. "return self" .. unindent() .. "end)()" .. pop("push") -- ./compiler/lua53.can:422
end, -- ./compiler/lua53.can:422
["Op"] = function(t) -- ./compiler/lua53.can:425
local r -- ./compiler/lua53.can:426
if # t == 2 then -- ./compiler/lua53.can:427
if type(tags["_opid"][t[1]]) == "string" then -- ./compiler/lua53.can:428
r = tags["_opid"][t[1]] .. " " .. lua(t[2]) -- ./compiler/lua53.can:429
else -- ./compiler/lua53.can:429
r = tags["_opid"][t[1]](t[2]) -- ./compiler/lua53.can:431
end -- ./compiler/lua53.can:431
else -- ./compiler/lua53.can:431
if type(tags["_opid"][t[1]]) == "string" then -- ./compiler/lua53.can:434
r = lua(t[2]) .. " " .. tags["_opid"][t[1]] .. " " .. lua(t[3]) -- ./compiler/lua53.can:435
else -- ./compiler/lua53.can:435
r = tags["_opid"][t[1]](t[2], t[3]) -- ./compiler/lua53.can:437
end -- ./compiler/lua53.can:437
end -- ./compiler/lua53.can:437
return r -- ./compiler/lua53.can:440
end, -- ./compiler/lua53.can:440
["Paren"] = function(t) -- ./compiler/lua53.can:443
return "(" .. lua(t[1]) .. ")" -- ./compiler/lua53.can:444
end, -- ./compiler/lua53.can:444
["_statexpr"] = function(t, stat) -- ./compiler/lua53.can:451
local hasPush = any(t, { "Push" }, func) -- ./compiler/lua53.can:452
local r = "(function()" .. indent() -- ./compiler/lua53.can:453
if hasPush then -- ./compiler/lua53.can:454
r = r .. (push("push", var("push")) .. "local " .. var("push") .. " = {}" .. newline()) -- ./compiler/lua53.can:455
else -- ./compiler/lua53.can:455
push("push", false) -- no push here (make sure higher push don't affect us) -- ./compiler/lua53.can:457
end -- no push here (make sure higher push don't affect us) -- ./compiler/lua53.can:457
r = r .. (lua(t, stat)) -- ./compiler/lua53.can:459
if hasPush then -- ./compiler/lua53.can:460
r = r .. (newline() .. "return " .. UNPACK(var("push"))) -- ./compiler/lua53.can:461
end -- ./compiler/lua53.can:461
pop("push") -- ./compiler/lua53.can:463
r = r .. (unindent() .. "end)()") -- ./compiler/lua53.can:464
return r -- ./compiler/lua53.can:465
end, -- ./compiler/lua53.can:465
["DoExpr"] = function(t) -- ./compiler/lua53.can:468
if t[# t]["tag"] == "Push" then -- convert final push to return -- ./compiler/lua53.can:469
t[# t]["tag"] = "Return" -- ./compiler/lua53.can:470
end -- ./compiler/lua53.can:470
return lua(t, "_statexpr", "Do") -- ./compiler/lua53.can:472
end, -- ./compiler/lua53.can:472
["WhileExpr"] = function(t) -- ./compiler/lua53.can:475
return lua(t, "_statexpr", "While") -- ./compiler/lua53.can:476
end, -- ./compiler/lua53.can:476
["RepeatExpr"] = function(t) -- ./compiler/lua53.can:479
return lua(t, "_statexpr", "Repeat") -- ./compiler/lua53.can:480
end, -- ./compiler/lua53.can:480
["IfExpr"] = function(t) -- ./compiler/lua53.can:483
for i = 2, # t do -- convert final pushes to returns -- ./compiler/lua53.can:484
local block = t[i] -- ./compiler/lua53.can:485
if block[# block] and block[# block]["tag"] == "Push" then -- ./compiler/lua53.can:486
block[# block]["tag"] = "Return" -- ./compiler/lua53.can:487
end -- ./compiler/lua53.can:487
end -- ./compiler/lua53.can:487
return lua(t, "_statexpr", "If") -- ./compiler/lua53.can:490
end, -- ./compiler/lua53.can:490
["FornumExpr"] = function(t) -- ./compiler/lua53.can:493
return lua(t, "_statexpr", "Fornum") -- ./compiler/lua53.can:494
end, -- ./compiler/lua53.can:494
["ForinExpr"] = function(t) -- ./compiler/lua53.can:497
return lua(t, "_statexpr", "Forin") -- ./compiler/lua53.can:498
end, -- ./compiler/lua53.can:498
["Call"] = function(t) -- ./compiler/lua53.can:504
return lua(t[1]) .. "(" .. lua(t, "_lhs", 2) .. ")" -- ./compiler/lua53.can:505
end, -- ./compiler/lua53.can:505
["Invoke"] = function(t) -- ./compiler/lua53.can:509
return lua(t[1]) .. ":" .. lua(t[2], "Id") .. "(" .. lua(t, "_lhs", 3) .. ")" -- ./compiler/lua53.can:510
end, -- ./compiler/lua53.can:510
["_lhs"] = function(t, start, newlines) -- ./compiler/lua53.can:514
if start == nil then start = 1 end -- ./compiler/lua53.can:514
local r -- ./compiler/lua53.can:515
if t[start] then -- ./compiler/lua53.can:516
r = lua(t[start]) -- ./compiler/lua53.can:517
for i = start + 1, # t, 1 do -- ./compiler/lua53.can:518
r = r .. ("," .. (newlines and newline() or " ") .. lua(t[i])) -- ./compiler/lua53.can:519
end -- ./compiler/lua53.can:519
else -- ./compiler/lua53.can:519
r = "" -- ./compiler/lua53.can:522
end -- ./compiler/lua53.can:522
return r -- ./compiler/lua53.can:524
end, -- ./compiler/lua53.can:524
["Id"] = function(t) -- ./compiler/lua53.can:527
return t[1] -- ./compiler/lua53.can:528
end, -- ./compiler/lua53.can:528
["Index"] = function(t) -- ./compiler/lua53.can:531
return lua(t[1]) .. "[" .. lua(t[2]) .. "]" -- ./compiler/lua53.can:532
end, -- ./compiler/lua53.can:532
["_opid"] = { -- ./compiler/lua53.can:536
["add"] = "+", -- ./compiler/lua53.can:537
["sub"] = "-", -- ./compiler/lua53.can:537
["mul"] = "*", -- ./compiler/lua53.can:537
["div"] = "/", -- ./compiler/lua53.can:537
["idiv"] = "//", -- ./compiler/lua53.can:538
["mod"] = "%", -- ./compiler/lua53.can:538
["pow"] = "^", -- ./compiler/lua53.can:538
["concat"] = "..", -- ./compiler/lua53.can:538
["band"] = "&", -- ./compiler/lua53.can:539
["bor"] = "|", -- ./compiler/lua53.can:539
["bxor"] = "~", -- ./compiler/lua53.can:539
["shl"] = "<<", -- ./compiler/lua53.can:539
["shr"] = ">>", -- ./compiler/lua53.can:539
["eq"] = "==", -- ./compiler/lua53.can:540
["ne"] = "~=", -- ./compiler/lua53.can:540
["lt"] = "<", -- ./compiler/lua53.can:540
["gt"] = ">", -- ./compiler/lua53.can:540
["le"] = "<=", -- ./compiler/lua53.can:540
["ge"] = ">=", -- ./compiler/lua53.can:540
["and"] = "and", -- ./compiler/lua53.can:541
["or"] = "or", -- ./compiler/lua53.can:541
["unm"] = "-", -- ./compiler/lua53.can:541
["len"] = "#", -- ./compiler/lua53.can:541
["bnot"] = "~", -- ./compiler/lua53.can:541
["not"] = "not" -- ./compiler/lua53.can:541
} -- ./compiler/lua53.can:541
}, { ["__index"] = function(self, key) -- ./compiler/lua53.can:544
error("don't know how to compile a " .. tostring(key) .. " to Lua 5.3") -- ./compiler/lua53.can:545
end }) -- ./compiler/lua53.can:545
UNPACK = function(list, i, j) -- ./compiler/luajit.can:1
return "unpack(" .. list .. (i and (", " .. i .. (j and (", " .. j) or "")) or "") .. ")" -- ./compiler/luajit.can:2
end -- ./compiler/luajit.can:2
APPEND = function(t, toAppend) -- ./compiler/luajit.can:4
return "do" .. indent() .. "local a, p = { " .. toAppend .. " }, #" .. t .. "+1" .. newline() .. "for i=1, #a do" .. indent() .. t .. "[p] = a[i]" .. newline() .. "p = p + 1" .. unindent() .. "end" .. unindent() .. "end" -- ./compiler/luajit.can:5
end -- ./compiler/luajit.can:5
tags["_opid"]["idiv"] = function(left, right) -- ./compiler/luajit.can:8
return "math.floor(" .. lua(left) .. " / " .. lua(right) .. ")" -- ./compiler/luajit.can:9
end -- ./compiler/luajit.can:9
tags["_opid"]["band"] = function(left, right) -- ./compiler/luajit.can:11
addRequire("bit", "band", "band") -- ./compiler/luajit.can:12
return var("band") .. "(" .. lua(left) .. ", " .. lua(right) .. ")" -- ./compiler/luajit.can:13
end -- ./compiler/luajit.can:13
tags["_opid"]["bor"] = function(left, right) -- ./compiler/luajit.can:15
addRequire("bit", "bor", "bor") -- ./compiler/luajit.can:16
return var("bor") .. "(" .. lua(left) .. ", " .. lua(right) .. ")" -- ./compiler/luajit.can:17
end -- ./compiler/luajit.can:17
tags["_opid"]["bxor"] = function(left, right) -- ./compiler/luajit.can:19
addRequire("bit", "bxor", "bxor") -- ./compiler/luajit.can:20
return var("bxor") .. "(" .. lua(left) .. ", " .. lua(right) .. ")" -- ./compiler/luajit.can:21
end -- ./compiler/luajit.can:21
tags["_opid"]["shl"] = function(left, right) -- ./compiler/luajit.can:23
addRequire("bit", "lshift", "lshift") -- ./compiler/luajit.can:24
return var("lshift") .. "(" .. lua(left) .. ", " .. lua(right) .. ")" -- ./compiler/luajit.can:25
end -- ./compiler/luajit.can:25
tags["_opid"]["shr"] = function(left, right) -- ./compiler/luajit.can:27
addRequire("bit", "rshift", "rshift") -- ./compiler/luajit.can:28
return var("rshift") .. "(" .. lua(left) .. ", " .. lua(right) .. ")" -- ./compiler/luajit.can:29
end -- ./compiler/luajit.can:29
tags["_opid"]["bnot"] = function(right) -- ./compiler/luajit.can:31
addRequire("bit", "bnot", "bnot") -- ./compiler/luajit.can:32
return var("bnot") .. "(" .. lua(right) .. ")" -- ./compiler/luajit.can:33
end -- ./compiler/luajit.can:33
local code = lua(ast) .. newline() -- ./compiler/lua53.can:551
return requireStr .. code -- ./compiler/lua53.can:552
end -- ./compiler/lua53.can:552
end -- ./compiler/lua53.can:552
local lua53 = _() or lua53 -- ./compiler/lua53.can:557
return lua53 -- ./compiler/luajit.can:40
end -- ./compiler/luajit.can:40
local luajit = _() or luajit -- ./compiler/luajit.can:44
package["loaded"]["compiler.luajit"] = luajit or true -- ./compiler/luajit.can:45
local function _() -- ./compiler/luajit.can:49
local scope = {} -- ./lib/lua-parser/scope.lua:4
scope["lineno"] = function(s, i) -- ./lib/lua-parser/scope.lua:6
if i == 1 then -- ./lib/lua-parser/scope.lua:7
return 1, 1 -- ./lib/lua-parser/scope.lua:7
end -- ./lib/lua-parser/scope.lua:7
local l, lastline = 0, "" -- ./lib/lua-parser/scope.lua:8
s = s:sub(1, i) .. "\
" -- ./lib/lua-parser/scope.lua:9
for line in s:gmatch("[^\
]*[\
]") do -- ./lib/lua-parser/scope.lua:10
l = l + 1 -- ./lib/lua-parser/scope.lua:11
lastline = line -- ./lib/lua-parser/scope.lua:12
end -- ./lib/lua-parser/scope.lua:12
local c = lastline:len() - 1 -- ./lib/lua-parser/scope.lua:14
return l, c ~= 0 and c or 1 -- ./lib/lua-parser/scope.lua:15
end -- ./lib/lua-parser/scope.lua:15
scope["new_scope"] = function(env) -- ./lib/lua-parser/scope.lua:18
if not env["scope"] then -- ./lib/lua-parser/scope.lua:19
env["scope"] = 0 -- ./lib/lua-parser/scope.lua:20
else -- ./lib/lua-parser/scope.lua:20
env["scope"] = env["scope"] + 1 -- ./lib/lua-parser/scope.lua:22
end -- ./lib/lua-parser/scope.lua:22
local scope = env["scope"] -- ./lib/lua-parser/scope.lua:24
env["maxscope"] = scope -- ./lib/lua-parser/scope.lua:25
env[scope] = {} -- ./lib/lua-parser/scope.lua:26
env[scope]["label"] = {} -- ./lib/lua-parser/scope.lua:27
env[scope]["local"] = {} -- ./lib/lua-parser/scope.lua:28
env[scope]["goto"] = {} -- ./lib/lua-parser/scope.lua:29
end -- ./lib/lua-parser/scope.lua:29
scope["begin_scope"] = function(env) -- ./lib/lua-parser/scope.lua:32
env["scope"] = env["scope"] + 1 -- ./lib/lua-parser/scope.lua:33
end -- ./lib/lua-parser/scope.lua:33
scope["end_scope"] = function(env) -- ./lib/lua-parser/scope.lua:36
env["scope"] = env["scope"] - 1 -- ./lib/lua-parser/scope.lua:37
end -- ./lib/lua-parser/scope.lua:37
scope["new_function"] = function(env) -- ./lib/lua-parser/scope.lua:40
if not env["fscope"] then -- ./lib/lua-parser/scope.lua:41
env["fscope"] = 0 -- ./lib/lua-parser/scope.lua:42
else -- ./lib/lua-parser/scope.lua:42
env["fscope"] = env["fscope"] + 1 -- ./lib/lua-parser/scope.lua:44
end -- ./lib/lua-parser/scope.lua:44
local fscope = env["fscope"] -- ./lib/lua-parser/scope.lua:46
env["function"][fscope] = {} -- ./lib/lua-parser/scope.lua:47
end -- ./lib/lua-parser/scope.lua:47
scope["begin_function"] = function(env) -- ./lib/lua-parser/scope.lua:50
env["fscope"] = env["fscope"] + 1 -- ./lib/lua-parser/scope.lua:51
end -- ./lib/lua-parser/scope.lua:51
scope["end_function"] = function(env) -- ./lib/lua-parser/scope.lua:54
env["fscope"] = env["fscope"] - 1 -- ./lib/lua-parser/scope.lua:55
end -- ./lib/lua-parser/scope.lua:55
scope["begin_loop"] = function(env) -- ./lib/lua-parser/scope.lua:58
if not env["loop"] then -- ./lib/lua-parser/scope.lua:59
env["loop"] = 1 -- ./lib/lua-parser/scope.lua:60
else -- ./lib/lua-parser/scope.lua:60
env["loop"] = env["loop"] + 1 -- ./lib/lua-parser/scope.lua:62
end -- ./lib/lua-parser/scope.lua:62
end -- ./lib/lua-parser/scope.lua:62
scope["end_loop"] = function(env) -- ./lib/lua-parser/scope.lua:66
env["loop"] = env["loop"] - 1 -- ./lib/lua-parser/scope.lua:67
end -- ./lib/lua-parser/scope.lua:67
scope["insideloop"] = function(env) -- ./lib/lua-parser/scope.lua:70
return env["loop"] and env["loop"] > 0 -- ./lib/lua-parser/scope.lua:71
end -- ./lib/lua-parser/scope.lua:71
return scope -- ./lib/lua-parser/scope.lua:74
end -- ./lib/lua-parser/scope.lua:74
local scope = _() or scope -- ./lib/lua-parser/scope.lua:78
package["loaded"]["lib.lua-parser.scope"] = scope or true -- ./lib/lua-parser/scope.lua:79
local function _() -- ./lib/lua-parser/scope.lua:82
local scope = require("lib.lua-parser.scope") -- ./lib/lua-parser/validator.lua:4
local lineno = scope["lineno"] -- ./lib/lua-parser/validator.lua:6
local new_scope, end_scope = scope["new_scope"], scope["end_scope"] -- ./lib/lua-parser/validator.lua:7
local new_function, end_function = scope["new_function"], scope["end_function"] -- ./lib/lua-parser/validator.lua:8
local begin_loop, end_loop = scope["begin_loop"], scope["end_loop"] -- ./lib/lua-parser/validator.lua:9
local insideloop = scope["insideloop"] -- ./lib/lua-parser/validator.lua:10
local function syntaxerror(errorinfo, pos, msg) -- ./lib/lua-parser/validator.lua:13
local l, c = lineno(errorinfo["subject"], pos) -- ./lib/lua-parser/validator.lua:14
local error_msg = "%s:%d:%d: syntax error, %s" -- ./lib/lua-parser/validator.lua:15
return string["format"](error_msg, errorinfo["filename"], l, c, msg) -- ./lib/lua-parser/validator.lua:16
end -- ./lib/lua-parser/validator.lua:16
local function exist_label(env, scope, stm) -- ./lib/lua-parser/validator.lua:19
local l = stm[1] -- ./lib/lua-parser/validator.lua:20
for s = scope, 0, - 1 do -- ./lib/lua-parser/validator.lua:21
if env[s]["label"][l] then -- ./lib/lua-parser/validator.lua:22
return true -- ./lib/lua-parser/validator.lua:22
end -- ./lib/lua-parser/validator.lua:22
end -- ./lib/lua-parser/validator.lua:22
return false -- ./lib/lua-parser/validator.lua:24
end -- ./lib/lua-parser/validator.lua:24
local function set_label(env, label, pos) -- ./lib/lua-parser/validator.lua:27
local scope = env["scope"] -- ./lib/lua-parser/validator.lua:28
local l = env[scope]["label"][label] -- ./lib/lua-parser/validator.lua:29
if not l then -- ./lib/lua-parser/validator.lua:30
env[scope]["label"][label] = { -- ./lib/lua-parser/validator.lua:31
["name"] = label, -- ./lib/lua-parser/validator.lua:31
["pos"] = pos -- ./lib/lua-parser/validator.lua:31
} -- ./lib/lua-parser/validator.lua:31
return true -- ./lib/lua-parser/validator.lua:32
else -- ./lib/lua-parser/validator.lua:32
local msg = "label '%s' already defined at line %d" -- ./lib/lua-parser/validator.lua:34
local line = lineno(env["errorinfo"]["subject"], l["pos"]) -- ./lib/lua-parser/validator.lua:35
msg = string["format"](msg, label, line) -- ./lib/lua-parser/validator.lua:36
return nil, syntaxerror(env["errorinfo"], pos, msg) -- ./lib/lua-parser/validator.lua:37
end -- ./lib/lua-parser/validator.lua:37
end -- ./lib/lua-parser/validator.lua:37
local function set_pending_goto(env, stm) -- ./lib/lua-parser/validator.lua:41
local scope = env["scope"] -- ./lib/lua-parser/validator.lua:42
table["insert"](env[scope]["goto"], stm) -- ./lib/lua-parser/validator.lua:43
return true -- ./lib/lua-parser/validator.lua:44
end -- ./lib/lua-parser/validator.lua:44
local function verify_pending_gotos(env) -- ./lib/lua-parser/validator.lua:47
for s = env["maxscope"], 0, - 1 do -- ./lib/lua-parser/validator.lua:48
for k, v in ipairs(env[s]["goto"]) do -- ./lib/lua-parser/validator.lua:49
if not exist_label(env, s, v) then -- ./lib/lua-parser/validator.lua:50
local msg = "no visible label '%s' for <goto>" -- ./lib/lua-parser/validator.lua:51
msg = string["format"](msg, v[1]) -- ./lib/lua-parser/validator.lua:52
return nil, syntaxerror(env["errorinfo"], v["pos"], msg) -- ./lib/lua-parser/validator.lua:53
end -- ./lib/lua-parser/validator.lua:53
end -- ./lib/lua-parser/validator.lua:53
end -- ./lib/lua-parser/validator.lua:53
return true -- ./lib/lua-parser/validator.lua:57
end -- ./lib/lua-parser/validator.lua:57
local function set_vararg(env, is_vararg) -- ./lib/lua-parser/validator.lua:60
env["function"][env["fscope"]]["is_vararg"] = is_vararg -- ./lib/lua-parser/validator.lua:61
end -- ./lib/lua-parser/validator.lua:61
local traverse_stm, traverse_exp, traverse_var -- ./lib/lua-parser/validator.lua:64
local traverse_block, traverse_explist, traverse_varlist, traverse_parlist -- ./lib/lua-parser/validator.lua:65
traverse_parlist = function(env, parlist) -- ./lib/lua-parser/validator.lua:67
local len = # parlist -- ./lib/lua-parser/validator.lua:68
local is_vararg = false -- ./lib/lua-parser/validator.lua:69
if len > 0 and parlist[len]["tag"] == "Dots" then -- ./lib/lua-parser/validator.lua:70
is_vararg = true -- ./lib/lua-parser/validator.lua:71
end -- ./lib/lua-parser/validator.lua:71
set_vararg(env, is_vararg) -- ./lib/lua-parser/validator.lua:73
return true -- ./lib/lua-parser/validator.lua:74
end -- ./lib/lua-parser/validator.lua:74
local function traverse_function(env, exp) -- ./lib/lua-parser/validator.lua:77
new_function(env) -- ./lib/lua-parser/validator.lua:78
new_scope(env) -- ./lib/lua-parser/validator.lua:79
local status, msg = traverse_parlist(env, exp[1]) -- ./lib/lua-parser/validator.lua:80
if not status then -- ./lib/lua-parser/validator.lua:81
return status, msg -- ./lib/lua-parser/validator.lua:81
end -- ./lib/lua-parser/validator.lua:81
status, msg = traverse_block(env, exp[2]) -- ./lib/lua-parser/validator.lua:82
if not status then -- ./lib/lua-parser/validator.lua:83
return status, msg -- ./lib/lua-parser/validator.lua:83
end -- ./lib/lua-parser/validator.lua:83
end_scope(env) -- ./lib/lua-parser/validator.lua:84
end_function(env) -- ./lib/lua-parser/validator.lua:85
return true -- ./lib/lua-parser/validator.lua:86
end -- ./lib/lua-parser/validator.lua:86
local function traverse_tablecompr(env, exp) -- ./lib/lua-parser/validator.lua:89
new_function(env) -- ./lib/lua-parser/validator.lua:90
new_scope(env) -- ./lib/lua-parser/validator.lua:91
local status, msg = traverse_block(env, exp[1]) -- ./lib/lua-parser/validator.lua:92
if not status then -- ./lib/lua-parser/validator.lua:93
return status, msg -- ./lib/lua-parser/validator.lua:93
end -- ./lib/lua-parser/validator.lua:93
end_scope(env) -- ./lib/lua-parser/validator.lua:94
end_function(env) -- ./lib/lua-parser/validator.lua:95
return true -- ./lib/lua-parser/validator.lua:96
end -- ./lib/lua-parser/validator.lua:96
local function traverse_statexpr(env, exp) -- ./lib/lua-parser/validator.lua:99
new_function(env) -- ./lib/lua-parser/validator.lua:100
new_scope(env) -- ./lib/lua-parser/validator.lua:101
exp["tag"] = exp["tag"]:gsub("Expr$", "") -- ./lib/lua-parser/validator.lua:102
local status, msg = traverse_stm(env, exp) -- ./lib/lua-parser/validator.lua:103
exp["tag"] = exp["tag"] .. "Expr" -- ./lib/lua-parser/validator.lua:104
if not status then -- ./lib/lua-parser/validator.lua:105
return status, msg -- ./lib/lua-parser/validator.lua:105
end -- ./lib/lua-parser/validator.lua:105
end_scope(env) -- ./lib/lua-parser/validator.lua:106
end_function(env) -- ./lib/lua-parser/validator.lua:107
return true -- ./lib/lua-parser/validator.lua:108
end -- ./lib/lua-parser/validator.lua:108
local function traverse_op(env, exp) -- ./lib/lua-parser/validator.lua:111
local status, msg = traverse_exp(env, exp[2]) -- ./lib/lua-parser/validator.lua:112
if not status then -- ./lib/lua-parser/validator.lua:113
return status, msg -- ./lib/lua-parser/validator.lua:113
end -- ./lib/lua-parser/validator.lua:113
if exp[3] then -- ./lib/lua-parser/validator.lua:114
status, msg = traverse_exp(env, exp[3]) -- ./lib/lua-parser/validator.lua:115
if not status then -- ./lib/lua-parser/validator.lua:116
return status, msg -- ./lib/lua-parser/validator.lua:116
end -- ./lib/lua-parser/validator.lua:116
end -- ./lib/lua-parser/validator.lua:116
return true -- ./lib/lua-parser/validator.lua:118
end -- ./lib/lua-parser/validator.lua:118
local function traverse_paren(env, exp) -- ./lib/lua-parser/validator.lua:121
local status, msg = traverse_exp(env, exp[1]) -- ./lib/lua-parser/validator.lua:122
if not status then -- ./lib/lua-parser/validator.lua:123
return status, msg -- ./lib/lua-parser/validator.lua:123
end -- ./lib/lua-parser/validator.lua:123
return true -- ./lib/lua-parser/validator.lua:124
end -- ./lib/lua-parser/validator.lua:124
local function traverse_table(env, fieldlist) -- ./lib/lua-parser/validator.lua:127
for k, v in ipairs(fieldlist) do -- ./lib/lua-parser/validator.lua:128
local tag = v["tag"] -- ./lib/lua-parser/validator.lua:129
if tag == "Pair" then -- ./lib/lua-parser/validator.lua:130
local status, msg = traverse_exp(env, v[1]) -- ./lib/lua-parser/validator.lua:131
if not status then -- ./lib/lua-parser/validator.lua:132
return status, msg -- ./lib/lua-parser/validator.lua:132
end -- ./lib/lua-parser/validator.lua:132
status, msg = traverse_exp(env, v[2]) -- ./lib/lua-parser/validator.lua:133
if not status then -- ./lib/lua-parser/validator.lua:134
return status, msg -- ./lib/lua-parser/validator.lua:134
end -- ./lib/lua-parser/validator.lua:134
else -- ./lib/lua-parser/validator.lua:134
local status, msg = traverse_exp(env, v) -- ./lib/lua-parser/validator.lua:136
if not status then -- ./lib/lua-parser/validator.lua:137
return status, msg -- ./lib/lua-parser/validator.lua:137
end -- ./lib/lua-parser/validator.lua:137
end -- ./lib/lua-parser/validator.lua:137
end -- ./lib/lua-parser/validator.lua:137
return true -- ./lib/lua-parser/validator.lua:140
end -- ./lib/lua-parser/validator.lua:140
local function traverse_vararg(env, exp) -- ./lib/lua-parser/validator.lua:143
if not env["function"][env["fscope"]]["is_vararg"] then -- ./lib/lua-parser/validator.lua:144
local msg = "cannot use '...' outside a vararg function" -- ./lib/lua-parser/validator.lua:145
return nil, syntaxerror(env["errorinfo"], exp["pos"], msg) -- ./lib/lua-parser/validator.lua:146
end -- ./lib/lua-parser/validator.lua:146
return true -- ./lib/lua-parser/validator.lua:148
end -- ./lib/lua-parser/validator.lua:148
local function traverse_call(env, call) -- ./lib/lua-parser/validator.lua:151
local status, msg = traverse_exp(env, call[1]) -- ./lib/lua-parser/validator.lua:152
if not status then -- ./lib/lua-parser/validator.lua:153
return status, msg -- ./lib/lua-parser/validator.lua:153
end -- ./lib/lua-parser/validator.lua:153
for i = 2, # call do -- ./lib/lua-parser/validator.lua:154
status, msg = traverse_exp(env, call[i]) -- ./lib/lua-parser/validator.lua:155
if not status then -- ./lib/lua-parser/validator.lua:156
return status, msg -- ./lib/lua-parser/validator.lua:156
end -- ./lib/lua-parser/validator.lua:156
end -- ./lib/lua-parser/validator.lua:156
return true -- ./lib/lua-parser/validator.lua:158
end -- ./lib/lua-parser/validator.lua:158
local function traverse_invoke(env, invoke) -- ./lib/lua-parser/validator.lua:161
local status, msg = traverse_exp(env, invoke[1]) -- ./lib/lua-parser/validator.lua:162
if not status then -- ./lib/lua-parser/validator.lua:163
return status, msg -- ./lib/lua-parser/validator.lua:163
end -- ./lib/lua-parser/validator.lua:163
for i = 3, # invoke do -- ./lib/lua-parser/validator.lua:164
status, msg = traverse_exp(env, invoke[i]) -- ./lib/lua-parser/validator.lua:165
if not status then -- ./lib/lua-parser/validator.lua:166
return status, msg -- ./lib/lua-parser/validator.lua:166
end -- ./lib/lua-parser/validator.lua:166
end -- ./lib/lua-parser/validator.lua:166
return true -- ./lib/lua-parser/validator.lua:168
end -- ./lib/lua-parser/validator.lua:168
local function traverse_assignment(env, stm) -- ./lib/lua-parser/validator.lua:171
local status, msg = traverse_varlist(env, stm[1]) -- ./lib/lua-parser/validator.lua:172
if not status then -- ./lib/lua-parser/validator.lua:173
return status, msg -- ./lib/lua-parser/validator.lua:173
end -- ./lib/lua-parser/validator.lua:173
status, msg = traverse_explist(env, stm[# stm]) -- ./lib/lua-parser/validator.lua:174
if not status then -- ./lib/lua-parser/validator.lua:175
return status, msg -- ./lib/lua-parser/validator.lua:175
end -- ./lib/lua-parser/validator.lua:175
return true -- ./lib/lua-parser/validator.lua:176
end -- ./lib/lua-parser/validator.lua:176
local function traverse_break(env, stm) -- ./lib/lua-parser/validator.lua:179
if not insideloop(env) then -- ./lib/lua-parser/validator.lua:180
local msg = "<break> not inside a loop" -- ./lib/lua-parser/validator.lua:181
return nil, syntaxerror(env["errorinfo"], stm["pos"], msg) -- ./lib/lua-parser/validator.lua:182
end -- ./lib/lua-parser/validator.lua:182
return true -- ./lib/lua-parser/validator.lua:184
end -- ./lib/lua-parser/validator.lua:184
local function traverse_continue(env, stm) -- ./lib/lua-parser/validator.lua:187
if not insideloop(env) then -- ./lib/lua-parser/validator.lua:188
local msg = "<continue> not inside a loop" -- ./lib/lua-parser/validator.lua:189
return nil, syntaxerror(env["errorinfo"], stm["pos"], msg) -- ./lib/lua-parser/validator.lua:190
end -- ./lib/lua-parser/validator.lua:190
return true -- ./lib/lua-parser/validator.lua:192
end -- ./lib/lua-parser/validator.lua:192
local function traverse_push(env, stm) -- ./lib/lua-parser/validator.lua:195
local status, msg = traverse_explist(env, stm) -- ./lib/lua-parser/validator.lua:196
if not status then -- ./lib/lua-parser/validator.lua:197
return status, msg -- ./lib/lua-parser/validator.lua:197
end -- ./lib/lua-parser/validator.lua:197
return true -- ./lib/lua-parser/validator.lua:198
end -- ./lib/lua-parser/validator.lua:198
local function traverse_forin(env, stm) -- ./lib/lua-parser/validator.lua:201
begin_loop(env) -- ./lib/lua-parser/validator.lua:202
new_scope(env) -- ./lib/lua-parser/validator.lua:203
local status, msg = traverse_explist(env, stm[2]) -- ./lib/lua-parser/validator.lua:204
if not status then -- ./lib/lua-parser/validator.lua:205
return status, msg -- ./lib/lua-parser/validator.lua:205
end -- ./lib/lua-parser/validator.lua:205
status, msg = traverse_block(env, stm[3]) -- ./lib/lua-parser/validator.lua:206
if not status then -- ./lib/lua-parser/validator.lua:207
return status, msg -- ./lib/lua-parser/validator.lua:207
end -- ./lib/lua-parser/validator.lua:207
end_scope(env) -- ./lib/lua-parser/validator.lua:208
end_loop(env) -- ./lib/lua-parser/validator.lua:209
return true -- ./lib/lua-parser/validator.lua:210
end -- ./lib/lua-parser/validator.lua:210
local function traverse_fornum(env, stm) -- ./lib/lua-parser/validator.lua:213
local status, msg -- ./lib/lua-parser/validator.lua:214
begin_loop(env) -- ./lib/lua-parser/validator.lua:215
new_scope(env) -- ./lib/lua-parser/validator.lua:216
status, msg = traverse_exp(env, stm[2]) -- ./lib/lua-parser/validator.lua:217
if not status then -- ./lib/lua-parser/validator.lua:218
return status, msg -- ./lib/lua-parser/validator.lua:218
end -- ./lib/lua-parser/validator.lua:218
status, msg = traverse_exp(env, stm[3]) -- ./lib/lua-parser/validator.lua:219
if not status then -- ./lib/lua-parser/validator.lua:220
return status, msg -- ./lib/lua-parser/validator.lua:220
end -- ./lib/lua-parser/validator.lua:220
if stm[5] then -- ./lib/lua-parser/validator.lua:221
status, msg = traverse_exp(env, stm[4]) -- ./lib/lua-parser/validator.lua:222
if not status then -- ./lib/lua-parser/validator.lua:223
return status, msg -- ./lib/lua-parser/validator.lua:223
end -- ./lib/lua-parser/validator.lua:223
status, msg = traverse_block(env, stm[5]) -- ./lib/lua-parser/validator.lua:224
if not status then -- ./lib/lua-parser/validator.lua:225
return status, msg -- ./lib/lua-parser/validator.lua:225
end -- ./lib/lua-parser/validator.lua:225
else -- ./lib/lua-parser/validator.lua:225
status, msg = traverse_block(env, stm[4]) -- ./lib/lua-parser/validator.lua:227
if not status then -- ./lib/lua-parser/validator.lua:228
return status, msg -- ./lib/lua-parser/validator.lua:228
end -- ./lib/lua-parser/validator.lua:228
end -- ./lib/lua-parser/validator.lua:228
end_scope(env) -- ./lib/lua-parser/validator.lua:230
end_loop(env) -- ./lib/lua-parser/validator.lua:231
return true -- ./lib/lua-parser/validator.lua:232
end -- ./lib/lua-parser/validator.lua:232
local function traverse_goto(env, stm) -- ./lib/lua-parser/validator.lua:235
local status, msg = set_pending_goto(env, stm) -- ./lib/lua-parser/validator.lua:236
if not status then -- ./lib/lua-parser/validator.lua:237
return status, msg -- ./lib/lua-parser/validator.lua:237
end -- ./lib/lua-parser/validator.lua:237
return true -- ./lib/lua-parser/validator.lua:238
end -- ./lib/lua-parser/validator.lua:238
local function traverse_if(env, stm) -- ./lib/lua-parser/validator.lua:241
local len = # stm -- ./lib/lua-parser/validator.lua:242
if len % 2 == 0 then -- ./lib/lua-parser/validator.lua:243
for i = 1, len, 2 do -- ./lib/lua-parser/validator.lua:244
local status, msg = traverse_exp(env, stm[i]) -- ./lib/lua-parser/validator.lua:245
if not status then -- ./lib/lua-parser/validator.lua:246
return status, msg -- ./lib/lua-parser/validator.lua:246
end -- ./lib/lua-parser/validator.lua:246
status, msg = traverse_block(env, stm[i + 1]) -- ./lib/lua-parser/validator.lua:247
if not status then -- ./lib/lua-parser/validator.lua:248
return status, msg -- ./lib/lua-parser/validator.lua:248
end -- ./lib/lua-parser/validator.lua:248
end -- ./lib/lua-parser/validator.lua:248
else -- ./lib/lua-parser/validator.lua:248
for i = 1, len - 1, 2 do -- ./lib/lua-parser/validator.lua:251
local status, msg = traverse_exp(env, stm[i]) -- ./lib/lua-parser/validator.lua:252
if not status then -- ./lib/lua-parser/validator.lua:253
return status, msg -- ./lib/lua-parser/validator.lua:253
end -- ./lib/lua-parser/validator.lua:253
status, msg = traverse_block(env, stm[i + 1]) -- ./lib/lua-parser/validator.lua:254
if not status then -- ./lib/lua-parser/validator.lua:255
return status, msg -- ./lib/lua-parser/validator.lua:255
end -- ./lib/lua-parser/validator.lua:255
end -- ./lib/lua-parser/validator.lua:255
local status, msg = traverse_block(env, stm[len]) -- ./lib/lua-parser/validator.lua:257
if not status then -- ./lib/lua-parser/validator.lua:258
return status, msg -- ./lib/lua-parser/validator.lua:258
end -- ./lib/lua-parser/validator.lua:258
end -- ./lib/lua-parser/validator.lua:258
return true -- ./lib/lua-parser/validator.lua:260
end -- ./lib/lua-parser/validator.lua:260
local function traverse_label(env, stm) -- ./lib/lua-parser/validator.lua:263
local status, msg = set_label(env, stm[1], stm["pos"]) -- ./lib/lua-parser/validator.lua:264
if not status then -- ./lib/lua-parser/validator.lua:265
return status, msg -- ./lib/lua-parser/validator.lua:265
end -- ./lib/lua-parser/validator.lua:265
return true -- ./lib/lua-parser/validator.lua:266
end -- ./lib/lua-parser/validator.lua:266
local function traverse_let(env, stm) -- ./lib/lua-parser/validator.lua:269
local status, msg = traverse_explist(env, stm[2]) -- ./lib/lua-parser/validator.lua:270
if not status then -- ./lib/lua-parser/validator.lua:271
return status, msg -- ./lib/lua-parser/validator.lua:271
end -- ./lib/lua-parser/validator.lua:271
return true -- ./lib/lua-parser/validator.lua:272
end -- ./lib/lua-parser/validator.lua:272
local function traverse_letrec(env, stm) -- ./lib/lua-parser/validator.lua:275
local status, msg = traverse_exp(env, stm[2][1]) -- ./lib/lua-parser/validator.lua:276
if not status then -- ./lib/lua-parser/validator.lua:277
return status, msg -- ./lib/lua-parser/validator.lua:277
end -- ./lib/lua-parser/validator.lua:277
return true -- ./lib/lua-parser/validator.lua:278
end -- ./lib/lua-parser/validator.lua:278
local function traverse_repeat(env, stm) -- ./lib/lua-parser/validator.lua:281
begin_loop(env) -- ./lib/lua-parser/validator.lua:282
local status, msg = traverse_block(env, stm[1]) -- ./lib/lua-parser/validator.lua:283
if not status then -- ./lib/lua-parser/validator.lua:284
return status, msg -- ./lib/lua-parser/validator.lua:284
end -- ./lib/lua-parser/validator.lua:284
status, msg = traverse_exp(env, stm[2]) -- ./lib/lua-parser/validator.lua:285
if not status then -- ./lib/lua-parser/validator.lua:286
return status, msg -- ./lib/lua-parser/validator.lua:286
end -- ./lib/lua-parser/validator.lua:286
end_loop(env) -- ./lib/lua-parser/validator.lua:287
return true -- ./lib/lua-parser/validator.lua:288
end -- ./lib/lua-parser/validator.lua:288
local function traverse_return(env, stm) -- ./lib/lua-parser/validator.lua:291
local status, msg = traverse_explist(env, stm) -- ./lib/lua-parser/validator.lua:292
if not status then -- ./lib/lua-parser/validator.lua:293
return status, msg -- ./lib/lua-parser/validator.lua:293
end -- ./lib/lua-parser/validator.lua:293
return true -- ./lib/lua-parser/validator.lua:294
end -- ./lib/lua-parser/validator.lua:294
local function traverse_while(env, stm) -- ./lib/lua-parser/validator.lua:297
begin_loop(env) -- ./lib/lua-parser/validator.lua:298
local status, msg = traverse_exp(env, stm[1]) -- ./lib/lua-parser/validator.lua:299
if not status then -- ./lib/lua-parser/validator.lua:300
return status, msg -- ./lib/lua-parser/validator.lua:300
end -- ./lib/lua-parser/validator.lua:300
status, msg = traverse_block(env, stm[2]) -- ./lib/lua-parser/validator.lua:301
if not status then -- ./lib/lua-parser/validator.lua:302
return status, msg -- ./lib/lua-parser/validator.lua:302
end -- ./lib/lua-parser/validator.lua:302
end_loop(env) -- ./lib/lua-parser/validator.lua:303
return true -- ./lib/lua-parser/validator.lua:304
end -- ./lib/lua-parser/validator.lua:304
traverse_var = function(env, var) -- ./lib/lua-parser/validator.lua:307
local tag = var["tag"] -- ./lib/lua-parser/validator.lua:308
if tag == "Id" then -- `Id{ <string> } -- ./lib/lua-parser/validator.lua:309
return true -- ./lib/lua-parser/validator.lua:310
elseif tag == "Index" then -- `Index{ expr expr } -- ./lib/lua-parser/validator.lua:311
local status, msg = traverse_exp(env, var[1]) -- ./lib/lua-parser/validator.lua:312
if not status then -- ./lib/lua-parser/validator.lua:313
return status, msg -- ./lib/lua-parser/validator.lua:313
end -- ./lib/lua-parser/validator.lua:313
status, msg = traverse_exp(env, var[2]) -- ./lib/lua-parser/validator.lua:314
if not status then -- ./lib/lua-parser/validator.lua:315
return status, msg -- ./lib/lua-parser/validator.lua:315
end -- ./lib/lua-parser/validator.lua:315
return true -- ./lib/lua-parser/validator.lua:316
else -- ./lib/lua-parser/validator.lua:316
error("expecting a variable, but got a " .. tag) -- ./lib/lua-parser/validator.lua:318
end -- ./lib/lua-parser/validator.lua:318
end -- ./lib/lua-parser/validator.lua:318
traverse_varlist = function(env, varlist) -- ./lib/lua-parser/validator.lua:322
for k, v in ipairs(varlist) do -- ./lib/lua-parser/validator.lua:323
local status, msg = traverse_var(env, v) -- ./lib/lua-parser/validator.lua:324
if not status then -- ./lib/lua-parser/validator.lua:325
return status, msg -- ./lib/lua-parser/validator.lua:325
end -- ./lib/lua-parser/validator.lua:325
end -- ./lib/lua-parser/validator.lua:325
return true -- ./lib/lua-parser/validator.lua:327
end -- ./lib/lua-parser/validator.lua:327
traverse_exp = function(env, exp) -- ./lib/lua-parser/validator.lua:330
local tag = exp["tag"] -- ./lib/lua-parser/validator.lua:331
if tag == "Nil" or tag == "Boolean" or tag == "Number" or tag == "String" then -- `String{ <string> } -- ./lib/lua-parser/validator.lua:335
return true -- ./lib/lua-parser/validator.lua:336
elseif tag == "Dots" then -- ./lib/lua-parser/validator.lua:337
return traverse_vararg(env, exp) -- ./lib/lua-parser/validator.lua:338
elseif tag == "Function" then -- `Function{ { `Id{ <string> }* `Dots? } block } -- ./lib/lua-parser/validator.lua:339
return traverse_function(env, exp) -- ./lib/lua-parser/validator.lua:340
elseif tag == "Table" then -- `Table{ ( `Pair{ expr expr } | expr )* } -- ./lib/lua-parser/validator.lua:341
return traverse_table(env, exp) -- ./lib/lua-parser/validator.lua:342
elseif tag == "Op" then -- `Op{ opid expr expr? } -- ./lib/lua-parser/validator.lua:343
return traverse_op(env, exp) -- ./lib/lua-parser/validator.lua:344
elseif tag == "Paren" then -- `Paren{ expr } -- ./lib/lua-parser/validator.lua:345
return traverse_paren(env, exp) -- ./lib/lua-parser/validator.lua:346
elseif tag == "Call" then -- `Call{ expr expr* } -- ./lib/lua-parser/validator.lua:347
return traverse_call(env, exp) -- ./lib/lua-parser/validator.lua:348
elseif tag == "Invoke" then -- `Invoke{ expr `String{ <string> } expr* } -- ./lib/lua-parser/validator.lua:349
return traverse_invoke(env, exp) -- ./lib/lua-parser/validator.lua:350
elseif tag == "Id" or tag == "Index" then -- `Index{ expr expr } -- ./lib/lua-parser/validator.lua:352
return traverse_var(env, exp) -- ./lib/lua-parser/validator.lua:353
elseif tag == "TableCompr" then -- `TableCompr{ block } -- ./lib/lua-parser/validator.lua:354
return traverse_tablecompr(env, exp) -- ./lib/lua-parser/validator.lua:355
elseif tag:match("Expr$") then -- `StatExpr{ ... } -- ./lib/lua-parser/validator.lua:356
return traverse_statexpr(env, exp) -- ./lib/lua-parser/validator.lua:357
else -- ./lib/lua-parser/validator.lua:357
error("expecting an expression, but got a " .. tag) -- ./lib/lua-parser/validator.lua:359
end -- ./lib/lua-parser/validator.lua:359
end -- ./lib/lua-parser/validator.lua:359
traverse_explist = function(env, explist) -- ./lib/lua-parser/validator.lua:363
for k, v in ipairs(explist) do -- ./lib/lua-parser/validator.lua:364
local status, msg = traverse_exp(env, v) -- ./lib/lua-parser/validator.lua:365
if not status then -- ./lib/lua-parser/validator.lua:366
return status, msg -- ./lib/lua-parser/validator.lua:366
end -- ./lib/lua-parser/validator.lua:366
end -- ./lib/lua-parser/validator.lua:366
return true -- ./lib/lua-parser/validator.lua:368
end -- ./lib/lua-parser/validator.lua:368
traverse_stm = function(env, stm) -- ./lib/lua-parser/validator.lua:371
local tag = stm["tag"] -- ./lib/lua-parser/validator.lua:372
if tag == "Do" then -- `Do{ stat* } -- ./lib/lua-parser/validator.lua:373
return traverse_block(env, stm) -- ./lib/lua-parser/validator.lua:374
elseif tag == "Set" then -- `Set{ {lhs+} (opid? = opid?)? {expr+} } -- ./lib/lua-parser/validator.lua:375
return traverse_assignment(env, stm) -- ./lib/lua-parser/validator.lua:376
elseif tag == "While" then -- `While{ expr block } -- ./lib/lua-parser/validator.lua:377
return traverse_while(env, stm) -- ./lib/lua-parser/validator.lua:378
elseif tag == "Repeat" then -- `Repeat{ block expr } -- ./lib/lua-parser/validator.lua:379
return traverse_repeat(env, stm) -- ./lib/lua-parser/validator.lua:380
elseif tag == "If" then -- `If{ (expr block)+ block? } -- ./lib/lua-parser/validator.lua:381
return traverse_if(env, stm) -- ./lib/lua-parser/validator.lua:382
elseif tag == "Fornum" then -- `Fornum{ ident expr expr expr? block } -- ./lib/lua-parser/validator.lua:383
return traverse_fornum(env, stm) -- ./lib/lua-parser/validator.lua:384
elseif tag == "Forin" then -- `Forin{ {ident+} {expr+} block } -- ./lib/lua-parser/validator.lua:385
return traverse_forin(env, stm) -- ./lib/lua-parser/validator.lua:386
elseif tag == "Local" or tag == "Let" then -- `Let{ {ident+} {expr+}? } -- ./lib/lua-parser/validator.lua:388
return traverse_let(env, stm) -- ./lib/lua-parser/validator.lua:389
elseif tag == "Localrec" then -- `Localrec{ ident expr } -- ./lib/lua-parser/validator.lua:390
return traverse_letrec(env, stm) -- ./lib/lua-parser/validator.lua:391
elseif tag == "Goto" then -- `Goto{ <string> } -- ./lib/lua-parser/validator.lua:392
return traverse_goto(env, stm) -- ./lib/lua-parser/validator.lua:393
elseif tag == "Label" then -- `Label{ <string> } -- ./lib/lua-parser/validator.lua:394
return traverse_label(env, stm) -- ./lib/lua-parser/validator.lua:395
elseif tag == "Return" then -- `Return{ <expr>* } -- ./lib/lua-parser/validator.lua:396
return traverse_return(env, stm) -- ./lib/lua-parser/validator.lua:397
elseif tag == "Break" then -- ./lib/lua-parser/validator.lua:398
return traverse_break(env, stm) -- ./lib/lua-parser/validator.lua:399
elseif tag == "Call" then -- `Call{ expr expr* } -- ./lib/lua-parser/validator.lua:400
return traverse_call(env, stm) -- ./lib/lua-parser/validator.lua:401
elseif tag == "Invoke" then -- `Invoke{ expr `String{ <string> } expr* } -- ./lib/lua-parser/validator.lua:402
return traverse_invoke(env, stm) -- ./lib/lua-parser/validator.lua:403
elseif tag == "Continue" then -- ./lib/lua-parser/validator.lua:404
return traverse_continue(env, stm) -- ./lib/lua-parser/validator.lua:405
elseif tag == "Push" then -- `Push{ <expr>* } -- ./lib/lua-parser/validator.lua:406
return traverse_push(env, stm) -- ./lib/lua-parser/validator.lua:407
else -- ./lib/lua-parser/validator.lua:407
error("expecting a statement, but got a " .. tag) -- ./lib/lua-parser/validator.lua:409
end -- ./lib/lua-parser/validator.lua:409
end -- ./lib/lua-parser/validator.lua:409
traverse_block = function(env, block) -- ./lib/lua-parser/validator.lua:413
local l = {} -- ./lib/lua-parser/validator.lua:414
new_scope(env) -- ./lib/lua-parser/validator.lua:415
for k, v in ipairs(block) do -- ./lib/lua-parser/validator.lua:416
local status, msg = traverse_stm(env, v) -- ./lib/lua-parser/validator.lua:417
if not status then -- ./lib/lua-parser/validator.lua:418
return status, msg -- ./lib/lua-parser/validator.lua:418
end -- ./lib/lua-parser/validator.lua:418
end -- ./lib/lua-parser/validator.lua:418
end_scope(env) -- ./lib/lua-parser/validator.lua:420
return true -- ./lib/lua-parser/validator.lua:421
end -- ./lib/lua-parser/validator.lua:421
local function traverse(ast, errorinfo) -- ./lib/lua-parser/validator.lua:425
assert(type(ast) == "table") -- ./lib/lua-parser/validator.lua:426
assert(type(errorinfo) == "table") -- ./lib/lua-parser/validator.lua:427
local env = { -- ./lib/lua-parser/validator.lua:428
["errorinfo"] = errorinfo, -- ./lib/lua-parser/validator.lua:428
["function"] = {} -- ./lib/lua-parser/validator.lua:428
} -- ./lib/lua-parser/validator.lua:428
new_function(env) -- ./lib/lua-parser/validator.lua:429
set_vararg(env, true) -- ./lib/lua-parser/validator.lua:430
local status, msg = traverse_block(env, ast) -- ./lib/lua-parser/validator.lua:431
if not status then -- ./lib/lua-parser/validator.lua:432
return status, msg -- ./lib/lua-parser/validator.lua:432
end -- ./lib/lua-parser/validator.lua:432
end_function(env) -- ./lib/lua-parser/validator.lua:433
status, msg = verify_pending_gotos(env) -- ./lib/lua-parser/validator.lua:434
if not status then -- ./lib/lua-parser/validator.lua:435
return status, msg -- ./lib/lua-parser/validator.lua:435
end -- ./lib/lua-parser/validator.lua:435
return ast -- ./lib/lua-parser/validator.lua:436
end -- ./lib/lua-parser/validator.lua:436
return { -- ./lib/lua-parser/validator.lua:439
["validate"] = traverse, -- ./lib/lua-parser/validator.lua:439
["syntaxerror"] = syntaxerror -- ./lib/lua-parser/validator.lua:439
} -- ./lib/lua-parser/validator.lua:439
end -- ./lib/lua-parser/validator.lua:439
local validator = _() or validator -- ./lib/lua-parser/validator.lua:443
package["loaded"]["lib.lua-parser.validator"] = validator or true -- ./lib/lua-parser/validator.lua:444
local function _() -- ./lib/lua-parser/validator.lua:447
local pp = {} -- ./lib/lua-parser/pp.lua:4
local block2str, stm2str, exp2str, var2str -- ./lib/lua-parser/pp.lua:6
local explist2str, varlist2str, parlist2str, fieldlist2str -- ./lib/lua-parser/pp.lua:7
local function iscntrl(x) -- ./lib/lua-parser/pp.lua:9
if (x >= 0 and x <= 31) or (x == 127) then -- ./lib/lua-parser/pp.lua:10
return true -- ./lib/lua-parser/pp.lua:10
end -- ./lib/lua-parser/pp.lua:10
return false -- ./lib/lua-parser/pp.lua:11
end -- ./lib/lua-parser/pp.lua:11
local function isprint(x) -- ./lib/lua-parser/pp.lua:14
return not iscntrl(x) -- ./lib/lua-parser/pp.lua:15
end -- ./lib/lua-parser/pp.lua:15
local function fixed_string(str) -- ./lib/lua-parser/pp.lua:18
local new_str = "" -- ./lib/lua-parser/pp.lua:19
for i = 1, string["len"](str) do -- ./lib/lua-parser/pp.lua:20
char = string["byte"](str, i) -- ./lib/lua-parser/pp.lua:21
if char == 34 then -- ./lib/lua-parser/pp.lua:22
new_str = new_str .. string["format"]("\\\"") -- ./lib/lua-parser/pp.lua:22
elseif char == 92 then -- ./lib/lua-parser/pp.lua:23
new_str = new_str .. string["format"]("\\\\") -- ./lib/lua-parser/pp.lua:23
elseif char == 7 then -- ./lib/lua-parser/pp.lua:24
new_str = new_str .. string["format"]("\\a") -- ./lib/lua-parser/pp.lua:24
elseif char == 8 then -- ./lib/lua-parser/pp.lua:25
new_str = new_str .. string["format"]("\\b") -- ./lib/lua-parser/pp.lua:25
elseif char == 12 then -- ./lib/lua-parser/pp.lua:26
new_str = new_str .. string["format"]("\\f") -- ./lib/lua-parser/pp.lua:26
elseif char == 10 then -- ./lib/lua-parser/pp.lua:27
new_str = new_str .. string["format"]("\\n") -- ./lib/lua-parser/pp.lua:27
elseif char == 13 then -- ./lib/lua-parser/pp.lua:28
new_str = new_str .. string["format"]("\\r") -- ./lib/lua-parser/pp.lua:28
elseif char == 9 then -- ./lib/lua-parser/pp.lua:29
new_str = new_str .. string["format"]("\\t") -- ./lib/lua-parser/pp.lua:29
elseif char == 11 then -- ./lib/lua-parser/pp.lua:30
new_str = new_str .. string["format"]("\\v") -- ./lib/lua-parser/pp.lua:30
else -- ./lib/lua-parser/pp.lua:30
if isprint(char) then -- ./lib/lua-parser/pp.lua:32
new_str = new_str .. string["format"]("%c", char) -- ./lib/lua-parser/pp.lua:33
else -- ./lib/lua-parser/pp.lua:33
new_str = new_str .. string["format"]("\\%03d", char) -- ./lib/lua-parser/pp.lua:35
end -- ./lib/lua-parser/pp.lua:35
end -- ./lib/lua-parser/pp.lua:35
end -- ./lib/lua-parser/pp.lua:35
return new_str -- ./lib/lua-parser/pp.lua:39
end -- ./lib/lua-parser/pp.lua:39
local function name2str(name) -- ./lib/lua-parser/pp.lua:42
return string["format"]("\"%s\"", name) -- ./lib/lua-parser/pp.lua:43
end -- ./lib/lua-parser/pp.lua:43
local function boolean2str(b) -- ./lib/lua-parser/pp.lua:46
return string["format"]("\"%s\"", tostring(b)) -- ./lib/lua-parser/pp.lua:47
end -- ./lib/lua-parser/pp.lua:47
local function number2str(n) -- ./lib/lua-parser/pp.lua:50
return string["format"]("\"%s\"", tostring(n)) -- ./lib/lua-parser/pp.lua:51
end -- ./lib/lua-parser/pp.lua:51
local function string2str(s) -- ./lib/lua-parser/pp.lua:54
return string["format"]("\"%s\"", fixed_string(s)) -- ./lib/lua-parser/pp.lua:55
end -- ./lib/lua-parser/pp.lua:55
var2str = function(var) -- ./lib/lua-parser/pp.lua:58
local tag = var["tag"] -- ./lib/lua-parser/pp.lua:59
local str = "`" .. tag -- ./lib/lua-parser/pp.lua:60
if tag == "Id" then -- `Id{ <string> } -- ./lib/lua-parser/pp.lua:61
str = str .. " " .. name2str(var[1]) -- ./lib/lua-parser/pp.lua:62
elseif tag == "Index" then -- `Index{ expr expr } -- ./lib/lua-parser/pp.lua:63
str = str .. "{ " -- ./lib/lua-parser/pp.lua:64
str = str .. exp2str(var[1]) .. ", " -- ./lib/lua-parser/pp.lua:65
str = str .. exp2str(var[2]) -- ./lib/lua-parser/pp.lua:66
str = str .. " }" -- ./lib/lua-parser/pp.lua:67
else -- ./lib/lua-parser/pp.lua:67
error("expecting a variable, but got a " .. tag) -- ./lib/lua-parser/pp.lua:69
end -- ./lib/lua-parser/pp.lua:69
return str -- ./lib/lua-parser/pp.lua:71
end -- ./lib/lua-parser/pp.lua:71
varlist2str = function(varlist) -- ./lib/lua-parser/pp.lua:74
local l = {} -- ./lib/lua-parser/pp.lua:75
for k, v in ipairs(varlist) do -- ./lib/lua-parser/pp.lua:76
l[k] = var2str(v) -- ./lib/lua-parser/pp.lua:77
end -- ./lib/lua-parser/pp.lua:77
return "{ " .. table["concat"](l, ", ") .. " }" -- ./lib/lua-parser/pp.lua:79
end -- ./lib/lua-parser/pp.lua:79
parlist2str = function(parlist) -- ./lib/lua-parser/pp.lua:82
local l = {} -- ./lib/lua-parser/pp.lua:83
local len = # parlist -- ./lib/lua-parser/pp.lua:84
local is_vararg = false -- ./lib/lua-parser/pp.lua:85
if len > 0 and parlist[len]["tag"] == "Dots" then -- ./lib/lua-parser/pp.lua:86
is_vararg = true -- ./lib/lua-parser/pp.lua:87
len = len - 1 -- ./lib/lua-parser/pp.lua:88
end -- ./lib/lua-parser/pp.lua:88
local i = 1 -- ./lib/lua-parser/pp.lua:90
while i <= len do -- ./lib/lua-parser/pp.lua:91
l[i] = var2str(parlist[i]) -- ./lib/lua-parser/pp.lua:92
i = i + 1 -- ./lib/lua-parser/pp.lua:93
end -- ./lib/lua-parser/pp.lua:93
if is_vararg then -- ./lib/lua-parser/pp.lua:95
l[i] = "`" .. parlist[i]["tag"] -- ./lib/lua-parser/pp.lua:96
end -- ./lib/lua-parser/pp.lua:96
return "{ " .. table["concat"](l, ", ") .. " }" -- ./lib/lua-parser/pp.lua:98
end -- ./lib/lua-parser/pp.lua:98
fieldlist2str = function(fieldlist) -- ./lib/lua-parser/pp.lua:101
local l = {} -- ./lib/lua-parser/pp.lua:102
for k, v in ipairs(fieldlist) do -- ./lib/lua-parser/pp.lua:103
local tag = v["tag"] -- ./lib/lua-parser/pp.lua:104
if tag == "Pair" then -- `Pair{ expr expr } -- ./lib/lua-parser/pp.lua:105
l[k] = "`" .. tag .. "{ " -- ./lib/lua-parser/pp.lua:106
l[k] = l[k] .. exp2str(v[1]) .. ", " .. exp2str(v[2]) -- ./lib/lua-parser/pp.lua:107
l[k] = l[k] .. " }" -- ./lib/lua-parser/pp.lua:108
else -- ./lib/lua-parser/pp.lua:108
l[k] = exp2str(v) -- ./lib/lua-parser/pp.lua:110
end -- ./lib/lua-parser/pp.lua:110
end -- ./lib/lua-parser/pp.lua:110
if # l > 0 then -- ./lib/lua-parser/pp.lua:113
return "{ " .. table["concat"](l, ", ") .. " }" -- ./lib/lua-parser/pp.lua:114
else -- ./lib/lua-parser/pp.lua:114
return "" -- ./lib/lua-parser/pp.lua:116
end -- ./lib/lua-parser/pp.lua:116
end -- ./lib/lua-parser/pp.lua:116
exp2str = function(exp) -- ./lib/lua-parser/pp.lua:120
local tag = exp["tag"] -- ./lib/lua-parser/pp.lua:121
local str = "`" .. tag -- ./lib/lua-parser/pp.lua:122
if tag == "Nil" or tag == "Dots" then -- ./lib/lua-parser/pp.lua:124
-- `Boolean{ <boolean> } -- ./lib/lua-parser/pp.lua:125
elseif tag == "Boolean" then -- `Boolean{ <boolean> } -- ./lib/lua-parser/pp.lua:125
str = str .. " " .. boolean2str(exp[1]) -- ./lib/lua-parser/pp.lua:126
elseif tag == "Number" then -- `Number{ <number> } -- ./lib/lua-parser/pp.lua:127
str = str .. " " .. number2str(exp[1]) -- ./lib/lua-parser/pp.lua:128
elseif tag == "String" then -- `String{ <string> } -- ./lib/lua-parser/pp.lua:129
str = str .. " " .. string2str(exp[1]) -- ./lib/lua-parser/pp.lua:130
elseif tag == "Function" then -- `Function{ { `Id{ <string> }* `Dots? } block } -- ./lib/lua-parser/pp.lua:131
str = str .. "{ " -- ./lib/lua-parser/pp.lua:132
str = str .. parlist2str(exp[1]) .. ", " -- ./lib/lua-parser/pp.lua:133
str = str .. block2str(exp[2]) -- ./lib/lua-parser/pp.lua:134
str = str .. " }" -- ./lib/lua-parser/pp.lua:135
elseif tag == "Table" then -- `Table{ ( `Pair{ expr expr } | expr )* } -- ./lib/lua-parser/pp.lua:136
str = str .. fieldlist2str(exp) -- ./lib/lua-parser/pp.lua:137
elseif tag == "Op" then -- `Op{ opid expr expr? } -- ./lib/lua-parser/pp.lua:138
str = str .. "{ " -- ./lib/lua-parser/pp.lua:139
str = str .. name2str(exp[1]) .. ", " -- ./lib/lua-parser/pp.lua:140
str = str .. exp2str(exp[2]) -- ./lib/lua-parser/pp.lua:141
if exp[3] then -- ./lib/lua-parser/pp.lua:142
str = str .. ", " .. exp2str(exp[3]) -- ./lib/lua-parser/pp.lua:143
end -- ./lib/lua-parser/pp.lua:143
str = str .. " }" -- ./lib/lua-parser/pp.lua:145
elseif tag == "Paren" then -- `Paren{ expr } -- ./lib/lua-parser/pp.lua:146
str = str .. "{ " .. exp2str(exp[1]) .. " }" -- ./lib/lua-parser/pp.lua:147
elseif tag == "Call" then -- `Call{ expr expr* } -- ./lib/lua-parser/pp.lua:148
str = str .. "{ " -- ./lib/lua-parser/pp.lua:149
str = str .. exp2str(exp[1]) -- ./lib/lua-parser/pp.lua:150
if exp[2] then -- ./lib/lua-parser/pp.lua:151
for i = 2, # exp do -- ./lib/lua-parser/pp.lua:152
str = str .. ", " .. exp2str(exp[i]) -- ./lib/lua-parser/pp.lua:153
end -- ./lib/lua-parser/pp.lua:153
end -- ./lib/lua-parser/pp.lua:153
str = str .. " }" -- ./lib/lua-parser/pp.lua:156
elseif tag == "Invoke" then -- `Invoke{ expr `String{ <string> } expr* } -- ./lib/lua-parser/pp.lua:157
str = str .. "{ " -- ./lib/lua-parser/pp.lua:158
str = str .. exp2str(exp[1]) .. ", " -- ./lib/lua-parser/pp.lua:159
str = str .. exp2str(exp[2]) -- ./lib/lua-parser/pp.lua:160
if exp[3] then -- ./lib/lua-parser/pp.lua:161
for i = 3, # exp do -- ./lib/lua-parser/pp.lua:162
str = str .. ", " .. exp2str(exp[i]) -- ./lib/lua-parser/pp.lua:163
end -- ./lib/lua-parser/pp.lua:163
end -- ./lib/lua-parser/pp.lua:163
str = str .. " }" -- ./lib/lua-parser/pp.lua:166
elseif tag == "Id" or tag == "Index" then -- `Index{ expr expr } -- ./lib/lua-parser/pp.lua:168
str = var2str(exp) -- ./lib/lua-parser/pp.lua:169
else -- ./lib/lua-parser/pp.lua:169
error("expecting an expression, but got a " .. tag) -- ./lib/lua-parser/pp.lua:171
end -- ./lib/lua-parser/pp.lua:171
return str -- ./lib/lua-parser/pp.lua:173
end -- ./lib/lua-parser/pp.lua:173
explist2str = function(explist) -- ./lib/lua-parser/pp.lua:176
local l = {} -- ./lib/lua-parser/pp.lua:177
for k, v in ipairs(explist) do -- ./lib/lua-parser/pp.lua:178
l[k] = exp2str(v) -- ./lib/lua-parser/pp.lua:179
end -- ./lib/lua-parser/pp.lua:179
if # l > 0 then -- ./lib/lua-parser/pp.lua:181
return "{ " .. table["concat"](l, ", ") .. " }" -- ./lib/lua-parser/pp.lua:182
else -- ./lib/lua-parser/pp.lua:182
return "" -- ./lib/lua-parser/pp.lua:184
end -- ./lib/lua-parser/pp.lua:184
end -- ./lib/lua-parser/pp.lua:184
stm2str = function(stm) -- ./lib/lua-parser/pp.lua:188
local tag = stm["tag"] -- ./lib/lua-parser/pp.lua:189
local str = "`" .. tag -- ./lib/lua-parser/pp.lua:190
if tag == "Do" then -- `Do{ stat* } -- ./lib/lua-parser/pp.lua:191
local l = {} -- ./lib/lua-parser/pp.lua:192
for k, v in ipairs(stm) do -- ./lib/lua-parser/pp.lua:193
l[k] = stm2str(v) -- ./lib/lua-parser/pp.lua:194
end -- ./lib/lua-parser/pp.lua:194
str = str .. "{ " .. table["concat"](l, ", ") .. " }" -- ./lib/lua-parser/pp.lua:196
elseif tag == "Set" then -- `Set{ {lhs+} {expr+} } -- ./lib/lua-parser/pp.lua:197
str = str .. "{ " -- ./lib/lua-parser/pp.lua:198
str = str .. varlist2str(stm[1]) .. ", " -- ./lib/lua-parser/pp.lua:199
str = str .. explist2str(stm[2]) -- ./lib/lua-parser/pp.lua:200
str = str .. " }" -- ./lib/lua-parser/pp.lua:201
elseif tag == "While" then -- `While{ expr block } -- ./lib/lua-parser/pp.lua:202
str = str .. "{ " -- ./lib/lua-parser/pp.lua:203
str = str .. exp2str(stm[1]) .. ", " -- ./lib/lua-parser/pp.lua:204
str = str .. block2str(stm[2]) -- ./lib/lua-parser/pp.lua:205
str = str .. " }" -- ./lib/lua-parser/pp.lua:206
elseif tag == "Repeat" then -- `Repeat{ block expr } -- ./lib/lua-parser/pp.lua:207
str = str .. "{ " -- ./lib/lua-parser/pp.lua:208
str = str .. block2str(stm[1]) .. ", " -- ./lib/lua-parser/pp.lua:209
str = str .. exp2str(stm[2]) -- ./lib/lua-parser/pp.lua:210
str = str .. " }" -- ./lib/lua-parser/pp.lua:211
elseif tag == "If" then -- `If{ (expr block)+ block? } -- ./lib/lua-parser/pp.lua:212
str = str .. "{ " -- ./lib/lua-parser/pp.lua:213
local len = # stm -- ./lib/lua-parser/pp.lua:214
if len % 2 == 0 then -- ./lib/lua-parser/pp.lua:215
local l = {} -- ./lib/lua-parser/pp.lua:216
for i = 1, len - 2, 2 do -- ./lib/lua-parser/pp.lua:217
str = str .. exp2str(stm[i]) .. ", " .. block2str(stm[i + 1]) .. ", " -- ./lib/lua-parser/pp.lua:218
end -- ./lib/lua-parser/pp.lua:218
str = str .. exp2str(stm[len - 1]) .. ", " .. block2str(stm[len]) -- ./lib/lua-parser/pp.lua:220
else -- ./lib/lua-parser/pp.lua:220
local l = {} -- ./lib/lua-parser/pp.lua:222
for i = 1, len - 3, 2 do -- ./lib/lua-parser/pp.lua:223
str = str .. exp2str(stm[i]) .. ", " .. block2str(stm[i + 1]) .. ", " -- ./lib/lua-parser/pp.lua:224
end -- ./lib/lua-parser/pp.lua:224
str = str .. exp2str(stm[len - 2]) .. ", " .. block2str(stm[len - 1]) .. ", " -- ./lib/lua-parser/pp.lua:226
str = str .. block2str(stm[len]) -- ./lib/lua-parser/pp.lua:227
end -- ./lib/lua-parser/pp.lua:227
str = str .. " }" -- ./lib/lua-parser/pp.lua:229
elseif tag == "Fornum" then -- `Fornum{ ident expr expr expr? block } -- ./lib/lua-parser/pp.lua:230
str = str .. "{ " -- ./lib/lua-parser/pp.lua:231
str = str .. var2str(stm[1]) .. ", " -- ./lib/lua-parser/pp.lua:232
str = str .. exp2str(stm[2]) .. ", " -- ./lib/lua-parser/pp.lua:233
str = str .. exp2str(stm[3]) .. ", " -- ./lib/lua-parser/pp.lua:234
if stm[5] then -- ./lib/lua-parser/pp.lua:235
str = str .. exp2str(stm[4]) .. ", " -- ./lib/lua-parser/pp.lua:236
str = str .. block2str(stm[5]) -- ./lib/lua-parser/pp.lua:237
else -- ./lib/lua-parser/pp.lua:237
str = str .. block2str(stm[4]) -- ./lib/lua-parser/pp.lua:239
end -- ./lib/lua-parser/pp.lua:239
str = str .. " }" -- ./lib/lua-parser/pp.lua:241
elseif tag == "Forin" then -- `Forin{ {ident+} {expr+} block } -- ./lib/lua-parser/pp.lua:242
str = str .. "{ " -- ./lib/lua-parser/pp.lua:243
str = str .. varlist2str(stm[1]) .. ", " -- ./lib/lua-parser/pp.lua:244
str = str .. explist2str(stm[2]) .. ", " -- ./lib/lua-parser/pp.lua:245
str = str .. block2str(stm[3]) -- ./lib/lua-parser/pp.lua:246
str = str .. " }" -- ./lib/lua-parser/pp.lua:247
elseif tag == "Local" then -- `Local{ {ident+} {expr+}? } -- ./lib/lua-parser/pp.lua:248
str = str .. "{ " -- ./lib/lua-parser/pp.lua:249
str = str .. varlist2str(stm[1]) -- ./lib/lua-parser/pp.lua:250
if # stm[2] > 0 then -- ./lib/lua-parser/pp.lua:251
str = str .. ", " .. explist2str(stm[2]) -- ./lib/lua-parser/pp.lua:252
else -- ./lib/lua-parser/pp.lua:252
str = str .. ", " .. "{ }" -- ./lib/lua-parser/pp.lua:254
end -- ./lib/lua-parser/pp.lua:254
str = str .. " }" -- ./lib/lua-parser/pp.lua:256
elseif tag == "Localrec" then -- `Localrec{ ident expr } -- ./lib/lua-parser/pp.lua:257
str = str .. "{ " -- ./lib/lua-parser/pp.lua:258
str = str .. "{ " .. var2str(stm[1][1]) .. " }, " -- ./lib/lua-parser/pp.lua:259
str = str .. "{ " .. exp2str(stm[2][1]) .. " }" -- ./lib/lua-parser/pp.lua:260
str = str .. " }" -- ./lib/lua-parser/pp.lua:261
elseif tag == "Goto" or tag == "Label" then -- `Label{ <string> } -- ./lib/lua-parser/pp.lua:263
str = str .. "{ " .. name2str(stm[1]) .. " }" -- ./lib/lua-parser/pp.lua:264
elseif tag == "Return" then -- `Return{ <expr>* } -- ./lib/lua-parser/pp.lua:265
str = str .. explist2str(stm) -- ./lib/lua-parser/pp.lua:266
elseif tag == "Break" then -- ./lib/lua-parser/pp.lua:267
-- `Call{ expr expr* } -- ./lib/lua-parser/pp.lua:268
elseif tag == "Call" then -- `Call{ expr expr* } -- ./lib/lua-parser/pp.lua:268
str = str .. "{ " -- ./lib/lua-parser/pp.lua:269
str = str .. exp2str(stm[1]) -- ./lib/lua-parser/pp.lua:270
if stm[2] then -- ./lib/lua-parser/pp.lua:271
for i = 2, # stm do -- ./lib/lua-parser/pp.lua:272
str = str .. ", " .. exp2str(stm[i]) -- ./lib/lua-parser/pp.lua:273
end -- ./lib/lua-parser/pp.lua:273
end -- ./lib/lua-parser/pp.lua:273
str = str .. " }" -- ./lib/lua-parser/pp.lua:276
elseif tag == "Invoke" then -- `Invoke{ expr `String{ <string> } expr* } -- ./lib/lua-parser/pp.lua:277
str = str .. "{ " -- ./lib/lua-parser/pp.lua:278
str = str .. exp2str(stm[1]) .. ", " -- ./lib/lua-parser/pp.lua:279
str = str .. exp2str(stm[2]) -- ./lib/lua-parser/pp.lua:280
if stm[3] then -- ./lib/lua-parser/pp.lua:281
for i = 3, # stm do -- ./lib/lua-parser/pp.lua:282
str = str .. ", " .. exp2str(stm[i]) -- ./lib/lua-parser/pp.lua:283
end -- ./lib/lua-parser/pp.lua:283
end -- ./lib/lua-parser/pp.lua:283
str = str .. " }" -- ./lib/lua-parser/pp.lua:286
else -- ./lib/lua-parser/pp.lua:286
error("expecting a statement, but got a " .. tag) -- ./lib/lua-parser/pp.lua:288
end -- ./lib/lua-parser/pp.lua:288
return str -- ./lib/lua-parser/pp.lua:290
end -- ./lib/lua-parser/pp.lua:290
block2str = function(block) -- ./lib/lua-parser/pp.lua:293
local l = {} -- ./lib/lua-parser/pp.lua:294
for k, v in ipairs(block) do -- ./lib/lua-parser/pp.lua:295
l[k] = stm2str(v) -- ./lib/lua-parser/pp.lua:296
end -- ./lib/lua-parser/pp.lua:296
return "{ " .. table["concat"](l, ", ") .. " }" -- ./lib/lua-parser/pp.lua:298
end -- ./lib/lua-parser/pp.lua:298
pp["tostring"] = function(t) -- ./lib/lua-parser/pp.lua:301
assert(type(t) == "table") -- ./lib/lua-parser/pp.lua:302
return block2str(t) -- ./lib/lua-parser/pp.lua:303
end -- ./lib/lua-parser/pp.lua:303
pp["print"] = function(t) -- ./lib/lua-parser/pp.lua:306
assert(type(t) == "table") -- ./lib/lua-parser/pp.lua:307
print(pp["tostring"](t)) -- ./lib/lua-parser/pp.lua:308
end -- ./lib/lua-parser/pp.lua:308
pp["dump"] = function(t, i) -- ./lib/lua-parser/pp.lua:311
if i == nil then -- ./lib/lua-parser/pp.lua:312
i = 0 -- ./lib/lua-parser/pp.lua:312
end -- ./lib/lua-parser/pp.lua:312
io["write"](string["format"]("{\
")) -- ./lib/lua-parser/pp.lua:313
io["write"](string["format"]("%s[tag] = %s\
", string["rep"](" ", i + 2), t["tag"] or "nil")) -- ./lib/lua-parser/pp.lua:314
io["write"](string["format"]("%s[pos] = %s\
", string["rep"](" ", i + 2), t["pos"] or "nil")) -- ./lib/lua-parser/pp.lua:315
for k, v in ipairs(t) do -- ./lib/lua-parser/pp.lua:316
io["write"](string["format"]("%s[%s] = ", string["rep"](" ", i + 2), tostring(k))) -- ./lib/lua-parser/pp.lua:317
if type(v) == "table" then -- ./lib/lua-parser/pp.lua:318
pp["dump"](v, i + 2) -- ./lib/lua-parser/pp.lua:319
else -- ./lib/lua-parser/pp.lua:319
io["write"](string["format"]("%s\
", tostring(v))) -- ./lib/lua-parser/pp.lua:321
end -- ./lib/lua-parser/pp.lua:321
end -- ./lib/lua-parser/pp.lua:321
io["write"](string["format"]("%s}\
", string["rep"](" ", i))) -- ./lib/lua-parser/pp.lua:324
end -- ./lib/lua-parser/pp.lua:324
return pp -- ./lib/lua-parser/pp.lua:327
end -- ./lib/lua-parser/pp.lua:327
local pp = _() or pp -- ./lib/lua-parser/pp.lua:331
package["loaded"]["lib.lua-parser.pp"] = pp or true -- ./lib/lua-parser/pp.lua:332
local function _() -- ./lib/lua-parser/pp.lua:335
local lpeg = require("lpeglabel") -- ./lib/lua-parser/parser.lua:65
lpeg["locale"](lpeg) -- ./lib/lua-parser/parser.lua:67
local P, S, V = lpeg["P"], lpeg["S"], lpeg["V"] -- ./lib/lua-parser/parser.lua:69
local C, Carg, Cb, Cc = lpeg["C"], lpeg["Carg"], lpeg["Cb"], lpeg["Cc"] -- ./lib/lua-parser/parser.lua:70
local Cf, Cg, Cmt, Cp, Cs, Ct = lpeg["Cf"], lpeg["Cg"], lpeg["Cmt"], lpeg["Cp"], lpeg["Cs"], lpeg["Ct"] -- ./lib/lua-parser/parser.lua:71
local Rec, T = lpeg["Rec"], lpeg["T"] -- ./lib/lua-parser/parser.lua:72
local alpha, digit, alnum = lpeg["alpha"], lpeg["digit"], lpeg["alnum"] -- ./lib/lua-parser/parser.lua:74
local xdigit = lpeg["xdigit"] -- ./lib/lua-parser/parser.lua:75
local space = lpeg["space"] -- ./lib/lua-parser/parser.lua:76
local labels = { -- ./lib/lua-parser/parser.lua:81
{ -- ./lib/lua-parser/parser.lua:82
"ErrExtra", -- ./lib/lua-parser/parser.lua:82
"unexpected character(s), expected EOF" -- ./lib/lua-parser/parser.lua:82
}, -- ./lib/lua-parser/parser.lua:82
{ -- ./lib/lua-parser/parser.lua:83
"ErrInvalidStat", -- ./lib/lua-parser/parser.lua:83
"unexpected token, invalid start of statement" -- ./lib/lua-parser/parser.lua:83
}, -- ./lib/lua-parser/parser.lua:83
{ -- ./lib/lua-parser/parser.lua:85
"ErrEndIf", -- ./lib/lua-parser/parser.lua:85
"expected 'end' to close the if statement" -- ./lib/lua-parser/parser.lua:85
}, -- ./lib/lua-parser/parser.lua:85
{ -- ./lib/lua-parser/parser.lua:86
"ErrExprIf", -- ./lib/lua-parser/parser.lua:86
"expected a condition after 'if'" -- ./lib/lua-parser/parser.lua:86
}, -- ./lib/lua-parser/parser.lua:86
{ -- ./lib/lua-parser/parser.lua:87
"ErrThenIf", -- ./lib/lua-parser/parser.lua:87
"expected 'then' after the condition" -- ./lib/lua-parser/parser.lua:87
}, -- ./lib/lua-parser/parser.lua:87
{ -- ./lib/lua-parser/parser.lua:88
"ErrExprEIf", -- ./lib/lua-parser/parser.lua:88
"expected a condition after 'elseif'" -- ./lib/lua-parser/parser.lua:88
}, -- ./lib/lua-parser/parser.lua:88
{ -- ./lib/lua-parser/parser.lua:89
"ErrThenEIf", -- ./lib/lua-parser/parser.lua:89
"expected 'then' after the condition" -- ./lib/lua-parser/parser.lua:89
}, -- ./lib/lua-parser/parser.lua:89
{ -- ./lib/lua-parser/parser.lua:91
"ErrEndDo", -- ./lib/lua-parser/parser.lua:91
"expected 'end' to close the do block" -- ./lib/lua-parser/parser.lua:91
}, -- ./lib/lua-parser/parser.lua:91
{ -- ./lib/lua-parser/parser.lua:92
"ErrExprWhile", -- ./lib/lua-parser/parser.lua:92
"expected a condition after 'while'" -- ./lib/lua-parser/parser.lua:92
}, -- ./lib/lua-parser/parser.lua:92
{ -- ./lib/lua-parser/parser.lua:93
"ErrDoWhile", -- ./lib/lua-parser/parser.lua:93
"expected 'do' after the condition" -- ./lib/lua-parser/parser.lua:93
}, -- ./lib/lua-parser/parser.lua:93
{ -- ./lib/lua-parser/parser.lua:94
"ErrEndWhile", -- ./lib/lua-parser/parser.lua:94
"expected 'end' to close the while loop" -- ./lib/lua-parser/parser.lua:94
}, -- ./lib/lua-parser/parser.lua:94
{ -- ./lib/lua-parser/parser.lua:95
"ErrUntilRep", -- ./lib/lua-parser/parser.lua:95
"expected 'until' at the end of the repeat loop" -- ./lib/lua-parser/parser.lua:95
}, -- ./lib/lua-parser/parser.lua:95
{ -- ./lib/lua-parser/parser.lua:96
"ErrExprRep", -- ./lib/lua-parser/parser.lua:96
"expected a conditions after 'until'" -- ./lib/lua-parser/parser.lua:96
}, -- ./lib/lua-parser/parser.lua:96
{ -- ./lib/lua-parser/parser.lua:98
"ErrForRange", -- ./lib/lua-parser/parser.lua:98
"expected a numeric or generic range after 'for'" -- ./lib/lua-parser/parser.lua:98
}, -- ./lib/lua-parser/parser.lua:98
{ -- ./lib/lua-parser/parser.lua:99
"ErrEndFor", -- ./lib/lua-parser/parser.lua:99
"expected 'end' to close the for loop" -- ./lib/lua-parser/parser.lua:99
}, -- ./lib/lua-parser/parser.lua:99
{ -- ./lib/lua-parser/parser.lua:100
"ErrExprFor1", -- ./lib/lua-parser/parser.lua:100
"expected a starting expression for the numeric range" -- ./lib/lua-parser/parser.lua:100
}, -- ./lib/lua-parser/parser.lua:100
{ -- ./lib/lua-parser/parser.lua:101
"ErrCommaFor", -- ./lib/lua-parser/parser.lua:101
"expected ',' to split the start and end of the range" -- ./lib/lua-parser/parser.lua:101
}, -- ./lib/lua-parser/parser.lua:101
{ -- ./lib/lua-parser/parser.lua:102
"ErrExprFor2", -- ./lib/lua-parser/parser.lua:102
"expected an ending expression for the numeric range" -- ./lib/lua-parser/parser.lua:102
}, -- ./lib/lua-parser/parser.lua:102
{ -- ./lib/lua-parser/parser.lua:103
"ErrExprFor3", -- ./lib/lua-parser/parser.lua:103
"expected a step expression for the numeric range after ','" -- ./lib/lua-parser/parser.lua:103
}, -- ./lib/lua-parser/parser.lua:103
{ -- ./lib/lua-parser/parser.lua:104
"ErrInFor", -- ./lib/lua-parser/parser.lua:104
"expected '=' or 'in' after the variable(s)" -- ./lib/lua-parser/parser.lua:104
}, -- ./lib/lua-parser/parser.lua:104
{ -- ./lib/lua-parser/parser.lua:105
"ErrEListFor", -- ./lib/lua-parser/parser.lua:105
"expected one or more expressions after 'in'" -- ./lib/lua-parser/parser.lua:105
}, -- ./lib/lua-parser/parser.lua:105
{ -- ./lib/lua-parser/parser.lua:106
"ErrDoFor", -- ./lib/lua-parser/parser.lua:106
"expected 'do' after the range of the for loop" -- ./lib/lua-parser/parser.lua:106
}, -- ./lib/lua-parser/parser.lua:106
{ -- ./lib/lua-parser/parser.lua:108
"ErrDefLocal", -- ./lib/lua-parser/parser.lua:108
"expected a function definition or assignment after local" -- ./lib/lua-parser/parser.lua:108
}, -- ./lib/lua-parser/parser.lua:108
{ -- ./lib/lua-parser/parser.lua:109
"ErrDefLet", -- ./lib/lua-parser/parser.lua:109
"expected a function definition or assignment after let" -- ./lib/lua-parser/parser.lua:109
}, -- ./lib/lua-parser/parser.lua:109
{ -- ./lib/lua-parser/parser.lua:110
"ErrNameLFunc", -- ./lib/lua-parser/parser.lua:110
"expected a function name after 'function'" -- ./lib/lua-parser/parser.lua:110
}, -- ./lib/lua-parser/parser.lua:110
{ -- ./lib/lua-parser/parser.lua:111
"ErrEListLAssign", -- ./lib/lua-parser/parser.lua:111
"expected one or more expressions after '='" -- ./lib/lua-parser/parser.lua:111
}, -- ./lib/lua-parser/parser.lua:111
{ -- ./lib/lua-parser/parser.lua:112
"ErrEListAssign", -- ./lib/lua-parser/parser.lua:112
"expected one or more expressions after '='" -- ./lib/lua-parser/parser.lua:112
}, -- ./lib/lua-parser/parser.lua:112
{ -- ./lib/lua-parser/parser.lua:114
"ErrFuncName", -- ./lib/lua-parser/parser.lua:114
"expected a function name after 'function'" -- ./lib/lua-parser/parser.lua:114
}, -- ./lib/lua-parser/parser.lua:114
{ -- ./lib/lua-parser/parser.lua:115
"ErrNameFunc1", -- ./lib/lua-parser/parser.lua:115
"expected a function name after '.'" -- ./lib/lua-parser/parser.lua:115
}, -- ./lib/lua-parser/parser.lua:115
{ -- ./lib/lua-parser/parser.lua:116
"ErrNameFunc2", -- ./lib/lua-parser/parser.lua:116
"expected a method name after ':'" -- ./lib/lua-parser/parser.lua:116
}, -- ./lib/lua-parser/parser.lua:116
{ -- ./lib/lua-parser/parser.lua:117
"ErrOParenPList", -- ./lib/lua-parser/parser.lua:117
"expected '(' for the parameter list" -- ./lib/lua-parser/parser.lua:117
}, -- ./lib/lua-parser/parser.lua:117
{ -- ./lib/lua-parser/parser.lua:118
"ErrCParenPList", -- ./lib/lua-parser/parser.lua:118
"expected ')' to close the parameter list" -- ./lib/lua-parser/parser.lua:118
}, -- ./lib/lua-parser/parser.lua:118
{ -- ./lib/lua-parser/parser.lua:119
"ErrEndFunc", -- ./lib/lua-parser/parser.lua:119
"expected 'end' to close the function body" -- ./lib/lua-parser/parser.lua:119
}, -- ./lib/lua-parser/parser.lua:119
{ -- ./lib/lua-parser/parser.lua:120
"ErrParList", -- ./lib/lua-parser/parser.lua:120
"expected a variable name or '...' after ','" -- ./lib/lua-parser/parser.lua:120
}, -- ./lib/lua-parser/parser.lua:120
{ -- ./lib/lua-parser/parser.lua:122
"ErrLabel", -- ./lib/lua-parser/parser.lua:122
"expected a label name after '::'" -- ./lib/lua-parser/parser.lua:122
}, -- ./lib/lua-parser/parser.lua:122
{ -- ./lib/lua-parser/parser.lua:123
"ErrCloseLabel", -- ./lib/lua-parser/parser.lua:123
"expected '::' after the label" -- ./lib/lua-parser/parser.lua:123
}, -- ./lib/lua-parser/parser.lua:123
{ -- ./lib/lua-parser/parser.lua:124
"ErrGoto", -- ./lib/lua-parser/parser.lua:124
"expected a label after 'goto'" -- ./lib/lua-parser/parser.lua:124
}, -- ./lib/lua-parser/parser.lua:124
{ -- ./lib/lua-parser/parser.lua:125
"ErrRetList", -- ./lib/lua-parser/parser.lua:125
"expected an expression after ',' in the return statement" -- ./lib/lua-parser/parser.lua:125
}, -- ./lib/lua-parser/parser.lua:125
{ -- ./lib/lua-parser/parser.lua:127
"ErrVarList", -- ./lib/lua-parser/parser.lua:127
"expected a variable name after ','" -- ./lib/lua-parser/parser.lua:127
}, -- ./lib/lua-parser/parser.lua:127
{ -- ./lib/lua-parser/parser.lua:128
"ErrExprList", -- ./lib/lua-parser/parser.lua:128
"expected an expression after ','" -- ./lib/lua-parser/parser.lua:128
}, -- ./lib/lua-parser/parser.lua:128
{ -- ./lib/lua-parser/parser.lua:130
"ErrOrExpr", -- ./lib/lua-parser/parser.lua:130
"expected an expression after 'or'" -- ./lib/lua-parser/parser.lua:130
}, -- ./lib/lua-parser/parser.lua:130
{ -- ./lib/lua-parser/parser.lua:131
"ErrAndExpr", -- ./lib/lua-parser/parser.lua:131
"expected an expression after 'and'" -- ./lib/lua-parser/parser.lua:131
}, -- ./lib/lua-parser/parser.lua:131
{ -- ./lib/lua-parser/parser.lua:132
"ErrRelExpr", -- ./lib/lua-parser/parser.lua:132
"expected an expression after the relational operator" -- ./lib/lua-parser/parser.lua:132
}, -- ./lib/lua-parser/parser.lua:132
{ -- ./lib/lua-parser/parser.lua:133
"ErrBOrExpr", -- ./lib/lua-parser/parser.lua:133
"expected an expression after '|'" -- ./lib/lua-parser/parser.lua:133
}, -- ./lib/lua-parser/parser.lua:133
{ -- ./lib/lua-parser/parser.lua:134
"ErrBXorExpr", -- ./lib/lua-parser/parser.lua:134
"expected an expression after '~'" -- ./lib/lua-parser/parser.lua:134
}, -- ./lib/lua-parser/parser.lua:134
{ -- ./lib/lua-parser/parser.lua:135
"ErrBAndExpr", -- ./lib/lua-parser/parser.lua:135
"expected an expression after '&'" -- ./lib/lua-parser/parser.lua:135
}, -- ./lib/lua-parser/parser.lua:135
{ -- ./lib/lua-parser/parser.lua:136
"ErrShiftExpr", -- ./lib/lua-parser/parser.lua:136
"expected an expression after the bit shift" -- ./lib/lua-parser/parser.lua:136
}, -- ./lib/lua-parser/parser.lua:136
{ -- ./lib/lua-parser/parser.lua:137
"ErrConcatExpr", -- ./lib/lua-parser/parser.lua:137
"expected an expression after '..'" -- ./lib/lua-parser/parser.lua:137
}, -- ./lib/lua-parser/parser.lua:137
{ -- ./lib/lua-parser/parser.lua:138
"ErrAddExpr", -- ./lib/lua-parser/parser.lua:138
"expected an expression after the additive operator" -- ./lib/lua-parser/parser.lua:138
}, -- ./lib/lua-parser/parser.lua:138
{ -- ./lib/lua-parser/parser.lua:139
"ErrMulExpr", -- ./lib/lua-parser/parser.lua:139
"expected an expression after the multiplicative operator" -- ./lib/lua-parser/parser.lua:139
}, -- ./lib/lua-parser/parser.lua:139
{ -- ./lib/lua-parser/parser.lua:140
"ErrUnaryExpr", -- ./lib/lua-parser/parser.lua:140
"expected an expression after the unary operator" -- ./lib/lua-parser/parser.lua:140
}, -- ./lib/lua-parser/parser.lua:140
{ -- ./lib/lua-parser/parser.lua:141
"ErrPowExpr", -- ./lib/lua-parser/parser.lua:141
"expected an expression after '^'" -- ./lib/lua-parser/parser.lua:141
}, -- ./lib/lua-parser/parser.lua:141
{ -- ./lib/lua-parser/parser.lua:143
"ErrExprParen", -- ./lib/lua-parser/parser.lua:143
"expected an expression after '('" -- ./lib/lua-parser/parser.lua:143
}, -- ./lib/lua-parser/parser.lua:143
{ -- ./lib/lua-parser/parser.lua:144
"ErrCParenExpr", -- ./lib/lua-parser/parser.lua:144
"expected ')' to close the expression" -- ./lib/lua-parser/parser.lua:144
}, -- ./lib/lua-parser/parser.lua:144
{ -- ./lib/lua-parser/parser.lua:145
"ErrNameIndex", -- ./lib/lua-parser/parser.lua:145
"expected a field name after '.'" -- ./lib/lua-parser/parser.lua:145
}, -- ./lib/lua-parser/parser.lua:145
{ -- ./lib/lua-parser/parser.lua:146
"ErrExprIndex", -- ./lib/lua-parser/parser.lua:146
"expected an expression after '['" -- ./lib/lua-parser/parser.lua:146
}, -- ./lib/lua-parser/parser.lua:146
{ -- ./lib/lua-parser/parser.lua:147
"ErrCBracketIndex", -- ./lib/lua-parser/parser.lua:147
"expected ']' to close the indexing expression" -- ./lib/lua-parser/parser.lua:147
}, -- ./lib/lua-parser/parser.lua:147
{ -- ./lib/lua-parser/parser.lua:148
"ErrNameMeth", -- ./lib/lua-parser/parser.lua:148
"expected a method name after ':'" -- ./lib/lua-parser/parser.lua:148
}, -- ./lib/lua-parser/parser.lua:148
{ -- ./lib/lua-parser/parser.lua:149
"ErrMethArgs", -- ./lib/lua-parser/parser.lua:149
"expected some arguments for the method call (or '()')" -- ./lib/lua-parser/parser.lua:149
}, -- ./lib/lua-parser/parser.lua:149
{ -- ./lib/lua-parser/parser.lua:151
"ErrArgList", -- ./lib/lua-parser/parser.lua:151
"expected an expression after ',' in the argument list" -- ./lib/lua-parser/parser.lua:151
}, -- ./lib/lua-parser/parser.lua:151
{ -- ./lib/lua-parser/parser.lua:152
"ErrCParenArgs", -- ./lib/lua-parser/parser.lua:152
"expected ')' to close the argument list" -- ./lib/lua-parser/parser.lua:152
}, -- ./lib/lua-parser/parser.lua:152
{ -- ./lib/lua-parser/parser.lua:154
"ErrCBraceTable", -- ./lib/lua-parser/parser.lua:154
"expected '}' to close the table constructor" -- ./lib/lua-parser/parser.lua:154
}, -- ./lib/lua-parser/parser.lua:154
{ -- ./lib/lua-parser/parser.lua:155
"ErrEqField", -- ./lib/lua-parser/parser.lua:155
"expected '=' after the table key" -- ./lib/lua-parser/parser.lua:155
}, -- ./lib/lua-parser/parser.lua:155
{ -- ./lib/lua-parser/parser.lua:156
"ErrExprField", -- ./lib/lua-parser/parser.lua:156
"expected an expression after '='" -- ./lib/lua-parser/parser.lua:156
}, -- ./lib/lua-parser/parser.lua:156
{ -- ./lib/lua-parser/parser.lua:157
"ErrExprFKey", -- ./lib/lua-parser/parser.lua:157
"expected an expression after '[' for the table key" -- ./lib/lua-parser/parser.lua:157
}, -- ./lib/lua-parser/parser.lua:157
{ -- ./lib/lua-parser/parser.lua:158
"ErrCBracketFKey", -- ./lib/lua-parser/parser.lua:158
"expected ']' to close the table key" -- ./lib/lua-parser/parser.lua:158
}, -- ./lib/lua-parser/parser.lua:158
{ -- ./lib/lua-parser/parser.lua:160
"ErrCBracketTableCompr", -- ./lib/lua-parser/parser.lua:160
"expected ']' to close the table comprehension" -- ./lib/lua-parser/parser.lua:160
}, -- ./lib/lua-parser/parser.lua:160
{ -- ./lib/lua-parser/parser.lua:162
"ErrDigitHex", -- ./lib/lua-parser/parser.lua:162
"expected one or more hexadecimal digits after '0x'" -- ./lib/lua-parser/parser.lua:162
}, -- ./lib/lua-parser/parser.lua:162
{ -- ./lib/lua-parser/parser.lua:163
"ErrDigitDeci", -- ./lib/lua-parser/parser.lua:163
"expected one or more digits after the decimal point" -- ./lib/lua-parser/parser.lua:163
}, -- ./lib/lua-parser/parser.lua:163
{ -- ./lib/lua-parser/parser.lua:164
"ErrDigitExpo", -- ./lib/lua-parser/parser.lua:164
"expected one or more digits for the exponent" -- ./lib/lua-parser/parser.lua:164
}, -- ./lib/lua-parser/parser.lua:164
{ -- ./lib/lua-parser/parser.lua:166
"ErrQuote", -- ./lib/lua-parser/parser.lua:166
"unclosed string" -- ./lib/lua-parser/parser.lua:166
}, -- ./lib/lua-parser/parser.lua:166
{ -- ./lib/lua-parser/parser.lua:167
"ErrHexEsc", -- ./lib/lua-parser/parser.lua:167
"expected exactly two hexadecimal digits after '\\x'" -- ./lib/lua-parser/parser.lua:167
}, -- ./lib/lua-parser/parser.lua:167
{ -- ./lib/lua-parser/parser.lua:168
"ErrOBraceUEsc", -- ./lib/lua-parser/parser.lua:168
"expected '{' after '\\u'" -- ./lib/lua-parser/parser.lua:168
}, -- ./lib/lua-parser/parser.lua:168
{ -- ./lib/lua-parser/parser.lua:169
"ErrDigitUEsc", -- ./lib/lua-parser/parser.lua:169
"expected one or more hexadecimal digits for the UTF-8 code point" -- ./lib/lua-parser/parser.lua:169
}, -- ./lib/lua-parser/parser.lua:169
{ -- ./lib/lua-parser/parser.lua:170
"ErrCBraceUEsc", -- ./lib/lua-parser/parser.lua:170
"expected '}' after the code point" -- ./lib/lua-parser/parser.lua:170
}, -- ./lib/lua-parser/parser.lua:170
{ -- ./lib/lua-parser/parser.lua:171
"ErrEscSeq", -- ./lib/lua-parser/parser.lua:171
"invalid escape sequence" -- ./lib/lua-parser/parser.lua:171
}, -- ./lib/lua-parser/parser.lua:171
{ -- ./lib/lua-parser/parser.lua:172
"ErrCloseLStr", -- ./lib/lua-parser/parser.lua:172
"unclosed long string" -- ./lib/lua-parser/parser.lua:172
} -- ./lib/lua-parser/parser.lua:172
} -- ./lib/lua-parser/parser.lua:172
local function throw(label) -- ./lib/lua-parser/parser.lua:175
label = "Err" .. label -- ./lib/lua-parser/parser.lua:176
for i, labelinfo in ipairs(labels) do -- ./lib/lua-parser/parser.lua:177
if labelinfo[1] == label then -- ./lib/lua-parser/parser.lua:178
return T(i) -- ./lib/lua-parser/parser.lua:179
end -- ./lib/lua-parser/parser.lua:179
end -- ./lib/lua-parser/parser.lua:179
error("Label not found: " .. label) -- ./lib/lua-parser/parser.lua:183
end -- ./lib/lua-parser/parser.lua:183
local function expect(patt, label) -- ./lib/lua-parser/parser.lua:186
return patt + throw(label) -- ./lib/lua-parser/parser.lua:187
end -- ./lib/lua-parser/parser.lua:187
local function token(patt) -- ./lib/lua-parser/parser.lua:193
return patt * V("Skip") -- ./lib/lua-parser/parser.lua:194
end -- ./lib/lua-parser/parser.lua:194
local function sym(str) -- ./lib/lua-parser/parser.lua:197
return token(P(str)) -- ./lib/lua-parser/parser.lua:198
end -- ./lib/lua-parser/parser.lua:198
local function kw(str) -- ./lib/lua-parser/parser.lua:201
return token(P(str) * - V("IdRest")) -- ./lib/lua-parser/parser.lua:202
end -- ./lib/lua-parser/parser.lua:202
local function tagC(tag, patt) -- ./lib/lua-parser/parser.lua:205
return Ct(Cg(Cp(), "pos") * Cg(Cc(tag), "tag") * patt) -- ./lib/lua-parser/parser.lua:206
end -- ./lib/lua-parser/parser.lua:206
local function unaryOp(op, e) -- ./lib/lua-parser/parser.lua:209
return { -- ./lib/lua-parser/parser.lua:210
["tag"] = "Op", -- ./lib/lua-parser/parser.lua:210
["pos"] = e["pos"], -- ./lib/lua-parser/parser.lua:210
[1] = op, -- ./lib/lua-parser/parser.lua:210
[2] = e -- ./lib/lua-parser/parser.lua:210
} -- ./lib/lua-parser/parser.lua:210
end -- ./lib/lua-parser/parser.lua:210
local function binaryOp(e1, op, e2) -- ./lib/lua-parser/parser.lua:213
if not op then -- ./lib/lua-parser/parser.lua:214
return e1 -- ./lib/lua-parser/parser.lua:215
else -- ./lib/lua-parser/parser.lua:215
return { -- ./lib/lua-parser/parser.lua:217
["tag"] = "Op", -- ./lib/lua-parser/parser.lua:217
["pos"] = e1["pos"], -- ./lib/lua-parser/parser.lua:217
[1] = op, -- ./lib/lua-parser/parser.lua:217
[2] = e1, -- ./lib/lua-parser/parser.lua:217
[3] = e2 -- ./lib/lua-parser/parser.lua:217
} -- ./lib/lua-parser/parser.lua:217
end -- ./lib/lua-parser/parser.lua:217
end -- ./lib/lua-parser/parser.lua:217
local function sepBy(patt, sep, label) -- ./lib/lua-parser/parser.lua:221
if label then -- ./lib/lua-parser/parser.lua:222
return patt * Cg(sep * expect(patt, label)) ^ 0 -- ./lib/lua-parser/parser.lua:223
else -- ./lib/lua-parser/parser.lua:223
return patt * Cg(sep * patt) ^ 0 -- ./lib/lua-parser/parser.lua:225
end -- ./lib/lua-parser/parser.lua:225
end -- ./lib/lua-parser/parser.lua:225
local function chainOp(patt, sep, label) -- ./lib/lua-parser/parser.lua:229
return Cf(sepBy(patt, sep, label), binaryOp) -- ./lib/lua-parser/parser.lua:230
end -- ./lib/lua-parser/parser.lua:230
local function commaSep(patt, label) -- ./lib/lua-parser/parser.lua:233
return sepBy(patt, sym(","), label) -- ./lib/lua-parser/parser.lua:234
end -- ./lib/lua-parser/parser.lua:234
local function tagDo(block) -- ./lib/lua-parser/parser.lua:237
block["tag"] = "Do" -- ./lib/lua-parser/parser.lua:238
return block -- ./lib/lua-parser/parser.lua:239
end -- ./lib/lua-parser/parser.lua:239
local function fixFuncStat(func) -- ./lib/lua-parser/parser.lua:242
if func[1]["is_method"] then -- ./lib/lua-parser/parser.lua:243
table["insert"](func[2][1], 1, { -- ./lib/lua-parser/parser.lua:243
["tag"] = "Id", -- ./lib/lua-parser/parser.lua:243
[1] = "self" -- ./lib/lua-parser/parser.lua:243
}) -- ./lib/lua-parser/parser.lua:243
end -- ./lib/lua-parser/parser.lua:243
func[1] = { func[1] } -- ./lib/lua-parser/parser.lua:244
func[2] = { func[2] } -- ./lib/lua-parser/parser.lua:245
return func -- ./lib/lua-parser/parser.lua:246
end -- ./lib/lua-parser/parser.lua:246
local function addDots(params, dots) -- ./lib/lua-parser/parser.lua:249
if dots then -- ./lib/lua-parser/parser.lua:250
table["insert"](params, dots) -- ./lib/lua-parser/parser.lua:250
end -- ./lib/lua-parser/parser.lua:250
return params -- ./lib/lua-parser/parser.lua:251
end -- ./lib/lua-parser/parser.lua:251
local function insertIndex(t, index) -- ./lib/lua-parser/parser.lua:254
return { -- ./lib/lua-parser/parser.lua:255
["tag"] = "Index", -- ./lib/lua-parser/parser.lua:255
["pos"] = t["pos"], -- ./lib/lua-parser/parser.lua:255
[1] = t, -- ./lib/lua-parser/parser.lua:255
[2] = index -- ./lib/lua-parser/parser.lua:255
} -- ./lib/lua-parser/parser.lua:255
end -- ./lib/lua-parser/parser.lua:255
local function markMethod(t, method) -- ./lib/lua-parser/parser.lua:258
if method then -- ./lib/lua-parser/parser.lua:259
return { -- ./lib/lua-parser/parser.lua:260
["tag"] = "Index", -- ./lib/lua-parser/parser.lua:260
["pos"] = t["pos"], -- ./lib/lua-parser/parser.lua:260
["is_method"] = true, -- ./lib/lua-parser/parser.lua:260
[1] = t, -- ./lib/lua-parser/parser.lua:260
[2] = method -- ./lib/lua-parser/parser.lua:260
} -- ./lib/lua-parser/parser.lua:260
end -- ./lib/lua-parser/parser.lua:260
return t -- ./lib/lua-parser/parser.lua:262
end -- ./lib/lua-parser/parser.lua:262
local function makeIndexOrCall(t1, t2) -- ./lib/lua-parser/parser.lua:265
if t2["tag"] == "Call" or t2["tag"] == "Invoke" then -- ./lib/lua-parser/parser.lua:266
local t = { -- ./lib/lua-parser/parser.lua:267
["tag"] = t2["tag"], -- ./lib/lua-parser/parser.lua:267
["pos"] = t1["pos"], -- ./lib/lua-parser/parser.lua:267
[1] = t1 -- ./lib/lua-parser/parser.lua:267
} -- ./lib/lua-parser/parser.lua:267
for k, v in ipairs(t2) do -- ./lib/lua-parser/parser.lua:268
table["insert"](t, v) -- ./lib/lua-parser/parser.lua:269
end -- ./lib/lua-parser/parser.lua:269
return t -- ./lib/lua-parser/parser.lua:271
end -- ./lib/lua-parser/parser.lua:271
return { -- ./lib/lua-parser/parser.lua:273
["tag"] = "Index", -- ./lib/lua-parser/parser.lua:273
["pos"] = t1["pos"], -- ./lib/lua-parser/parser.lua:273
[1] = t1, -- ./lib/lua-parser/parser.lua:273
[2] = t2[1] -- ./lib/lua-parser/parser.lua:273
} -- ./lib/lua-parser/parser.lua:273
end -- ./lib/lua-parser/parser.lua:273
local function fixShortFunc(t) -- ./lib/lua-parser/parser.lua:276
if t[1] == ":" then -- self method -- ./lib/lua-parser/parser.lua:277
table["insert"](t[2], 1, { -- ./lib/lua-parser/parser.lua:278
["tag"] = "Id", -- ./lib/lua-parser/parser.lua:278
"self" -- ./lib/lua-parser/parser.lua:278
}) -- ./lib/lua-parser/parser.lua:278
table["remove"](t, 1) -- ./lib/lua-parser/parser.lua:279
t["is_method"] = true -- ./lib/lua-parser/parser.lua:280
end -- ./lib/lua-parser/parser.lua:280
t["is_short"] = true -- ./lib/lua-parser/parser.lua:282
return t -- ./lib/lua-parser/parser.lua:283
end -- ./lib/lua-parser/parser.lua:283
local function statToExpr(t) -- tag a StatExpr -- ./lib/lua-parser/parser.lua:286
t["tag"] = t["tag"] .. "Expr" -- ./lib/lua-parser/parser.lua:287
return t -- ./lib/lua-parser/parser.lua:288
end -- ./lib/lua-parser/parser.lua:288
local function fixStructure(t) -- fix the AST structure if needed -- ./lib/lua-parser/parser.lua:291
local i = 1 -- ./lib/lua-parser/parser.lua:292
while i <= # t do -- ./lib/lua-parser/parser.lua:293
if type(t[i]) == "table" then -- ./lib/lua-parser/parser.lua:294
fixStructure(t[i]) -- ./lib/lua-parser/parser.lua:295
for j = # t[i], 1, - 1 do -- ./lib/lua-parser/parser.lua:296
local stat = t[i][j] -- ./lib/lua-parser/parser.lua:297
if type(stat) == "table" and stat["move_up_block"] and stat["move_up_block"] > 0 then -- ./lib/lua-parser/parser.lua:298
table["remove"](t[i], j) -- ./lib/lua-parser/parser.lua:299
table["insert"](t, i + 1, stat) -- ./lib/lua-parser/parser.lua:300
if t["tag"] == "Block" or t["tag"] == "Do" then -- ./lib/lua-parser/parser.lua:301
stat["move_up_block"] = stat["move_up_block"] - 1 -- ./lib/lua-parser/parser.lua:302
end -- ./lib/lua-parser/parser.lua:302
end -- ./lib/lua-parser/parser.lua:302
end -- ./lib/lua-parser/parser.lua:302
end -- ./lib/lua-parser/parser.lua:302
i = i + 1 -- ./lib/lua-parser/parser.lua:307
end -- ./lib/lua-parser/parser.lua:307
return t -- ./lib/lua-parser/parser.lua:309
end -- ./lib/lua-parser/parser.lua:309
local function searchEndRec(block, isRecCall) -- recursively search potential "end" keyword wrongly consumed by a short anonymous function on stat end (yeah, too late to change the syntax to something easier to parse) -- ./lib/lua-parser/parser.lua:312
for i, stat in ipairs(block) do -- ./lib/lua-parser/parser.lua:313
if stat["tag"] == "Set" or stat["tag"] == "Push" or stat["tag"] == "Return" or stat["tag"] == "Local" or stat["tag"] == "Let" or stat["tag"] == "Localrec" then -- ./lib/lua-parser/parser.lua:315
local exprlist -- ./lib/lua-parser/parser.lua:316
if stat["tag"] == "Set" or stat["tag"] == "Local" or stat["tag"] == "Let" or stat["tag"] == "Localrec" then -- ./lib/lua-parser/parser.lua:318
exprlist = stat[# stat] -- ./lib/lua-parser/parser.lua:319
elseif stat["tag"] == "Push" or stat["tag"] == "Return" then -- ./lib/lua-parser/parser.lua:320
exprlist = stat -- ./lib/lua-parser/parser.lua:321
end -- ./lib/lua-parser/parser.lua:321
local last = exprlist[# exprlist] -- last value in ExprList -- ./lib/lua-parser/parser.lua:324
if last["tag"] == "Function" and last["is_short"] and not last["is_method"] and # last[1] == 1 then -- ./lib/lua-parser/parser.lua:328
local p = i -- ./lib/lua-parser/parser.lua:329
for j, fstat in ipairs(last[2]) do -- ./lib/lua-parser/parser.lua:330
p = i + j -- ./lib/lua-parser/parser.lua:331
table["insert"](block, p, fstat) -- copy stats from func body to block -- ./lib/lua-parser/parser.lua:332
if stat["move_up_block"] then -- extracted stats inherit move_up_block from statement -- ./lib/lua-parser/parser.lua:334
fstat["move_up_block"] = (fstat["move_up_block"] or 0) + stat["move_up_block"] -- ./lib/lua-parser/parser.lua:335
end -- ./lib/lua-parser/parser.lua:335
if block["is_singlestatblock"] then -- if it's a single stat block, mark them to move them outside of the block -- ./lib/lua-parser/parser.lua:338
fstat["move_up_block"] = (fstat["move_up_block"] or 0) + 1 -- ./lib/lua-parser/parser.lua:339
end -- ./lib/lua-parser/parser.lua:339
end -- ./lib/lua-parser/parser.lua:339
exprlist[# exprlist] = last[1] -- replace func with paren and expressions -- ./lib/lua-parser/parser.lua:343
exprlist[# exprlist]["tag"] = "Paren" -- ./lib/lua-parser/parser.lua:344
if not isRecCall then -- if superfluous statements won't be moved in a next recursion, let fixStructure handle things -- ./lib/lua-parser/parser.lua:346
for j = p + 1, # block, 1 do -- ./lib/lua-parser/parser.lua:347
block[j]["move_up_block"] = (block[j]["move_up_block"] or 0) + 1 -- ./lib/lua-parser/parser.lua:348
end -- ./lib/lua-parser/parser.lua:348
end -- ./lib/lua-parser/parser.lua:348
return block, i -- ./lib/lua-parser/parser.lua:352
elseif last["tag"]:match("Expr$") then -- ./lib/lua-parser/parser.lua:355
local r = searchEndRec({ last }) -- ./lib/lua-parser/parser.lua:356
if r then -- ./lib/lua-parser/parser.lua:357
for j = 2, # r, 1 do -- ./lib/lua-parser/parser.lua:358
table["insert"](block, i + j - 1, r[j]) -- move back superflous statements from our new table to our real block -- ./lib/lua-parser/parser.lua:359
end -- move back superflous statements from our new table to our real block -- ./lib/lua-parser/parser.lua:359
return block, i -- ./lib/lua-parser/parser.lua:361
end -- ./lib/lua-parser/parser.lua:361
elseif last["tag"] == "Function" then -- ./lib/lua-parser/parser.lua:363
local r = searchEndRec(last[2]) -- ./lib/lua-parser/parser.lua:364
if r then -- ./lib/lua-parser/parser.lua:365
return block, i -- ./lib/lua-parser/parser.lua:366
end -- ./lib/lua-parser/parser.lua:366
end -- ./lib/lua-parser/parser.lua:366
elseif stat["tag"]:match("^If") or stat["tag"]:match("^While") or stat["tag"]:match("^Repeat") or stat["tag"]:match("^Do") or stat["tag"]:match("^Fornum") or stat["tag"]:match("^Forin") then -- ./lib/lua-parser/parser.lua:371
local blocks -- ./lib/lua-parser/parser.lua:372
if stat["tag"]:match("^If") or stat["tag"]:match("^While") or stat["tag"]:match("^Repeat") or stat["tag"]:match("^Fornum") or stat["tag"]:match("^Forin") then -- ./lib/lua-parser/parser.lua:374
blocks = stat -- ./lib/lua-parser/parser.lua:375
elseif stat["tag"]:match("^Do") then -- ./lib/lua-parser/parser.lua:376
blocks = { stat } -- ./lib/lua-parser/parser.lua:377
end -- ./lib/lua-parser/parser.lua:377
for _, iblock in ipairs(blocks) do -- ./lib/lua-parser/parser.lua:380
if iblock["tag"] == "Block" then -- blocks -- ./lib/lua-parser/parser.lua:381
local oldLen = # iblock -- ./lib/lua-parser/parser.lua:382
local newiBlock, newEnd = searchEndRec(iblock, true) -- ./lib/lua-parser/parser.lua:383
if newiBlock then -- if end in the block -- ./lib/lua-parser/parser.lua:384
local p = i -- ./lib/lua-parser/parser.lua:385
for j = newEnd + (# iblock - oldLen) + 1, # iblock, 1 do -- move all statements after the newely added statements to the parent block -- ./lib/lua-parser/parser.lua:386
p = p + 1 -- ./lib/lua-parser/parser.lua:387
table["insert"](block, p, iblock[j]) -- ./lib/lua-parser/parser.lua:388
iblock[j] = nil -- ./lib/lua-parser/parser.lua:389
end -- ./lib/lua-parser/parser.lua:389
if not isRecCall then -- if superfluous statements won't be moved in a next recursion, let fixStructure handle things -- ./lib/lua-parser/parser.lua:392
for j = p + 1, # block, 1 do -- ./lib/lua-parser/parser.lua:393
block[j]["move_up_block"] = (block[j]["move_up_block"] or 0) + 1 -- ./lib/lua-parser/parser.lua:394
end -- ./lib/lua-parser/parser.lua:394
end -- ./lib/lua-parser/parser.lua:394
return block, i -- ./lib/lua-parser/parser.lua:398
end -- ./lib/lua-parser/parser.lua:398
end -- ./lib/lua-parser/parser.lua:398
end -- ./lib/lua-parser/parser.lua:398
end -- ./lib/lua-parser/parser.lua:398
end -- ./lib/lua-parser/parser.lua:398
return nil -- ./lib/lua-parser/parser.lua:404
end -- ./lib/lua-parser/parser.lua:404
local function searchEnd(s, p, t) -- match time capture which try to restructure the AST to free an "end" for us -- ./lib/lua-parser/parser.lua:407
local r = searchEndRec(fixStructure(t)) -- ./lib/lua-parser/parser.lua:408
if not r then -- ./lib/lua-parser/parser.lua:409
return false -- ./lib/lua-parser/parser.lua:410
end -- ./lib/lua-parser/parser.lua:410
return true, r -- ./lib/lua-parser/parser.lua:412
end -- ./lib/lua-parser/parser.lua:412
local function expectBlockOrSingleStatWithStartEnd(start, startLabel, stopLabel, canFollow) -- will try a SingleStat if start doesn't match -- ./lib/lua-parser/parser.lua:415
if canFollow then -- ./lib/lua-parser/parser.lua:416
return (- start * V("SingleStatBlock") * canFollow ^ - 1) + (expect(start, startLabel) * ((V("Block") * (canFollow + kw("end"))) + (Cmt(V("Block"), searchEnd) + throw(stopLabel)))) -- ./lib/lua-parser/parser.lua:419
else -- ./lib/lua-parser/parser.lua:419
return (- start * V("SingleStatBlock")) + (expect(start, startLabel) * ((V("Block") * kw("end")) + (Cmt(V("Block"), searchEnd) + throw(stopLabel)))) -- ./lib/lua-parser/parser.lua:423
end -- ./lib/lua-parser/parser.lua:423
end -- ./lib/lua-parser/parser.lua:423
local function expectBlockWithEnd(label) -- can't work *optionnaly* with SingleStat unfortunatly -- ./lib/lua-parser/parser.lua:427
return (V("Block") * kw("end")) + (Cmt(V("Block"), searchEnd) + throw(label)) -- ./lib/lua-parser/parser.lua:429
end -- ./lib/lua-parser/parser.lua:429
local function maybeBlockWithEnd() -- same as above but don't error if it doesn't match -- ./lib/lua-parser/parser.lua:432
return (V("BlockNoErr") * kw("end")) + Cmt(V("BlockNoErr"), searchEnd) -- ./lib/lua-parser/parser.lua:434
end -- ./lib/lua-parser/parser.lua:434
local G = { -- ./lib/lua-parser/parser.lua:438
V("Lua"), -- ./lib/lua-parser/parser.lua:438
["Lua"] = (V("Shebang") ^ - 1 * V("Skip") * V("Block") * expect(P(- 1), "Extra")) / fixStructure, -- ./lib/lua-parser/parser.lua:439
["Shebang"] = P("#!") * (P(1) - P("\
")) ^ 0, -- ./lib/lua-parser/parser.lua:440
["Block"] = tagC("Block", (V("Stat") + - V("BlockEnd") * throw("InvalidStat")) ^ 0 * ((V("RetStat") + V("ImplicitPushStat")) * sym(";") ^ - 1) ^ - 1), -- ./lib/lua-parser/parser.lua:442
["Stat"] = V("IfStat") + V("DoStat") + V("WhileStat") + V("RepeatStat") + V("ForStat") + V("LocalStat") + V("FuncStat") + V("BreakStat") + V("LabelStat") + V("GoToStat") + V("FuncCall") + V("Assignment") + V("LetStat") + V("ContinueStat") + V("PushStat") + sym(";"), -- ./lib/lua-parser/parser.lua:447
["BlockEnd"] = P("return") + "end" + "elseif" + "else" + "until" + "]" + - 1 + V("ImplicitPushStat") + V("Assignment"), -- ./lib/lua-parser/parser.lua:448
["SingleStatBlock"] = tagC("Block", V("Stat") + V("RetStat") + V("ImplicitPushStat")) / function(t) -- ./lib/lua-parser/parser.lua:450
t["is_singlestatblock"] = true -- ./lib/lua-parser/parser.lua:450
return t -- ./lib/lua-parser/parser.lua:450
end, -- ./lib/lua-parser/parser.lua:450
["BlockNoErr"] = tagC("Block", V("Stat") ^ 0 * ((V("RetStat") + V("ImplicitPushStat")) * sym(";") ^ - 1) ^ - 1), -- used to check if something a valid block without throwing an error -- ./lib/lua-parser/parser.lua:451
["IfStat"] = tagC("If", V("IfPart")), -- ./lib/lua-parser/parser.lua:453
["IfPart"] = kw("if") * expect(V("Expr"), "ExprIf") * expectBlockOrSingleStatWithStartEnd(kw("then"), "ThenIf", "EndIf", V("ElseIfPart") + V("ElsePart")), -- ./lib/lua-parser/parser.lua:454
["ElseIfPart"] = kw("elseif") * expect(V("Expr"), "ExprEIf") * expectBlockOrSingleStatWithStartEnd(kw("then"), "ThenEIf", "EndIf", V("ElseIfPart") + V("ElsePart")), -- ./lib/lua-parser/parser.lua:455
["ElsePart"] = kw("else") * expectBlockWithEnd("EndIf"), -- ./lib/lua-parser/parser.lua:456
["DoStat"] = kw("do") * expectBlockWithEnd("EndDo") / tagDo, -- ./lib/lua-parser/parser.lua:458
["WhileStat"] = tagC("While", kw("while") * expect(V("Expr"), "ExprWhile") * V("WhileBody")), -- ./lib/lua-parser/parser.lua:459
["WhileBody"] = expectBlockOrSingleStatWithStartEnd(kw("do"), "DoWhile", "EndWhile"), -- ./lib/lua-parser/parser.lua:460
["RepeatStat"] = tagC("Repeat", kw("repeat") * V("Block") * expect(kw("until"), "UntilRep") * expect(V("Expr"), "ExprRep")), -- ./lib/lua-parser/parser.lua:461
["ForStat"] = kw("for") * expect(V("ForNum") + V("ForIn"), "ForRange"), -- ./lib/lua-parser/parser.lua:463
["ForNum"] = tagC("Fornum", V("Id") * sym("=") * V("NumRange") * V("ForBody")), -- ./lib/lua-parser/parser.lua:464
["NumRange"] = expect(V("Expr"), "ExprFor1") * expect(sym(","), "CommaFor") * expect(V("Expr"), "ExprFor2") * (sym(",") * expect(V("Expr"), "ExprFor3")) ^ - 1, -- ./lib/lua-parser/parser.lua:466
["ForIn"] = tagC("Forin", V("NameList") * expect(kw("in"), "InFor") * expect(V("ExprList"), "EListFor") * V("ForBody")), -- ./lib/lua-parser/parser.lua:467
["ForBody"] = expectBlockOrSingleStatWithStartEnd(kw("do"), "DoFor", "EndFor"), -- ./lib/lua-parser/parser.lua:468
["LocalStat"] = kw("local") * expect(V("LocalFunc") + V("LocalAssign"), "DefLocal"), -- ./lib/lua-parser/parser.lua:470
["LocalFunc"] = tagC("Localrec", kw("function") * expect(V("Id"), "NameLFunc") * V("FuncBody")) / fixFuncStat, -- ./lib/lua-parser/parser.lua:471
["LocalAssign"] = tagC("Local", V("NameList") * (sym("=") * expect(V("ExprList"), "EListLAssign") + Ct(Cc()))), -- ./lib/lua-parser/parser.lua:472
["LetStat"] = kw("let") * expect(V("LetAssign"), "DefLet"), -- ./lib/lua-parser/parser.lua:474
["LetAssign"] = tagC("Let", V("NameList") * (sym("=") * expect(V("ExprList"), "EListLAssign") + Ct(Cc()))), -- ./lib/lua-parser/parser.lua:475
["Assignment"] = tagC("Set", V("VarList") * V("BinOp") ^ - 1 * (P("=") / "=") * V("BinOp") ^ - 1 * V("Skip") * expect(V("ExprList"), "EListAssign")), -- ./lib/lua-parser/parser.lua:477
["FuncStat"] = tagC("Set", kw("function") * expect(V("FuncName"), "FuncName") * V("FuncBody")) / fixFuncStat, -- ./lib/lua-parser/parser.lua:479
["FuncName"] = Cf(V("Id") * (sym(".") * expect(V("StrId"), "NameFunc1")) ^ 0, insertIndex) * (sym(":") * expect(V("StrId"), "NameFunc2")) ^ - 1 / markMethod, -- ./lib/lua-parser/parser.lua:481
["FuncBody"] = tagC("Function", V("FuncParams") * expectBlockWithEnd("EndFunc")), -- ./lib/lua-parser/parser.lua:482
["FuncParams"] = expect(sym("("), "OParenPList") * V("ParList") * expect(sym(")"), "CParenPList"), -- ./lib/lua-parser/parser.lua:483
["ParList"] = V("NamedParList") * (sym(",") * expect(tagC("Dots", sym("...")), "ParList")) ^ - 1 / addDots + Ct(tagC("Dots", sym("..."))) + Ct(Cc()), -- Cc({}) generates a bug since the {} would be shared across parses -- ./lib/lua-parser/parser.lua:486
["ShortFuncDef"] = tagC("Function", V("ShortFuncParams") * maybeBlockWithEnd()) / fixShortFunc, -- ./lib/lua-parser/parser.lua:488
["ShortFuncParams"] = (sym(":") / ":") ^ - 1 * sym("(") * V("ParList") * sym(")"), -- ./lib/lua-parser/parser.lua:489
["NamedParList"] = tagC("NamedParList", commaSep(V("NamedPar"))), -- ./lib/lua-parser/parser.lua:491
["NamedPar"] = tagC("ParPair", V("ParKey") * expect(sym("="), "EqField") * expect(V("Expr"), "ExprField")) + V("Id"), -- ./lib/lua-parser/parser.lua:493
["ParKey"] = V("Id") * # ("=" * - P("=")), -- ./lib/lua-parser/parser.lua:494
["LabelStat"] = tagC("Label", sym("::") * expect(V("Name"), "Label") * expect(sym("::"), "CloseLabel")), -- ./lib/lua-parser/parser.lua:496
["GoToStat"] = tagC("Goto", kw("goto") * expect(V("Name"), "Goto")), -- ./lib/lua-parser/parser.lua:497
["BreakStat"] = tagC("Break", kw("break")), -- ./lib/lua-parser/parser.lua:498
["ContinueStat"] = tagC("Continue", kw("continue")), -- ./lib/lua-parser/parser.lua:499
["RetStat"] = tagC("Return", kw("return") * commaSep(V("Expr"), "RetList") ^ - 1), -- ./lib/lua-parser/parser.lua:500
["PushStat"] = tagC("Push", kw("push") * commaSep(V("Expr"), "RetList") ^ - 1), -- ./lib/lua-parser/parser.lua:502
["ImplicitPushStat"] = tagC("Push", commaSep(V("Expr"), "RetList")), -- ./lib/lua-parser/parser.lua:503
["NameList"] = tagC("NameList", commaSep(V("Id"))), -- ./lib/lua-parser/parser.lua:505
["VarList"] = tagC("VarList", commaSep(V("VarExpr"))), -- ./lib/lua-parser/parser.lua:506
["ExprList"] = tagC("ExpList", commaSep(V("Expr"), "ExprList")), -- ./lib/lua-parser/parser.lua:507
["Expr"] = V("OrExpr"), -- ./lib/lua-parser/parser.lua:509
["OrExpr"] = chainOp(V("AndExpr"), V("OrOp"), "OrExpr"), -- ./lib/lua-parser/parser.lua:510
["AndExpr"] = chainOp(V("RelExpr"), V("AndOp"), "AndExpr"), -- ./lib/lua-parser/parser.lua:511
["RelExpr"] = chainOp(V("BOrExpr"), V("RelOp"), "RelExpr"), -- ./lib/lua-parser/parser.lua:512
["BOrExpr"] = chainOp(V("BXorExpr"), V("BOrOp"), "BOrExpr"), -- ./lib/lua-parser/parser.lua:513
["BXorExpr"] = chainOp(V("BAndExpr"), V("BXorOp"), "BXorExpr"), -- ./lib/lua-parser/parser.lua:514
["BAndExpr"] = chainOp(V("ShiftExpr"), V("BAndOp"), "BAndExpr"), -- ./lib/lua-parser/parser.lua:515
["ShiftExpr"] = chainOp(V("ConcatExpr"), V("ShiftOp"), "ShiftExpr"), -- ./lib/lua-parser/parser.lua:516
["ConcatExpr"] = V("AddExpr") * (V("ConcatOp") * expect(V("ConcatExpr"), "ConcatExpr")) ^ - 1 / binaryOp, -- ./lib/lua-parser/parser.lua:517
["AddExpr"] = chainOp(V("MulExpr"), V("AddOp"), "AddExpr"), -- ./lib/lua-parser/parser.lua:518
["MulExpr"] = chainOp(V("UnaryExpr"), V("MulOp"), "MulExpr"), -- ./lib/lua-parser/parser.lua:519
["UnaryExpr"] = V("UnaryOp") * expect(V("UnaryExpr"), "UnaryExpr") / unaryOp + V("PowExpr"), -- ./lib/lua-parser/parser.lua:521
["PowExpr"] = V("SimpleExpr") * (V("PowOp") * expect(V("UnaryExpr"), "PowExpr")) ^ - 1 / binaryOp, -- ./lib/lua-parser/parser.lua:522
["SimpleExpr"] = tagC("Number", V("Number")) + tagC("String", V("String")) + tagC("Nil", kw("nil")) + tagC("Boolean", kw("false") * Cc(false)) + tagC("Boolean", kw("true") * Cc(true)) + tagC("Dots", sym("...")) + V("FuncDef") + V("Table") + V("ShortFuncDef") + V("SuffixedExpr") + V("TableCompr") + V("StatExpr"), -- ./lib/lua-parser/parser.lua:535
["StatExpr"] = (V("IfStat") + V("DoStat") + V("WhileStat") + V("RepeatStat") + V("ForStat")) / statToExpr, -- ./lib/lua-parser/parser.lua:537
["FuncCall"] = Cmt(V("SuffixedExpr"), function(s, i, exp) -- ./lib/lua-parser/parser.lua:539
return exp["tag"] == "Call" or exp["tag"] == "Invoke", exp -- ./lib/lua-parser/parser.lua:539
end), -- ./lib/lua-parser/parser.lua:539
["VarExpr"] = Cmt(V("SuffixedExpr"), function(s, i, exp) -- ./lib/lua-parser/parser.lua:540
return exp["tag"] == "Id" or exp["tag"] == "Index", exp -- ./lib/lua-parser/parser.lua:540
end), -- ./lib/lua-parser/parser.lua:540
["SuffixedExpr"] = Cf(V("PrimaryExpr") * (V("Index") + V("Call")) ^ 0, makeIndexOrCall), -- ./lib/lua-parser/parser.lua:542
["PrimaryExpr"] = V("SelfId") * (V("SelfCall") + V("SelfIndex")) + V("Id") + tagC("Paren", sym("(") * expect(V("Expr"), "ExprParen") * expect(sym(")"), "CParenExpr")), -- ./lib/lua-parser/parser.lua:545
["Index"] = tagC("DotIndex", sym("." * - P(".")) * expect(V("StrId"), "NameIndex")) + tagC("ArrayIndex", sym("[" * - P(S("=["))) * expect(V("Expr"), "ExprIndex") * expect(sym("]"), "CBracketIndex")), -- ./lib/lua-parser/parser.lua:547
["Call"] = tagC("Invoke", Cg(sym(":" * - P(":")) * expect(V("StrId"), "NameMeth") * expect(V("FuncArgs"), "MethArgs"))) + tagC("Call", V("FuncArgs")), -- ./lib/lua-parser/parser.lua:549
["SelfIndex"] = tagC("DotIndex", V("StrId")), -- ./lib/lua-parser/parser.lua:550
["SelfCall"] = tagC("Invoke", Cg(V("StrId") * V("FuncArgs"))), -- ./lib/lua-parser/parser.lua:551
["FuncDef"] = (kw("function") * V("FuncBody")), -- ./lib/lua-parser/parser.lua:553
["FuncArgs"] = sym("(") * commaSep(V("Expr"), "ArgList") ^ - 1 * expect(sym(")"), "CParenArgs") + V("Table") + tagC("String", V("String")), -- ./lib/lua-parser/parser.lua:556
["Table"] = tagC("Table", sym("{") * V("FieldList") ^ - 1 * expect(sym("}"), "CBraceTable")), -- ./lib/lua-parser/parser.lua:558
["FieldList"] = sepBy(V("Field"), V("FieldSep")) * V("FieldSep") ^ - 1, -- ./lib/lua-parser/parser.lua:559
["Field"] = tagC("Pair", V("FieldKey") * expect(sym("="), "EqField") * expect(V("Expr"), "ExprField")) + V("Expr"), -- ./lib/lua-parser/parser.lua:561
["FieldKey"] = sym("[" * - P(S("=["))) * expect(V("Expr"), "ExprFKey") * expect(sym("]"), "CBracketFKey") + V("StrId") * # ("=" * - P("=")), -- ./lib/lua-parser/parser.lua:563
["FieldSep"] = sym(",") + sym(";"), -- ./lib/lua-parser/parser.lua:564
["TableCompr"] = tagC("TableCompr", sym("[") * V("Block") * expect(sym("]"), "CBracketTableCompr")), -- ./lib/lua-parser/parser.lua:566
["SelfId"] = tagC("Id", sym("@") / "self"), -- ./lib/lua-parser/parser.lua:568
["Id"] = tagC("Id", V("Name")) + V("SelfId"), -- ./lib/lua-parser/parser.lua:569
["StrId"] = tagC("String", V("Name")), -- ./lib/lua-parser/parser.lua:570
["Skip"] = (V("Space") + V("Comment")) ^ 0, -- ./lib/lua-parser/parser.lua:573
["Space"] = space ^ 1, -- ./lib/lua-parser/parser.lua:574
["Comment"] = P("--") * V("LongStr") / function() -- ./lib/lua-parser/parser.lua:575
return -- ./lib/lua-parser/parser.lua:575
end + P("--") * (P(1) - P("\
")) ^ 0, -- ./lib/lua-parser/parser.lua:576
["Name"] = token(- V("Reserved") * C(V("Ident"))), -- ./lib/lua-parser/parser.lua:578
["Reserved"] = V("Keywords") * - V("IdRest"), -- ./lib/lua-parser/parser.lua:579
["Keywords"] = P("and") + "break" + "do" + "elseif" + "else" + "end" + "false" + "for" + "function" + "goto" + "if" + "in" + "local" + "nil" + "not" + "or" + "repeat" + "return" + "then" + "true" + "until" + "while", -- ./lib/lua-parser/parser.lua:583
["Ident"] = V("IdStart") * V("IdRest") ^ 0, -- ./lib/lua-parser/parser.lua:584
["IdStart"] = alpha + P("_"), -- ./lib/lua-parser/parser.lua:585
["IdRest"] = alnum + P("_"), -- ./lib/lua-parser/parser.lua:586
["Number"] = token(C(V("Hex") + V("Float") + V("Int"))), -- ./lib/lua-parser/parser.lua:588
["Hex"] = (P("0x") + "0X") * ((xdigit ^ 0 * V("DeciHex")) + (expect(xdigit ^ 1, "DigitHex") * V("DeciHex") ^ - 1)) * V("ExpoHex") ^ - 1, -- ./lib/lua-parser/parser.lua:589
["Float"] = V("Decimal") * V("Expo") ^ - 1 + V("Int") * V("Expo"), -- ./lib/lua-parser/parser.lua:591
["Decimal"] = digit ^ 1 * "." * digit ^ 0 + P(".") * - P(".") * expect(digit ^ 1, "DigitDeci"), -- ./lib/lua-parser/parser.lua:593
["DeciHex"] = P(".") * xdigit ^ 0, -- ./lib/lua-parser/parser.lua:594
["Expo"] = S("eE") * S("+-") ^ - 1 * expect(digit ^ 1, "DigitExpo"), -- ./lib/lua-parser/parser.lua:595
["ExpoHex"] = S("pP") * S("+-") ^ - 1 * expect(xdigit ^ 1, "DigitExpo"), -- ./lib/lua-parser/parser.lua:596
["Int"] = digit ^ 1, -- ./lib/lua-parser/parser.lua:597
["String"] = token(V("ShortStr") + V("LongStr")), -- ./lib/lua-parser/parser.lua:599
["ShortStr"] = P("\"") * Cs((V("EscSeq") + (P(1) - S("\"\
"))) ^ 0) * expect(P("\""), "Quote") + P("'") * Cs((V("EscSeq") + (P(1) - S("'\
"))) ^ 0) * expect(P("'"), "Quote"), -- ./lib/lua-parser/parser.lua:601
["EscSeq"] = P("\\") / "" * (P("a") / "\7" + P("b") / "\8" + P("f") / "\12" + P("n") / "\
" + P("r") / "\13" + P("t") / "\9" + P("v") / "\11" + P("\
") / "\
" + P("\13") / "\
" + P("\\") / "\\" + P("\"") / "\"" + P("'") / "'" + P("z") * space ^ 0 / "" + digit * digit ^ - 2 / tonumber / string["char"] + P("x") * expect(C(xdigit * xdigit), "HexEsc") * Cc(16) / tonumber / string["char"] + P("u") * expect("{", "OBraceUEsc") * expect(C(xdigit ^ 1), "DigitUEsc") * Cc(16) * expect("}", "CBraceUEsc") / tonumber / (utf8 and utf8["char"] or string["char"]) + throw("EscSeq")), -- ./lib/lua-parser/parser.lua:631
["LongStr"] = V("Open") * C((P(1) - V("CloseEq")) ^ 0) * expect(V("Close"), "CloseLStr") / function(s, eqs) -- ./lib/lua-parser/parser.lua:634
return s -- ./lib/lua-parser/parser.lua:634
end, -- ./lib/lua-parser/parser.lua:634
["Open"] = "[" * Cg(V("Equals"), "openEq") * "[" * P("\
") ^ - 1, -- ./lib/lua-parser/parser.lua:635
["Close"] = "]" * C(V("Equals")) * "]", -- ./lib/lua-parser/parser.lua:636
["Equals"] = P("=") ^ 0, -- ./lib/lua-parser/parser.lua:637
["CloseEq"] = Cmt(V("Close") * Cb("openEq"), function(s, i, closeEq, openEq) -- ./lib/lua-parser/parser.lua:638
return # openEq == # closeEq -- ./lib/lua-parser/parser.lua:638
end), -- ./lib/lua-parser/parser.lua:638
["OrOp"] = kw("or") / "or", -- ./lib/lua-parser/parser.lua:640
["AndOp"] = kw("and") / "and", -- ./lib/lua-parser/parser.lua:641
["RelOp"] = sym("~=") / "ne" + sym("==") / "eq" + sym("<=") / "le" + sym(">=") / "ge" + sym("<") / "lt" + sym(">") / "gt", -- ./lib/lua-parser/parser.lua:647
["BOrOp"] = sym("|") / "bor", -- ./lib/lua-parser/parser.lua:648
["BXorOp"] = sym("~" * - P("=")) / "bxor", -- ./lib/lua-parser/parser.lua:649
["BAndOp"] = sym("&") / "band", -- ./lib/lua-parser/parser.lua:650
["ShiftOp"] = sym("<<") / "shl" + sym(">>") / "shr", -- ./lib/lua-parser/parser.lua:652
["ConcatOp"] = sym("..") / "concat", -- ./lib/lua-parser/parser.lua:653
["AddOp"] = sym("+") / "add" + sym("-") / "sub", -- ./lib/lua-parser/parser.lua:655
["MulOp"] = sym("*") / "mul" + sym("//") / "idiv" + sym("/") / "div" + sym("%") / "mod", -- ./lib/lua-parser/parser.lua:659
["UnaryOp"] = kw("not") / "not" + sym("-") / "unm" + sym("#") / "len" + sym("~") / "bnot", -- ./lib/lua-parser/parser.lua:663
["PowOp"] = sym("^") / "pow", -- ./lib/lua-parser/parser.lua:664
["BinOp"] = V("OrOp") + V("AndOp") + V("BOrOp") + V("BXorOp") + V("BAndOp") + V("ShiftOp") + V("ConcatOp") + V("AddOp") + V("MulOp") + V("PowOp") -- ./lib/lua-parser/parser.lua:665
} -- ./lib/lua-parser/parser.lua:665
local parser = {} -- ./lib/lua-parser/parser.lua:668
local validator = require("lib.lua-parser.validator") -- ./lib/lua-parser/parser.lua:670
local validate = validator["validate"] -- ./lib/lua-parser/parser.lua:671
local syntaxerror = validator["syntaxerror"] -- ./lib/lua-parser/parser.lua:672
parser["parse"] = function(subject, filename) -- ./lib/lua-parser/parser.lua:674
local errorinfo = { -- ./lib/lua-parser/parser.lua:675
["subject"] = subject, -- ./lib/lua-parser/parser.lua:675
["filename"] = filename -- ./lib/lua-parser/parser.lua:675
} -- ./lib/lua-parser/parser.lua:675
lpeg["setmaxstack"](1000) -- ./lib/lua-parser/parser.lua:676
local ast, label, errpos = lpeg["match"](G, subject, nil, errorinfo) -- ./lib/lua-parser/parser.lua:677
if not ast then -- ./lib/lua-parser/parser.lua:678
local errmsg = labels[label][2] -- ./lib/lua-parser/parser.lua:679
return ast, syntaxerror(errorinfo, errpos, errmsg) -- ./lib/lua-parser/parser.lua:680
end -- ./lib/lua-parser/parser.lua:680
return validate(ast, errorinfo) -- ./lib/lua-parser/parser.lua:682
end -- ./lib/lua-parser/parser.lua:682
return parser -- ./lib/lua-parser/parser.lua:685
end -- ./lib/lua-parser/parser.lua:685
local parser = _() or parser -- ./lib/lua-parser/parser.lua:689
package["loaded"]["lib.lua-parser.parser"] = parser or true -- ./lib/lua-parser/parser.lua:690
local candran = { ["VERSION"] = "0.6.2" } -- candran.can:13
candran["default"] = { -- candran.can:17
["target"] = "lua53", -- candran.can:18
["indentation"] = "", -- candran.can:19
["newline"] = "\
", -- candran.can:20
["variablePrefix"] = "__CAN_", -- candran.can:21
["mapLines"] = true, -- candran.can:22
["chunkname"] = "nil", -- candran.can:23
["rewriteErrors"] = true -- candran.can:24
} -- candran.can:24
candran["preprocess"] = function(input, options) -- candran.can:31
if options == nil then options = {} end -- candran.can:31
options = util["merge"](candran["default"], options) -- candran.can:32
local preprocessor = "" -- candran.can:35
local i = 0 -- candran.can:36
for line in (input .. "\
"):gmatch("(.-\
)") do -- candran.can:37
i = i + (1) -- candran.can:38
if line:match("^%s*#") and not line:match("^#!") then -- exclude shebang -- candran.can:39
preprocessor = preprocessor .. (line:gsub("^%s*#", "")) -- candran.can:40
else -- candran.can:40
local l = line:sub(1, - 2) -- candran.can:42
if options["mapLines"] and not l:match("%-%- (.-)%:(%d+)$") then -- candran.can:43
preprocessor = preprocessor .. (("write(%q)"):format(l .. " -- " .. options["chunkname"] .. ":" .. i) .. "\
") -- candran.can:44
else -- candran.can:44
preprocessor = preprocessor .. (("write(%q)"):format(line:sub(1, - 2)) .. "\
") -- candran.can:46
end -- candran.can:46
end -- candran.can:46
end -- candran.can:46
preprocessor = preprocessor .. ("return output") -- candran.can:50
local env = util["merge"](_G, options) -- candran.can:53
env["candran"] = candran -- candran.can:55
env["output"] = "" -- candran.can:57
env["import"] = function(modpath, margs) -- candran.can:64
if margs == nil then margs = {} end -- candran.can:64
local filepath = assert(util["search"](modpath), "No module named \"" .. modpath .. "\"") -- candran.can:65
local f = io["open"](filepath) -- candran.can:68
if not f then -- candran.can:69
error("Can't open the module file to import") -- candran.can:69
end -- candran.can:69
margs = util["merge"](options, { -- candran.can:71
["chunkname"] = filepath, -- candran.can:71
["loadLocal"] = true, -- candran.can:71
["loadPackage"] = true -- candran.can:71
}, margs) -- candran.can:71
local modcontent = candran["preprocess"](f:read("*a"), margs) -- candran.can:72
f:close() -- candran.can:73
local modname = modpath:match("[^%.]+$") -- candran.can:76
env["write"]("-- MODULE " .. modpath .. " --\
" .. "local function _()\
" .. modcontent .. "\
" .. "end\
" .. (margs["loadLocal"] and ("local %s = _() or %s\
"):format(modname, modname) or "") .. (margs["loadPackage"] and ("package.loaded[%q] = %s or true\
"):format(modpath, margs["loadLocal"] and modname or "_()") or "") .. "-- END OF MODULE " .. modpath .. " --") -- candran.can:85
end -- candran.can:85
env["include"] = function(file) -- candran.can:90
local f = io["open"](file) -- candran.can:91
if not f then -- candran.can:92
error("Can't open the file " .. file .. " to include") -- candran.can:92
end -- candran.can:92
env["write"](f:read("*a")) -- candran.can:93
f:close() -- candran.can:94
end -- candran.can:94
env["write"] = function(...) -- candran.can:98
env["output"] = env["output"] .. (table["concat"]({ ... }, "\9") .. "\
") -- candran.can:99
end -- candran.can:99
env["placeholder"] = function(name) -- candran.can:103
if env[name] then -- candran.can:104
env["write"](env[name]) -- candran.can:105
end -- candran.can:105
end -- candran.can:105
local preprocess, err = util["load"](candran["compile"](preprocessor, args), "candran preprocessor", env) -- candran.can:110
if not preprocess then -- candran.can:111
error("Error while creating Candran preprocessor: " .. err) -- candran.can:111
end -- candran.can:111
local success, output = pcall(preprocess) -- candran.can:114
if not success then -- candran.can:115
error("Error while preprocessing file: " .. output) -- candran.can:115
end -- candran.can:115
return output -- candran.can:117
end -- candran.can:117
candran["compile"] = function(input, options) -- candran.can:124
if options == nil then options = {} end -- candran.can:124
options = util["merge"](candran["default"], options) -- candran.can:125
local ast, errmsg = parser["parse"](input, options["chunkname"]) -- candran.can:127
if not ast then -- candran.can:129
error("Compiler: error while parsing file: " .. errmsg) -- candran.can:130
end -- candran.can:130
return require("compiler." .. options["target"])(input, ast, options) -- candran.can:133
end -- candran.can:133
candran["make"] = function(code, options) -- candran.can:140
return candran["compile"](candran["preprocess"](code, options), options) -- candran.can:141
end -- candran.can:141
local errorRewritingActive = false -- candran.can:144
local codeCache = {} -- candran.can:145
candran["loadfile"] = function(filepath, env, options) -- candran.can:148
local f, err = io["open"](filepath) -- candran.can:149
if not f then -- candran.can:150
error("can't open the file: " .. err) -- candran.can:150
end -- candran.can:150
local content = f:read("*a") -- candran.can:151
f:close() -- candran.can:152
return candran["load"](content, filepath, env, options) -- candran.can:154
end -- candran.can:154
candran["load"] = function(chunk, chunkname, env, options) -- candran.can:159
if options == nil then options = {} end -- candran.can:159
options = util["merge"]({ ["chunkname"] = tostring(chunkname or chunk) }, options) -- candran.can:160
codeCache[options["chunkname"]] = candran["make"](chunk, options) -- candran.can:162
local f, err = util["load"](codeCache[options["chunkname"]], options["chunkname"], env) -- candran.can:163
if f == nil then -- candran.can:168
return f, "Candran unexpectedly generated invalid code: " .. err -- candran.can:169
end -- candran.can:169
if options["rewriteErrors"] == false then -- candran.can:172
return f -- candran.can:173
else -- candran.can:173
return function(...) -- candran.can:175
local params = { ... } -- candran.can:176
if not errorRewritingActive then -- candran.can:177
errorRewritingActive = true -- candran.can:178
local t = { xpcall(function() -- candran.can:179
return f(unpack(params)) -- candran.can:179
end, candran["messageHandler"]) } -- candran.can:179
errorRewritingActive = false -- candran.can:180
if t[1] == false then -- candran.can:181
error(t[2], 0) -- candran.can:182
end -- candran.can:182
return unpack(t, 2) -- candran.can:184
else -- candran.can:184
return f(...) -- candran.can:186
end -- candran.can:186
end -- candran.can:186
end -- candran.can:186
end -- candran.can:186
candran["dofile"] = function(filename, options) -- candran.can:194
local f, err = candran["loadfile"](filename, nil, options) -- candran.can:195
if f == nil then -- candran.can:197
error(err) -- candran.can:198
else -- candran.can:198
return f() -- candran.can:200
end -- candran.can:200
end -- candran.can:200
candran["messageHandler"] = function(message) -- candran.can:206
return debug["traceback"](message, 2):gsub("(\
?%s*)([^\
]-)%:(%d+)%:", function(indentation, source, line) -- candran.can:207
line = tonumber(line) -- candran.can:208
local originalFile -- candran.can:210
local strName = source:match("%[string \"(.-)\"%]") -- candran.can:211
if strName then -- candran.can:212
if codeCache[strName] then -- candran.can:213
originalFile = codeCache[strName] -- candran.can:214
source = strName -- candran.can:215
end -- candran.can:215
else -- candran.can:215
local fi = io["open"](source, "r") -- candran.can:218
if fi then -- candran.can:219
originalFile = fi:read("*a") -- candran.can:220
end -- candran.can:220
fi:close() -- candran.can:222
end -- candran.can:222
if originalFile then -- candran.can:225
local i = 0 -- candran.can:226
for l in originalFile:gmatch("([^\
]*)") do -- candran.can:227
i = i + 1 -- candran.can:228
if i == line then -- candran.can:229
local extSource, lineMap = l:match("%-%- (.-)%:(%d+)$") -- candran.can:230
if lineMap then -- candran.can:231
if extSource ~= source then -- candran.can:232
return indentation .. extSource .. ":" .. lineMap .. "(" .. extSource .. ":" .. line .. "):" -- candran.can:233
else -- candran.can:233
return indentation .. extSource .. ":" .. lineMap .. "(" .. line .. "):" -- candran.can:235
end -- candran.can:235
end -- candran.can:235
break -- candran.can:238
end -- candran.can:238
end -- candran.can:238
end -- candran.can:238
end) -- candran.can:238
end -- candran.can:238
candran["searcher"] = function(modpath) -- candran.can:246
local filepath = util["search"](modpath, { "can" }) -- candran.can:247
if not filepath then -- candran.can:248
return "\
\9no candran file in package.path" -- candran.can:249
end -- candran.can:249
return candran["loadfile"](filepath) -- candran.can:251
end -- candran.can:251
candran["setup"] = function() -- candran.can:255
if _VERSION == "Lua 5.1" then -- candran.can:256
table["insert"](package["loaders"], 2, candran["searcher"]) -- candran.can:257
else -- candran.can:257
table["insert"](package["searchers"], 2, candran["searcher"]) -- candran.can:259
end -- candran.can:259
return candran -- candran.can:261
end -- candran.can:261
return candran -- candran.can:264