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