scansion/parser.lua

Sat, 05 Sep 2015 15:22:21 +0100

author
Matthew Wild <mwild1@gmail.com>
date
Sat, 05 Sep 2015 15:22:21 +0100
changeset 2
60022b6e0874
parent 0
2e31b584f8d9
child 19
af311b9827e2
permissions
-rw-r--r--

parser: Swallow spaces before parameter values

local function parse(data)
	local parsed = {
		objects = {};
		actions = {};
	};
	
	local line_number = 0;
	local last_object;
	
	for line in data:gmatch("([^\r\n]+)\r?\n") do
		line_number = line_number + 1;
		print(line_number, line);
		if line:sub(1,1) == "[" then
			local obj_type, name, extra = line:match("^%[(%a+)%] (.+)$");
			
			if parsed.objects[name] then
				return nil, "Duplicate definition of "..name.." on line "..line_number;
			end
			parsed.objects[name] = {
				type = obj_type:lower();
				name = name;
				defined_line = line_number;
			};
			last_object = parsed.objects[name];
			print(("%q"):format(obj_type))
		elseif line:match("^%s+%a+:.+$") then
			if not last_object then
				return nil, "Line "..line_number.. "unexpected outside of an object definition";
			end
			local k, v = line:match("^%s+(%a+):%s*(.+)$")
			last_object[k] = v;
		elseif #parsed.actions > 0 and line:sub(1,1) == "\t" then
			table.insert(parsed.actions[#parsed.actions].extra, line:sub(2));
		elseif line:match("^%s*$") or line:match("^#") or line:match("^([/-])%1") then
			-- Blank line or comment
		else
			last_object = nil;
			local name, action, extra = line:match("^(%a+) (%a+):?%s?(.*)$");
			if not name then
				return nil, "Unable to parse action on line "..line_number;
			end
			if not parsed.objects[name] then
				return nil, "The object '"..name.."' used on line "..line_number.." was not declared";
			end
			table.insert(parsed.actions, {
				object_name = name;
				action = action:lower();
				extra = {#extra>0 and extra or nil};
			});
		end
	end
	return parsed;
end

return {
	parse = parse;
};

mercurial