From 0923b0192c8023a1a8d2304fa318cee08500d57d Mon Sep 17 00:00:00 2001 From: Bruce Hill Date: Thu, 28 Jun 2018 14:12:24 -0700 Subject: Improvements to nomsu codegen (comments are now retained) and some improvements to handling of stdin and fixes for error reporting. --- parser.lua | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) (limited to 'parser.lua') diff --git a/parser.lua b/parser.lua index f4ce450..05356b4 100644 --- a/parser.lua +++ b/parser.lua @@ -8,6 +8,7 @@ do local _obj_0 = string match, sub = _obj_0.match, _obj_0.sub end +local files = require('files') local NomsuCode, LuaCode, Source do local _obj_0 = require("code_obj") @@ -74,12 +75,11 @@ do return #src + 1 end local err_pos = start_pos - local line_no = pos_to_line(src, err_pos) - local line_starts = LINE_STARTS[src] - local prev_line = line_no == 1 and "" or src:sub(line_starts[line_no - 1] or 1, line_starts[line_no] - 2) - local err_line = src:sub(line_starts[line_no], (line_starts[line_no + 1] or 0) - 2) - local next_line = src:sub(line_starts[line_no + 1] or -1, (line_starts[line_no + 2] or 0) - 2) - local i = err_pos - line_starts[line_no] + local line_no = files.get_line_number(src, err_pos) + local prev_line = line_no == 1 and "" or files.get_line(src, line_no - 1) + local err_line = files.get_line(src, line_no) + local next_line = files.get_line(src, line_no + 1) + local i = err_pos - files.get_line_starts(src)[line_no] local pointer = ("-"):rep(i) .. "^" err_msg = colored.bright(colored.yellow(colored.onred((err_msg or "Parse error") .. " at " .. tostring(userdata.source.filename) .. ":" .. tostring(line_no) .. ":"))) if #prev_line > 0 then @@ -93,6 +93,10 @@ do seen_errors[start_pos] = err_msg return true end + _with_0.Comment = function(src, end_pos, start_pos, value, userdata) + userdata.comments[start_pos] = value + return true + end NOMSU_DEFS = _with_0 end setmetatable(NOMSU_DEFS, { @@ -109,9 +113,6 @@ setmetatable(NOMSU_DEFS, { if value.__init then value:__init() end - for i = 1, #value do - assert(value[i]) - end return value end self[key] = make_node @@ -158,14 +159,15 @@ Parser.parse = function(nomsu_code, source) local userdata = { indent = "", errors = { }, - source = source + source = source, + comments = { } } local tree = NOMSU_PATTERN:match(nomsu_code, nil, userdata) if not (tree) then error("In file " .. tostring(colored.blue(tostring(source or ""))) .. " failed to parse:\n" .. tostring(colored.onyellow(colored.black(nomsu_code)))) end if type(tree) == 'number' then - tree = nil + return nil end if next(userdata.errors) then local keys @@ -192,6 +194,7 @@ Parser.parse = function(nomsu_code, source) end error("Errors occurred while parsing:\n\n" .. table.concat(errors, "\n\n"), 0) end + tree.comments = userdata.comments return tree end return Parser -- cgit v1.2.3