aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruce Hill <bitbucket@bruce-hill.com>2017-09-14 05:14:28 -0700
committerBruce Hill <bitbucket@bruce-hill.com>2017-09-14 05:14:28 -0700
commitbe55821244bfa066e150d33490445a16d31d92b9 (patch)
treef2ad0c155aabf9f1304dabaa1a402bafcef8d4de
parente8dd820b8c0572be9a2a99b4c3409678ac850575 (diff)
Fixed invocation function to canonicalize better and play nice with "'"
-rw-r--r--core.nom14
-rw-r--r--nomsu.lua4
-rwxr-xr-xnomsu.moon4
3 files changed, 11 insertions, 11 deletions
diff --git a/core.nom b/core.nom
index 6e0f2c5..0324a74 100644
--- a/core.nom
+++ b/core.nom
@@ -196,7 +196,7 @@ macro ["%item is in %list", "%list contains %item"]:
".."|(\%list as lua expr\[\%index as lua expr\] ~= nil)
macro ["length of %list", "size of %list", "number of %list"]:
- ".."|#(\list as lua expr\)
+ ".."|#(\%list as lua expr\)
rule "dict %items":
let "dict" = []
@@ -206,8 +206,8 @@ rule "dict %items":
rule "restrict %fn to within %whitelist":
lua block ".."
- |local fns = (type(vars.fn) == 'string') and {vars.fn} or vars.fn
- |local whitelist = (type(vars.whitelist) == 'string') and {vars.whitelist} or vars.whitelist
+ |local fns = compiler:get_invocations(vars.fn)
+ |local whitelist = compiler:get_invocations(vars.whitelist)
|local whiteset = {}
|for _,w in ipairs(whitelist) do
| if not compiler.defs[w] then
@@ -228,8 +228,8 @@ rule "restrict %fn to within %whitelist":
rule "allow %whitelist to use %fn":
lua block ".."
- |local fns = (type(vars.fn) == 'string') and {vars.fn} or vars.fn
- |local whitelist = (type(vars.whitelist) == 'string') and {vars.whitelist} or vars.whitelist
+ |local fns = compiler:get_invocations(vars.fn)
+ |local whitelist = compiler:get_invocations(vars.whitelist)
|for _,w in ipairs(whitelist) do
| if not compiler.defs[w] then
| compiler:error("Undefined function: "..tostring(w))
@@ -252,8 +252,8 @@ rule "allow %whitelist to use %fn":
rule "forbid %blacklist to use %fn":
lua block ".."
- |local fns = (type(vars.fn) == 'string') and {vars.fn} or vars.fn
- |local blacklist = (type(vars.blacklist) == 'string') and {vars.blacklist} or vars.blacklist
+ |local fns = compiler:get_invocations(vars.fn)
+ |local blacklist = compiler:get_invocations(vars.blacklist)
|for _,b in ipairs(blacklist) do
| if not compiler.defs[b] then
| compiler:error("Undefined function: "..tostring(b))
diff --git a/nomsu.lua b/nomsu.lua
index 01fef74..0bd2752 100644
--- a/nomsu.lua
+++ b/nomsu.lua
@@ -208,12 +208,12 @@ do
local arg_names
for _index_0 = 1, #text do
local _text = text[_index_0]
- local invocation = _text:gsub("%%%S+", "%%")
+ local invocation = _text:gsub("'", " '"):gsub("%%%S+", "%%"):gsub("%s+", " ")
local _arg_names
do
local _accum_0 = { }
local _len_0 = 1
- for arg in _text:gmatch("%%(%S+)") do
+ for arg in _text:gmatch("%%(%S[^%s']*)") do
_accum_0[_len_0] = arg
_len_0 = _len_0 + 1
end
diff --git a/nomsu.moon b/nomsu.moon
index 5bd2dfa..5626b59 100755
--- a/nomsu.moon
+++ b/nomsu.moon
@@ -138,8 +138,8 @@ class NomsuCompiler
invocations = {}
local arg_names
for _text in *text
- invocation = _text\gsub("%%%S+","%%")
- _arg_names = [arg for arg in _text\gmatch("%%(%S+)")]
+ invocation = _text\gsub("'"," '")\gsub("%%%S+","%%")\gsub("%s+"," ")
+ _arg_names = [arg for arg in _text\gmatch("%%(%S[^%s']*)")]
table.insert(invocations, invocation)
if arg_names
if not utils.equivalent(utils.set(arg_names), utils.set(_arg_names))