From 9564492cf1b97385698bd9a745d17e9cb474319f Mon Sep 17 00:00:00 2001 From: Bruce Hill Date: Mon, 5 Mar 2018 18:46:13 -0800 Subject: [PATCH] More support for optional metadata and better Tuple support. --- nomsu.lua | 5 ++--- nomsu.moon | 31 +++++++++++++++++-------------- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/nomsu.lua b/nomsu.lua index 7e3bfe9..b15e90b 100644 --- a/nomsu.lua +++ b/nomsu.lua @@ -211,14 +211,13 @@ setmetatable(NOMSU_DEFS, { if type(value) == 'table' then error(value) end - lpeg.userdata.tree_metadata[node_id] = { + local node = Types[key](node_id, value) + lpeg.userdata.tree_metadata[node] = { start = start, stop = stop, filename = lpeg.userdata.filename, source_code = lpeg.userdata.source_code } - local node = Types[key](node_id, value) - lpeg.userdata.tree_metadata[node] = lpeg.userdata.tree_metadata[node_id] return node end self[key] = make_node diff --git a/nomsu.moon b/nomsu.moon index 58ffce2..2b384b7 100755 --- a/nomsu.moon +++ b/nomsu.moon @@ -21,9 +21,7 @@ colors = setmetatable({}, {__index:->""}) colored = setmetatable({}, {__index:(_,color)-> ((msg)-> colors[color]..(msg or '')..colors.reset)}) {:insert, :remove, :concat} = table -_Tuple = immutable(nil) -Tuple = (t)-> - return _Tuple(table.unpack(t)) +Tuple = immutable(nil, {name:"Tuple", __tostring:=> "Tuple(#{concat [repr(x) for x in *@], ", "})"}) cached = (fn)-> cache = setmetatable({}, {__mode:"k"}) @@ -59,15 +57,18 @@ lpeg.setmaxstack 10000 -- whoa {:P,:R,:V,:S,:Cg,:C,:Cp,:B,:Cmt} = lpeg Types = {} +type_tostring = => + "#{@name}(#{concat [repr(x) for x in *@], ", "})" for t in *{"File", "Nomsu", "Block", "List", "FunctionCall", "Text", "Dict", "Number", "Word", "Var", "Comment"} - Types[t] = immutable({"id","value"}, {type:t, name:t}) + Types[t] = immutable({"id","value"}, {type:t, name:t, __tostring:type_tostring}) Types.DictEntry = immutable({"key","value"}, {name:"DictEntry"}) Types.is_node = (n)-> type(n) == 'userdata' and n.type NOMSU_DEFS = with {} -- Newline supports either windows-style CR+LF or unix-style LF - .Tuple = Tuple + .Tuple = (values)-> + return Tuple(table.unpack(values)) .DictEntry = (k,v) -> Types.DictEntry(k,v) .nl = P("\r")^-1 * P("\n") .ws = S(" \t") @@ -189,6 +190,8 @@ class NomsuCompiler :table, :assert, :dofile, :loadstring, :type, :select, :debug, :math, :io, :pairs, :load, :ipairs, } + for k,v in pairs(Types) do @environment[k] = v + @environment.Tuple = Tuple @environment.ACTIONS = setmetatable({}, {__index:(key)=> error("Attempt to run undefined action: #{key}", 0) }) @@ -262,7 +265,7 @@ class NomsuCompiler get_line_number: cached (tree)=> metadata = @tree_metadata[tree] unless metadata - error "Failed to find metatdata for tree: #{tree}", 0 + return "" unless @file_metadata[metadata.filename] error "Failed to find file metatdata for file: #{metadata.filename}", 0 line_starts = @file_metadata[metadata.filename].line_starts @@ -682,7 +685,8 @@ class NomsuCompiler return statements:"--"..tree.value\gsub("\n","\n--") when "Nomsu" - return expr:"nomsu:parse(#{repr @get_source_code(tree.value)}, #{repr @get_line_number(tree.value)}).value[1]" + --return expr:"nomsu:parse(#{repr @get_source_code(tree.value)}, #{repr @get_line_number(tree.value)}).value[1]" + return expr:repr(tree.value) when "Block" lua_bits = {} @@ -892,9 +896,7 @@ class NomsuCompiler else new_values[i] = old_value if is_changed - new_tree = getmetatable(tree)(tree.id, Tuple(new_values)) - -- TODO: Maybe generate new metadata? - @tree_metadata[new_tree] = @tree_metadata[tree] + new_tree = getmetatable(tree)(tree.id, Tuple(table.unpack(new_values))) return new_tree when "Dict" @@ -908,9 +910,7 @@ class NomsuCompiler else new_values[i] = e if is_changed - new_tree = getmetatable(tree)(tree.id, Tuple(new_values)) - -- TODO: Maybe generate new metadata? - @tree_metadata[new_tree] = @tree_metadata[tree] + new_tree = getmetatable(tree)(tree.id, Tuple(table.unpack(new_values))) return new_tree when nil -- Raw table, probably from one of the .value of a multi-value tree (e.g. List) error("Invalid tree: #{repr tree}") @@ -1013,7 +1013,10 @@ class NomsuCompiler @define_compile_action "!! code location !!", get_line_no!, -> tree = nomsu.compilestack[#nomsu.compilestack-1] metadata = @tree_metadata[tree] - return expr: repr("#{metadata.filename}:#{metadata.start},#{metadata.stop}") + if metadata + return expr: repr("#{metadata.filename}:#{metadata.start},#{metadata.stop}") + else + return expr: repr("") @define_action "run file %filename", get_line_no!, (_filename)-> return nomsu\run_file(_filename)