aboutsummaryrefslogtreecommitdiff
path: root/nomsu.moon
diff options
context:
space:
mode:
authorBruce Hill <bitbucket@bruce-hill.com>2018-05-30 13:07:08 -0700
committerBruce Hill <bitbucket@bruce-hill.com>2018-05-30 13:07:15 -0700
commitf9229c5e91ee505cefd48935c84d82f607110284 (patch)
treec771485f471bbe7ff96fed1111473771109c202d /nomsu.moon
parente5d9879a7972fa09e8c9e8f88642bbcc27e0c5a1 (diff)
Better parse error reporting.
Diffstat (limited to 'nomsu.moon')
-rwxr-xr-xnomsu.moon18
1 files changed, 12 insertions, 6 deletions
diff --git a/nomsu.moon b/nomsu.moon
index c162246..34e9c06 100755
--- a/nomsu.moon
+++ b/nomsu.moon
@@ -164,6 +164,9 @@ NOMSU_DEFS = with {}
seen_errors = userdata.errors
if seen_errors[start_pos]
return true
+ if utils.size(seen_errors) >= 10
+ seen_errors[start_pos+1] = colored.bright colored.yellow colored.onred "Too many errors, canceling parsing..."
+ return #src
err_pos = start_pos
--if src\sub(err_pos,err_pos)\match("[\r\n]")
-- err_pos += #src\match("[ \t\n\r]*", err_pos)
@@ -173,11 +176,13 @@ NOMSU_DEFS = with {}
prev_line = line_no == 1 and "" or src\sub(LINE_STARTS[src][line_no-1] or 1, LINE_STARTS[src][line_no]-2)
err_line = src\sub(LINE_STARTS[src][line_no], (LINE_STARTS[src][line_no+1] or 0)-2)
next_line = src\sub(LINE_STARTS[src][line_no+1] or -1, (LINE_STARTS[src][line_no+2] or 0)-2)
- pointer = ("-")\rep(err_pos-LINE_STARTS[src][line_no]) .. "^"
- err_msg = (err_msg or "Parse error").." at #{userdata.source.filename}:#{line_no}:\n"
- if #prev_line > 0 then err_msg ..= "\n"..prev_line
- err_msg ..= "\n#{err_line}\n#{pointer}"
- if #next_line > 0 then err_msg ..= "\n"..next_line
+ i = err_pos-LINE_STARTS[src][line_no]
+ pointer = ("-")\rep(i) .. "^"
+ err_msg = colored.bright colored.yellow colored.onred (err_msg or "Parse error").." at #{userdata.source.filename}:#{line_no}:"
+ if #prev_line > 0 then err_msg ..= "\n"..colored.dim(prev_line)
+ err_line = colored.white(err_line\sub(1, i))..colored.bright(colored.red(err_line\sub(i+1,i+1)))..colored.dim(err_line\sub(i+2,-1))
+ err_msg ..= "\n#{err_line}\n#{colored.red pointer}"
+ if #next_line > 0 then err_msg ..= "\n"..colored.dim(next_line)
--error(err_msg)
seen_errors[start_pos] = err_msg
return true
@@ -329,7 +334,8 @@ class NomsuCompiler
keys = utils.keys(userdata.errors)
table.sort(keys)
errors = [userdata.errors[k] for k in *keys]
- error(concat(errors, "\n\n"), 0)
+ io.stderr\write(concat(errors, "\n\n").."\n")
+ os.exit!
return tree