--- a/scansion/parser.lua Fri Dec 28 11:38:56 2018 +0000 +++ b/scansion/parser.lua Fri Dec 28 16:00:01 2018 -0500 @@ -9,13 +9,17 @@ local last_object; local annotation; + local function parse_error(text) + return nil, text .. " (line " .. line_number .. ")"; + end + for line in data:gmatch("([^\r\n]*)\r?\n") do line_number = line_number + 1; if line:sub(1,1) == "[" then local obj_type, name = line:match("^%[(%a+)%] (.+)$"); if parsed.objects[name] then - return nil, "Duplicate definition of "..name.." on line "..line_number; + return parse_error("Duplicate definition of '"..name.."'"); end parsed.objects[name] = { type = obj_type:lower(); @@ -25,7 +29,7 @@ last_object = parsed.objects[name]; elseif line:match("^%s+[%a_]+:.+$") then if not last_object then - return nil, "Line "..line_number.. "unexpected outside of an object definition"; + return parse_error("Unexpected outside of an object definition"); end local k, v = line:match("^%s+([%a_]+):%s*(.+)$") last_object[k] = v; @@ -69,10 +73,10 @@ last_object = nil; local name, action, extra = line:match("^([^:]+) (%a+):?%s?(.*)$"); if not name then - return nil, "Unable to parse action on line "..line_number; + return parse_error("Unable to parse action"); end if not parsed.objects[name] then - return nil, "The object '"..name.."' used on line "..line_number.." was not declared"; + return parse_error("The object '"..name.."' was not declared"); end table.insert(parsed.actions, { object_name = name;