aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruce Hill <bitbucket@bruce-hill.com>2018-07-09 19:22:40 -0700
committerBruce Hill <bitbucket@bruce-hill.com>2018-07-09 19:22:46 -0700
commitde34592dbebfa8882f495694d73f2a8b1e2d0856 (patch)
tree67141893c161e24c4e8722a77f2e2b7d9e73963f
parent0d70332ccf8737fd8cde8eedda034a87184d0486 (diff)
Adding some compatibility stuff.
-rw-r--r--files.lua8
-rw-r--r--files.moon10
-rw-r--r--nomsu.peg4
-rw-r--r--nomsu_compiler.lua8
-rw-r--r--nomsu_compiler.moon3
-rw-r--r--parser.lua5
-rw-r--r--parser.moon5
7 files changed, 34 insertions, 9 deletions
diff --git a/files.lua b/files.lua
index d9686d9..fe1263e 100644
--- a/files.lua
+++ b/files.lua
@@ -59,7 +59,7 @@ if ok then
local raw_file_exists
raw_file_exists = function(filename)
local mode = lfs.attributes(filename, 'mode')
- if mode == 'file' or mode == 'directory' then
+ if mode == 'file' or mode == 'directory' or mode == 'link' then
return true
else
return false
@@ -80,15 +80,15 @@ if ok then
end
local browse
browse = function(filename)
- local file_type = lfs.attributes(filename, 'mode')
+ local file_type, err = lfs.attributes(filename, 'mode')
if file_type == 'file' then
if match(filename, "%.nom$") or match(filename, "%.lua$") then
coroutine.yield(filename)
return true
end
- elseif file_type == 'directory' then
+ elseif file_type == 'directory' or file_type == 'link' then
for subfile in lfs.dir(filename) do
- if not (subfile == "." or subfile == ".." or not subfile:match("%.nom$")) then
+ if not (subfile == "." or subfile == "..") then
browse(filename .. "/" .. subfile)
end
end
diff --git a/files.moon b/files.moon
index 708bba1..9ac8ca7 100644
--- a/files.moon
+++ b/files.moon
@@ -37,7 +37,7 @@ ok, lfs = pcall(require, "lfs")
if ok
raw_file_exists = (filename)->
mode = lfs.attributes(filename, 'mode')
- return if mode == 'file' or mode == 'directory' then true else false
+ return if mode == 'file' or mode == 'directory' or mode == 'link' then true else false
files.exists = (path)->
return true if path == 'stdin' or raw_file_exists(path)
if package.nomsupath
@@ -46,20 +46,20 @@ if ok
return false
-- Return 'true' if any files or directories are found, otherwise 'false', and yield every filename
browse = (filename)->
- file_type = lfs.attributes(filename, 'mode')
+ file_type, err = lfs.attributes(filename, 'mode')
if file_type == 'file'
if match(filename, "%.nom$") or match(filename, "%.lua$")
coroutine.yield filename
return true
- elseif file_type == 'directory'
+ elseif file_type == 'directory' or file_type == 'link'
for subfile in lfs.dir(filename)
- -- Only include .nom files unless directly specified
- unless subfile == "." or subfile == ".." or not subfile\match("%.nom$")
+ unless subfile == "." or subfile == ".."
browse(filename.."/"..subfile)
return true
elseif file_type == 'char device'
coroutine.yield(filename)
return true
+
return false
files.walk = (path)->
if match(path, "%.nom$") or match(path, "%.lua$") or path == 'stdin'
diff --git a/nomsu.peg b/nomsu.peg
index 13caa63..2497e7c 100644
--- a/nomsu.peg
+++ b/nomsu.peg
@@ -1,10 +1,14 @@
-- Nomsu version 1
file:
+ shebang?
(ignored_line %nl)*
(file_chunks / block / action / expression)?
(%nl ignored_line)*
(!. / (({} (.* -> "Parse error") %userdata) => error))
+shebang:
+ ("#!" (!"nomsu" !%nl .)* "nomsu" ((%ws* "-V" %ws* {[0-9]+ ("." [0-9]+)*}) / {''}) %ws* (%nl / !.) %userdata) => Version
+
file_chunks (FileChunks):
{| (block/action/expression) (nodent chunk_delimeter nodent (block/action/expression))+ |}
chunk_delimeter: "~~~" (("~")*)
diff --git a/nomsu_compiler.lua b/nomsu_compiler.lua
index 98f3791..8c01860 100644
--- a/nomsu_compiler.lua
+++ b/nomsu_compiler.lua
@@ -486,6 +486,14 @@ do
return run_lua_fn()
end
NomsuCompiler.compile = function(self, tree)
+ if tree.version then
+ do
+ local upgrade = self['A' .. string.as_lua_id("upgrade 1 from 2")]
+ if upgrade then
+ tree = upgrade(tree, tree.version)
+ end
+ end
+ end
local _exp_0 = tree.type
if "Action" == _exp_0 then
local stub = tree.stub
diff --git a/nomsu_compiler.moon b/nomsu_compiler.moon
index 8e4dee7..1a7a6e7 100644
--- a/nomsu_compiler.moon
+++ b/nomsu_compiler.moon
@@ -321,6 +321,9 @@ with NomsuCompiler
return run_lua_fn!
.compile = (tree)=>
+ if tree.version
+ if upgrade = @['A'..string.as_lua_id("upgrade 1 from 2")]
+ tree = upgrade(tree, tree.version)
switch tree.type
when "Action"
stub = tree.stub
diff --git a/parser.lua b/parser.lua
index 05356b4..2eed78c 100644
--- a/parser.lua
+++ b/parser.lua
@@ -97,6 +97,10 @@ do
userdata.comments[start_pos] = value
return true
end
+ _with_0.Version = function(src, end_pos, version, userdata)
+ userdata.version = version
+ return true
+ end
NOMSU_DEFS = _with_0
end
setmetatable(NOMSU_DEFS, {
@@ -195,6 +199,7 @@ Parser.parse = function(nomsu_code, source)
error("Errors occurred while parsing:\n\n" .. table.concat(errors, "\n\n"), 0)
end
tree.comments = userdata.comments
+ tree.version = userdata.version
return tree
end
return Parser
diff --git a/parser.moon b/parser.moon
index 72f909b..7635cbc 100644
--- a/parser.moon
+++ b/parser.moon
@@ -76,6 +76,10 @@ NOMSU_DEFS = with {}
userdata.comments[start_pos] = value
return true
+ .Version = (src,end_pos,version,userdata)->
+ userdata.version = version
+ return true
+
setmetatable(NOMSU_DEFS, {__index:(key)=>
make_node = (start, value, stop, userdata)->
if userdata.source
@@ -133,6 +137,7 @@ Parser.parse = (nomsu_code, source=nil)->
error("Errors occurred while parsing:\n\n"..table.concat(errors, "\n\n"), 0)
tree.comments = userdata.comments
+ tree.version = userdata.version
return tree
return Parser