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; } } }