From 227b944bad992a8231e0b1577537322c341c068c Mon Sep 17 00:00:00 2001 From: Bruce Hill Date: Fri, 6 Apr 2018 16:45:51 -0700 Subject: [PATCH] Initial working version. --- nomsu.lua | 26 +++++++++++++++++++++++--- nomsu.moon | 22 +++++++++++++++++++--- nomsu.peg | 8 +++++++- 3 files changed, 49 insertions(+), 7 deletions(-) diff --git a/nomsu.lua b/nomsu.lua index 62ff7db..5c4c8d6 100644 --- a/nomsu.lua +++ b/nomsu.lua @@ -69,7 +69,8 @@ local _list_0 = { "Number", "Word", "Var", - "Comment" + "Comment", + "IndexChain" } for _index_0 = 1, #_list_0 do local t = _list_0[_index_0] @@ -185,7 +186,7 @@ setmetatable(NOMSU_DEFS, { make_node = function(start, value, stop) node_id = node_id + 1 if type(value) == 'table' then - error(value) + error("Not a tuple: " .. tostring(repr(value))) end local node = Types[key](node_id, value) lpeg.userdata.tree_metadata[node] = { @@ -966,6 +967,24 @@ do return { expr = repr(tree.value) } + elseif "IndexChain" == _exp_0 then + local items = { } + for i, item in ipairs(tree.value) do + local lua = self:tree_to_lua(item) + if not (lua.expr) then + local line = self:get_line_number(item) + local src = self:get_source_code(item) + error(tostring(line) .. ": Cannot index " .. tostring(colored.yellow(src)) .. ", since it's not an expression.", 0) + end + if i == 1 then + insert(items, "(" .. tostring(lua.expr) .. ")") + else + insert(items, "[ " .. tostring(lua.expr) .. "]") + end + end + return { + expr = concat(items, "") + } elseif "Block" == _exp_0 then local lua_bits = { } local locals = { } @@ -1798,6 +1817,7 @@ if arg and debug.getinfo(2).func ~= require then end return os.exit(false, true) end - xpcall(run, err_hand) + local ldt = require('ldt') + ldt.guard(run) end return NomsuCompiler diff --git a/nomsu.moon b/nomsu.moon index 51e22c0..0de1cee 100755 --- a/nomsu.moon +++ b/nomsu.moon @@ -51,7 +51,7 @@ Types = {} type_tostring = => "#{@name}(#{concat [repr(x) for x in *@], ", "})" Tuple = immutable(nil, {name:"Tuple"}) -for t in *{"File", "Nomsu", "Block", "List", "FunctionCall", "Text", "Dict", "Number", "Word", "Var", "Comment"} +for t in *{"File", "Nomsu", "Block", "List", "FunctionCall", "Text", "Dict", "Number", "Word", "Var", "Comment", "IndexChain"} Types[t] = immutable({"id","value"}, {type:t, name:t, __tostring:type_tostring}) Types.DictEntry = immutable({"key","value"}, {name:"DictEntry"}) Types.is_node = (n)-> @@ -125,7 +125,7 @@ node_id = 0 setmetatable(NOMSU_DEFS, {__index:(key)=> make_node = (start, value, stop)-> node_id = node_id + 1 - if type(value) == 'table' then error(value)-- = Tuple(value) + if type(value) == 'table' then error("Not a tuple: #{repr value}")-- = Tuple(value) node = Types[key](node_id, value) lpeg.userdata.tree_metadata[node] = { :start,:stop,filename:lpeg.userdata.filename,source_code:lpeg.userdata.source_code @@ -680,6 +680,20 @@ class NomsuCompiler --return expr:"nomsu:parse(#{repr @get_source_code(tree.value)}, #{repr @get_line_number(tree.value)}).value[1]" return expr:repr(tree.value) + when "IndexChain" + items = {} + for i, item in ipairs(tree.value) + lua = @tree_to_lua item + unless lua.expr + line = @get_line_number(item) + src = @get_source_code(item) + error "#{line}: Cannot index #{colored.yellow src}, since it's not an expression.", 0 + if i == 1 + insert items, "(#{lua.expr})" + else + insert items, "[ #{lua.expr}]" + return expr:concat(items,"") + when "Block" lua_bits = {} locals = {} @@ -1145,6 +1159,8 @@ if arg and debug.getinfo(2).func != require -- Note: xpcall has a slightly different API in Lua <=5.1 vs. >=5.2, but this works -- for both APIs - xpcall(run, err_hand) + ldt = require 'ldt' + ldt.guard run + --xpcall(run, err_hand) return NomsuCompiler diff --git a/nomsu.peg b/nomsu.peg index bfa9f0c..6f2e9cb 100644 --- a/nomsu.peg +++ b/nomsu.peg @@ -18,9 +18,15 @@ indented_block (Block): inline_nomsu (Nomsu): "\" inline_expression indented_nomsu (Nomsu): "\" expression -inline_expression: +index_chain (IndexChain): + {| noindex_inline_expression ("." ((({} ({|{%operator / (!number plain_word)}|} -> Tuple) {}) -> Text) / noindex_inline_expression))+ |} -> Tuple + +noindex_inline_expression: number / variable / inline_text / inline_list / inline_dict / inline_nomsu / ("(" %ws* (inline_functioncall / inline_expression) %ws* ")") + +inline_expression: + index_chain / noindex_inline_expression indented_expression: indented_text / indented_nomsu / indented_list / indented_dict / indented_block expression: