var Interpreter = {
	/* 运行时的符号表组织 */
	tableList :new Array(), // 符号总表
	table :new SymTable(), // 当前的符号分表
	mainTable :new SymTable(), // 最底层的符号分表
	item :new SymItem(), // 当前的符号表项
	nonexistence :new SymItem("nonexistence", SymType_INT, 0), // 当使用到了未定义的变量时,item指向的对象
	needConsole :false,
	tempVars :new Array(),
	init : function()// //////////////////////////
	{
		/* 初始化系统变量表 */
		Interpreter.tempVars = new Array();
		Interpreter.tempVars.push(new SymItem("@result", SymType_REAL, 0.0));
		Interpreter.tempVars.push(new SymItem("@index", SymType_REAL, 0.0));
		/* 系统变量最大个数为 500 */
		for ( var i = 2; i <= 500; i++) {
			Interpreter.tempVars.push(new SymItem("@temp" + i, SymType_REAL,
					0.0));
		}
	},
	/* 在总表中查询某变量,如果找到返回该符号表项,否则返回null */
	LookUp : function(s) {
		if (s.toString().indexOf("@") != -1) {
			return Interpreter.LookUpTempVar(s);
		}
		for ( var i = Interpreter.tableList.length - 1; i >= 0; i--) {
			if (Interpreter.tableList[i].position(s) != null) {
				return Interpreter.tableList[i].position(s);
			}
		}
		if (s.toString().indexOf("[") != -1) // 发生数组越界
		{
			console("
运行时错误: 数组下标越界
");
			return Interpreter.nonexistence;
		}
		return null;
	},
	/* 在内置变量表中查找内置变量 */
	LookUpTempVar : function(s) {
		if (s.toString().indexOf("@") == 0) {
			if (s == "@result") {
				return Interpreter.tempVars[0];
			} else if (s == "@index") {
				return Interpreter.tempVars[1];
			} else {
				var i;
				i = parseInt(s.substring(5));
				return Interpreter.tempVars[i];
			}
		} else {
			// 临时变量为下标的数组元素
			if (s.toString().indexOf("@result") != -1) {
				return Interpreter.LookUp(s.replace("@result",
						(parseInt(Interpreter.tempVars[0].Val))));
			} else {
				return Interpreter.LookUp(s.replace("@index",
						(parseInt(Interpreter.tempVars[1].Val))));
			}
		}
	},
	/* 打印中间代码 */
//	Output : function(intercode) {
//		var i = 0;
//		var output = "";
//		while (i < intercode.length) {
//			output += "( " + intercode[i] + " , " + intercode[i + 1] + " , "
//					+ intercode[i + 2] + " , " + intercode[i + 3] + " )
";
//			i += 4;
//		}
//		return output;
//	},
	run : function(intercode) {
		Interpreter.init();
		Interpreter.tableList = new Array(); // 创建符号总表
	Interpreter.mainTable = new SymTable(); // 创建最底层的符号分表
	Interpreter.table = Interpreter.mainTable; // 当前符号分表初始为最底层的符号分表
	Interpreter.tableList.push(Interpreter.table); // 将最底层的符号分表加入符号总表
	var i = 0; // intercode的下标
	var num1 = 0, num2 = 0;
	var tempIndex;
	var isReal;
	ifflag = new Array(100); // 存放if语句中的条件表达式的值,下标对应着层数
	whileflag = new Array(100); // 存放while语句中的条件表达式的值,下标对应着层数
	for ( var m = 0; m < 100; m++) // 初始化两个数组
	{
		ifflag[m] = 0;
		whileflag[m] = 0;
	}
	while (i < intercode.length) {
		switch (intercode[i]) {
		case "new":
			if (intercode[i + 1] == "@item") {
				Interpreter.item = new SymItem();
				Interpreter.table.SymItemList.push(Interpreter.item);
			}
			if (intercode[i + 1] == "@table") {
				Interpreter.table = new SymTable();
				Interpreter.tableList.push(Interpreter.table);
			}
			break;
		case "remove":
			Interpreter.tableList.pop();
			Interpreter.table = Interpreter.tableList[Interpreter.tableList.length - 1];
			break;
		case "read":
			var input = prompt("请输入");
			if (intercode[i + 1] == "int")
				Interpreter.LookUp(intercode[i + 3]).Val = parseInt(input);
			else
				Interpreter.LookUp(intercode[i + 3]).Val = parseFloat(input);
			break;
		case "write":
			var tempOutput = Interpreter.LookUp(intercode[i + 1]);
			if (tempOutput.Name != "nonexistence") {
				outputresult(tempOutput.Val + "
");
			}
			break;
		case "assign":
			switch (intercode[i + 1]) {
			case "name":
				Interpreter.item.Name = intercode[i + 2];
				break;
			case "type":
				if (intercode[i + 2] == "INT")
					Interpreter.item.Type = SymType_INT;
				else if (intercode[i + 2] == "REAL")
					Interpreter.item.Type = SymType_REAL;
				break;
			case "int":
				Interpreter.LookUp(intercode[i + 3]).Val = parseInt(Interpreter
						.LookUp("@result").Val);
				break;
			case "real":
				Interpreter.LookUp(intercode[i + 3]).Val = parseFloat(Interpreter
						.LookUp("@result").Val);
				break;
			}
			break;
		case "judge":
			var jlevel;
			switch (intercode[i + 1]) {
			case "if":
				jlevel = parseInt(intercode[i + 3]);
				ifflag[jlevel] = parseInt(Interpreter.LookUp("@result").Val);
				if (ifflag[jlevel] != 1) // 条件为假则跳转至假出口
				{
					i += 4;
					while (true) {
						if (intercode[i] == "mark" && intercode[i + 1] == "if"
								&& parseInt(intercode[i + 3]) == jlevel)
							break;
						i += 4;
					}
				}
				// 条件为真则继续
				break;
			case "while":
				jlevel = parseInt(intercode[i + 3]);
				whileflag[jlevel] = parseInt(Interpreter.LookUp("@result").Val);
				if (whileflag[jlevel] != 1) // 条件为假则跳转至假出口
				{
					i += 4;
					while (true) {
						if (intercode[i] == "mark"
								&& intercode[i + 1] == "while"
								&& parseInt(intercode[i + 3]) == jlevel)
							break;
						i += 4;
					}
				}
				// 条件为真则继续
				break;
			}
			break;
		case "mark":
			var mlevel;
			switch (intercode[i + 1]) {
			case "if":
				mlevel = parseInt(intercode[i + 3]);
				if (ifflag[mlevel] == 1) // 条件为真则跳转至假出口
				{
					while (true) {
						if (intercode[i] == "mark"
								&& intercode[i + 1] == "else"
								&& parseInt(intercode[i + 3]) == mlevel)
							break;
						i += 4;
					}
				}
				// 条件为假则继续
				break;
			case "else": // 无论条件真假都继续
				break;
			case "while":
				if (intercode[i + 2] == "end") {
					mlevel = parseInt(intercode[i + 3]);
					if (whileflag[mlevel] == 1) // 条件为真则跳转至while语句开头
					{
						while (true) {
							i -= 4;
							if (intercode[i] == "mark"
									&& intercode[i + 1] == "while"
									&& intercode[i + 2] == "begin"
									&& parseInt(intercode[i + 3]) == mlevel) {
								break;
							}
						}
					}
					// 条件为假则跳出继续
				}
				break;
			}
			break;
		// 表达式运算
		case "add":
			isReal = false;
			// 取第一个运算数
			if (ExprCal
					.IsDigit(ExprCal.IsDigit(intercode[i + 1].toString()[0]))) { // 常量
				if (intercode[i + 1].toString().indexOf(".") != -1) {
					isReal = true;
				}
				num1 = parseFloat(intercode[i + 1]);
			} else { // 变量
				num1 = parseFloat(Interpreter.LookUp(intercode[i + 1]).Val);
			}
			// 取第二个运算数
			if (ExprCal.IsDigit(intercode[i + 2].toString()[0])) { // 常量
				if (intercode[i + 2].toString().indexOf(".") != -1) {
					isReal = true;
				}
				num2 = parseFloat(intercode[i + 2]);
			} else { // 变量
				num2 = parseFloat(Interpreter.LookUp(intercode[i + 2]).Val);
			}
			tempIndex = parseInt(intercode[i + 3].substring(5));
			if (isReal) {
				Interpreter.tempVars[tempIndex].Type = SymType_REAL;
				Interpreter.tempVars[tempIndex].Val = num1 + num2;
			} else {
				Interpreter.tempVars[tempIndex].Type = SymType_INT;
				Interpreter.tempVars[tempIndex].Val = parseInt((num1 + num2));
			}
			break;
		case "sub":
			isReal = false;
			// 取第一个运算数
			if (ExprCal.IsDigit(intercode[i + 1].toString()[0])) { // 常量
				if (intercode[i + 1].toString().indexOf(".") != -1) {
					isReal = true;
				}
				num1 = parseFloat(intercode[i + 1]);
			} else { // 变量
				num1 = parseFloat(Interpreter.LookUp(intercode[i + 1]).Val);
			}
			// 取第二个运算数
			if (ExprCal.IsDigit(intercode[i + 2].toString()[0])) { // 常量
				if (intercode[i + 2].toString().indexOf(".") != -1) {
					isReal = true;
				}
				num2 = parseFloat(intercode[i + 2]);
			} else { // 变量
				num2 = parseFloat(Interpreter.LookUp(intercode[i + 2]).Val);
			}
			tempIndex = parseInt(intercode[i + 3].substring(5));
			if (isReal) {
				Interpreter.tempVars[tempIndex].Type = SymType_REAL;
				Interpreter.tempVars[tempIndex].Val = num1 - num2;
			} else {
				Interpreter.tempVars[tempIndex].Type = SymType_INT;
				Interpreter.tempVars[tempIndex].Val = parseInt((num1 - num2));
			}
			break;
		case "mul":
			isReal = false;
			// 取第一个运算数
			if (ExprCal.IsDigit(intercode[i + 1].toString()[0])) { // 常量
				if (intercode[i + 1].toString().indexOf(".") != -1) {
					isReal = true;
				}
				num1 = parseFloat(intercode[i + 1]);
			} else { // 变量
				num1 = parseFloat(Interpreter.LookUp(intercode[i + 1]).Val);
			}
			// 取第二个运算数
			if (ExprCal.IsDigit(intercode[i + 2].toString()[0])) { // 常量
				if (intercode[i + 2].toString().indexOf(".") != -1) {
					isReal = true;
				}
				num2 = parseFloat(intercode[i + 2]);
			} else { // 变量
				num2 = parseFloat(Interpreter.LookUp(intercode[i + 2]).Val);
			}
			tempIndex = parseInt(intercode[i + 3].substring(5));
			if (isReal) {
				Interpreter.tempVars[tempIndex].Type = SymType_REAL;
				Interpreter.tempVars[tempIndex].Val = num1 * num2;
			} else {
				Interpreter.tempVars[tempIndex].Type = SymType_INT;
				Interpreter.tempVars[tempIndex].Val = parseInt((num1 * num2));
			}
			break;
		case "div":
			isReal = false;
			// 取第一个运算数
			if (ExprCal.IsDigit(intercode[i + 1].toString()[0])) { // 常量
				if (intercode[i + 1].toString().indexOf(".") != -1) {
					isReal = true;
				}
				num1 = parseFloat(intercode[i + 1]);
			} else { // 变量
				num1 = parseFloat(Interpreter.LookUp(intercode[i + 1]).Val);
			}
			// 取第二个运算数
			if (ExprCal.IsDigit(intercode[i + 2].toString()[0])) { // 常量
				if (intercode[i + 2].toString().indexOf(".") != -1) {
					isReal = true;
				}
				num2 = parseFloat(intercode[i + 2]);
			} else { // 变量
				num2 = parseFloat(Interpreter.LookUp(intercode[i + 2]).Val);
			}
			tempIndex = parseInt(intercode[i + 3].substring(5));
			if (!isReal && (parseInt(num1) % parseInt(num2) == 0)) {
				Interpreter.tempVars[tempIndex].Type = SymType_INT;
				Interpreter.tempVars[tempIndex].Val = parseInt((num1 / num2));
			} else {
				Interpreter.tempVars[tempIndex].Type = SymType_REAL;
				Interpreter.tempVars[tempIndex].Val = num1 / num2;
			}
			break;
		case "lt":
			// 取第一个运算数
			if (ExprCal.IsDigit(intercode[i + 1].toString()[0])) { // 常量
				if (intercode[i + 1].toString().indexOf(".") != -1) {
					isReal = true;
				}
				num1 = parseFloat(intercode[i + 1]);
			} else { // 变量
				num1 = parseFloat(Interpreter.LookUp(intercode[i + 1]).Val);
			}
			// 取第二个运算数
			if (ExprCal.IsDigit(intercode[i + 2].toString()[0])) { // 常量
				if (intercode[i + 2].toString().indexOf(".") != -1)
					isReal = true;
				num2 = parseFloat(intercode[i + 2]);
			} else { // 变量
				num2 = parseFloat(Interpreter.LookUp(intercode[i + 2]).Val);
			}
			tempIndex = parseInt(intercode[i + 3].substring(5));
			Interpreter.tempVars[tempIndex].Type = SymType_INT;
			if (num1 < num2) {
				Interpreter.tempVars[tempIndex].Val = 1;
			} else {
				Interpreter.tempVars[tempIndex].Val = 0;
			}
			break;
		case "gt":
			// 取第一个运算数
			if (ExprCal.IsDigit(intercode[i + 1].toString()[0])) { // 常量
				if (intercode[i + 1].toString().indexOf(".") != -1) {
					isReal = true;
				}
				num1 = parseFloat(intercode[i + 1]);
			} else { // 变量
				num1 = parseFloat(Interpreter.LookUp(intercode[i + 1]).Val);
			}
			// 取第二个运算数
			if (ExprCal.IsDigit(intercode[i + 2].toString()[0])) { // 常量
				if (intercode[i + 2].toString().indexOf(".") != -1) {
					isReal = true;
				}
				num2 = parseFloat(intercode[i + 2]);
			} else { // 变量
				num2 = parseFloat(Interpreter.LookUp(intercode[i + 2]).Val);
			}
			tempIndex = parseInt(intercode[i + 3].substring(5));
			Interpreter.tempVars[tempIndex].Type = SymType_INT;
			if (num1 > num2) {
				Interpreter.tempVars[tempIndex].Val = 1;
			} else {
				Interpreter.tempVars[tempIndex].Val = 0;
			}
			break;
		case "eq":
			// 取第一个运算数
			if (ExprCal.IsDigit(intercode[i + 1].toString()[0])) { // 常量
				if (intercode[i + 1].toString().indexOf(".") != -1) {
					isReal = true;
				}
				num1 = parseFloat(intercode[i + 1]);
			} else { // 变量
				num1 = parseFloat(Interpreter.LookUp(intercode[i + 1]).Val);
			}
			// 取第二个运算数
			if (ExprCal.IsDigit(intercode[i + 2].toString()[0])) { // 常量
				if (intercode[i + 2].toString().indexOf(".") != -1) {
					isReal = true;
				}
				num2 = parseFloat(intercode[i + 2]);
			} else { // 变量
				num2 = parseFloat(Interpreter.LookUp(intercode[i + 2]).Val);
			}
			tempIndex = parseInt(intercode[i + 3].substring(5));
			Interpreter.tempVars[tempIndex].Type = SymType_INT;
			if (num1 == num2) {
				Interpreter.tempVars[tempIndex].Val = 1;
			} else {
				Interpreter.tempVars[tempIndex].Val = 0;
			}
			break;
		case "ne":
			// 取第一个运算数
			if (ExprCal.IsDigit(intercode[i + 1].toString()[0])) { // 常量
				if (intercode[i + 1].toString().indexOf(".") != -1) {
					isReal = true;
				}
				num1 = parseFloat(intercode[i + 1]);
			} else { // 变量
				num1 = parseFloat(Interpreter.LookUp(intercode[i + 1]).Val);
			}
			// 取第二个运算数
			if (ExprCal.IsDigit(intercode[i + 2].toString()[0])) { // 常量
				if (intercode[i + 2].toString().indexOf(".") != -1) {
					isReal = true;
				}
				num2 = parseFloat(intercode[i + 2]);
			} else { // 变量
				num2 = parseFloat(Interpreter.LookUp(intercode[i + 2]).Val);
			}
			tempIndex = parseInt(intercode[i + 3].substring(5));
			Interpreter.tempVars[tempIndex].Type = SymType_INT;
			if (num1 != num2) {
				Interpreter.tempVars[tempIndex].Val = 1;
			} else {
				Interpreter.tempVars[tempIndex].Val = 0;
			}
			break;
		case "load":
			if (ExprCal.IsDigit(intercode[i + 2].toString()[0])) { // 常量
				Interpreter.item = Interpreter.LookUp(intercode[i + 3]);
				if (intercode[i + 2].toString().indexOf(".") != -1) {
					Interpreter.tempVars[0].Val = parseFloat(intercode[i + 2]);
				} else {
					Interpreter.tempVars[0].Val = parseInt(intercode[i + 2]);
				}
			} else { // 变量
				Interpreter.item = Interpreter.LookUp(intercode[i + 2]);
				Interpreter.LookUp(intercode[i + 3]).Val = Interpreter.item.Val;
			}
			break;
		}
		i += 4;
	}
}
}