mirror of
https://github.com/Reuh/anselme.git
synced 2025-10-27 16:49:31 +00:00
The previous system needed to store of the scope and full AST to build a Resumable object, which means that if persisted, updating the resumable script will have no effect. The new system instead uses an anchor token and does not require any information besides the anchor name.
71 lines
2 KiB
Lua
71 lines
2 KiB
Lua
local escape_cache = {}
|
|
local ansicolors = require("lib.ansicolors")
|
|
|
|
local common = {
|
|
-- escape text to be used as an exact pattern
|
|
escape = function(str)
|
|
if not escape_cache[str] then
|
|
escape_cache[str] = str:gsub("[^%w]", "%%%1")
|
|
end
|
|
return escape_cache[str]
|
|
end,
|
|
--- transform an identifier into a clean version (trim each part)
|
|
trim = function(str)
|
|
return str:match("^%s*(.-)%s*$")
|
|
end,
|
|
fmt = function(str, ...)
|
|
return ansicolors(str):format(...)
|
|
end,
|
|
uuid = function()
|
|
return ("xxxxxxxx-xxxx-4xxx-Nxxx-xxxxxxxxxxxx") -- version 4
|
|
:gsub("N", math.random(0x8, 0xb)) -- variant 1
|
|
:gsub("x", function() return ("%x"):format(math.random(0x0, 0xf)) end) -- random hexadecimal digit
|
|
end,
|
|
-- list of operators and their priority that are handled through regular function calls & can be overloaded/etc. by the user
|
|
regular_operators = {
|
|
prefixes = {
|
|
{ "~", 3.5 }, -- just below _~_ so else-if (~ condition ~ expression) parses as (~ (condition ~ expression))
|
|
{ "!", 11 },
|
|
{ "-", 11 },
|
|
{ "*", 11 },
|
|
{ "%", 11 },
|
|
},
|
|
suffixes = {
|
|
{ ";", 1 },
|
|
{ "!", 12 }
|
|
},
|
|
infixes = {
|
|
{ ";", 1 },
|
|
{ "#", 2 }, { "->", 2 }, { "~>", 2 },
|
|
{ "~", 4 }, { "~?", 4 },
|
|
{ "|>", 5 }, { "&", 5 }, { "|", 5 },
|
|
{ "==", 7 }, { "!=", 7 }, { ">=", 7 }, { "<=", 7 }, { "<", 7 }, { ">", 7 },
|
|
{ "+", 8 }, { "-", 8 },
|
|
{ "//", 9 }, { "/", 9 }, { "*", 9 }, { "%", 9 },
|
|
{ "^", 10 },
|
|
{ "::", 11 },
|
|
{ ".", 14 },
|
|
{ ":", 5 }
|
|
}
|
|
},
|
|
-- list of all operators and their priority
|
|
operator_priority = {
|
|
[";_"] = 1,
|
|
["$_"] = 1,
|
|
["@_"] = 2,
|
|
["_,_"] = 2,
|
|
["_=_"] = 3,
|
|
["_!_"] = 12,
|
|
["_()"] = 13
|
|
-- generated at run-time for regular operators
|
|
}
|
|
}
|
|
|
|
local function store_priority(t, fmt)
|
|
for _, v in ipairs(t) do common.operator_priority[fmt:format(v[1])] = v[2] end
|
|
end
|
|
store_priority(common.regular_operators.infixes, "_%s_")
|
|
store_priority(common.regular_operators.prefixes, "%s_")
|
|
store_priority(common.regular_operators.suffixes, "_%s")
|
|
|
|
return common
|