aboutsummaryrefslogtreecommitdiff
path: root/parser.lua
diff options
context:
space:
mode:
authorBruce Hill <bitbucket@bruce-hill.com>2018-06-28 14:12:24 -0700
committerBruce Hill <bitbucket@bruce-hill.com>2018-06-28 14:13:01 -0700
commit0923b0192c8023a1a8d2304fa318cee08500d57d (patch)
tree2bc60e2b119cbd4b37b12251ab9e997447bfce01 /parser.lua
parent09d6bad6ac0d4509552d424471bcace649f69c8e (diff)
Improvements to nomsu codegen (comments are now retained) and some
improvements to handling of stdin and fixes for error reporting.
Diffstat (limited to 'parser.lua')
-rw-r--r--parser.lua25
1 files changed, 14 insertions, 11 deletions
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 "<unknown>"))) .. " 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