| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469 | 
							- 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("<p>运行时错误: 数组下标越界</p>");
 
- 			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] + " )<br />";
 
- //			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 + "<br />");
 
- 			}
 
- 			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;
 
- 	}
 
- }
 
- }
 
 
  |