Changeset

2948:1ac5ef6ce1a0

Merge 0.7->trunk
author Matthew Wild <mwild1@gmail.com>
date Thu, 25 Mar 2010 19:40:38 +0000
parents 2944:855c0eb80600 (current diff) 2947:ff7f6668b34f (diff)
children 2954:24483a7bf420
files
diffstat 1 files changed, 42 insertions(+), 30 deletions(-) [+]
line wrap: on
line diff
--- a/tools/erlparse.lua	Thu Mar 25 18:53:17 2010 +0000
+++ b/tools/erlparse.lua	Thu Mar 25 19:40:38 2010 +0000
@@ -6,16 +6,22 @@
 -- COPYING file in the source package for more information.
 --
 
-
+local string_byte, string_char = string.byte, string.char;
+local t_concat, t_insert = table.concat, table.insert;
+local type, tonumber, tostring = type, tonumber, tostring;
 
 local file = nil;
 local last = nil;
+local line = 1;
 local function read(expected)
 	local ch;
 	if last then
 		ch = last; last = nil;
-	else ch = file:read(1); end
-	if expected and ch ~= expected then error("expected: "..expected.."; got: "..(ch or "nil")); end
+	else
+		ch = file:read(1);
+		if ch == "\n" then line = line + 1; end
+	end
+	if expected and ch ~= expected then error("expected: "..expected.."; got: "..(ch or "nil").." on line "..line); end
 	return ch;
 end
 local function pushback(ch)
@@ -27,21 +33,21 @@
 	return last;
 end
 
-local _A, _a, _Z, _z, _0, _9, __, _at, _space = string.byte("AaZz09@_ ", 1, 9);
+local _A, _a, _Z, _z, _0, _9, __, _at, _space, _minus = string_byte("AaZz09@_ -", 1, 10);
 local function isLowerAlpha(ch)
-	ch = string.byte(ch) or 0;
+	ch = string_byte(ch) or 0;
 	return (ch >= _a and ch <= _z);
 end
 local function isNumeric(ch)
-	ch = string.byte(ch) or 0;
-	return (ch >= _0 and ch <= _9);
+	ch = string_byte(ch) or 0;
+	return (ch >= _0 and ch <= _9) or ch == _minus;
 end
 local function isAtom(ch)
-	ch = string.byte(ch) or 0;
+	ch = string_byte(ch) or 0;
 	return (ch >= _A and ch <= _Z) or (ch >= _a and ch <= _z) or (ch >= _0 and ch <= _9) or ch == __ or ch == _at;
 end
 local function isSpace(ch)
-	ch = string.byte(ch) or "x";
+	ch = string_byte(ch) or "x";
 	return ch <= _space;
 end
 
@@ -49,79 +55,85 @@
 local function readString()
 	read("\""); -- skip quote
 	local slash = nil;
-	local str = "";
+	local str = {};
 	while true do
 		local ch = read();
 		if slash then
 			slash = slash..ch;
 			if not escapes[slash] then error("Unknown escape sequence: "..slash); end
-			str = str..escapes[slash];
+			str[#str+1] = escapes[slash];
 			slash = nil;
 		elseif ch == "\"" then
 			break;
 		elseif ch == "\\" then
 			slash = ch;
 		else
-			str = str..ch;
+			str[#str+1] = ch;
 		end
 	end
-	return str;
+	return t_concat(str);
 end
 local function readAtom1()
-	local var = read();
+	local var = { read() };
 	while isAtom(peek()) do
-		var = var..read();
+		var[#var+1] = read();
 	end
-	return var;
+	return t_concat(var);
 end
 local function readAtom2()
-	local str = read("'");
+	local str = { read("'") };
 	local slash = nil;
 	while true do
 		local ch = read();
-		str = str..ch;
+		str[#str+1] = ch;
 		if ch == "'" and not slash then break; end
 	end
-	return str;
+	return t_concat(str);
 end
 local function readNumber()
-	local num = read();
+	local num = { read() };
 	while isNumeric(peek()) do
-		num = num..read();
+		num[#num+1] = read();
 	end
-	return tonumber(num);
+	return tonumber(t_concat(num));
 end
 local readItem = nil;
 local function readTuple()
 	local t = {};
-	local s = ""; -- string representation
+	local s = {}; -- string representation
 	read(); -- read {, or [, or <
 	while true do
 		local item = readItem();
 		if not item then break; end
-		if type(item) ~= type(0) or item > 255 then
+		if type(item) ~= "number" or item > 255 then
 			s = nil;
 		elseif s then
-			s = s..string.char(item);
+			s[#s+1] = string_char(item);
 		end
-		table.insert(t, item);
+		t_insert(t, item);
 	end
 	read(); -- read }, or ], or >
-	if s and s ~= "" then
-		return s
+	if s and #s > 0  then
+		return t_concat(s)
 	else
 		return t
 	end;
 end
 local function readBinary()
 	read("<"); -- read <
+	-- Discard PIDs
+	if isNumeric(peek()) then
+		while peek() ~= ">" do read(); end
+		read(">");
+		return {};
+	end
 	local t = readTuple();
 	read(">") -- read >
 	local ch = peek();
-	if type(t) == type("") then
+	if type(t) == "string" then
 		-- binary is a list of integers
 		return t;
-	elseif type(t) == type({}) then
+	elseif type(t) == "table" then
 		if t[1] then
 			-- binary contains string
 			return t[1];