scansion/parser.lua

changeset 162
f888f236321f
parent 160
28aa762f11c7
child 163
0e2150680a25
--- 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;

mercurial