U.DC.Interpreter.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469
  1. var Interpreter = {
  2. /* 运行时的符号表组织 */
  3. tableList :new Array(), // 符号总表
  4. table :new SymTable(), // 当前的符号分表
  5. mainTable :new SymTable(), // 最底层的符号分表
  6. item :new SymItem(), // 当前的符号表项
  7. nonexistence :new SymItem("nonexistence", SymType_INT, 0), // 当使用到了未定义的变量时,item指向的对象
  8. needConsole :false,
  9. tempVars :new Array(),
  10. init : function()// //////////////////////////
  11. {
  12. /* 初始化系统变量表 */
  13. Interpreter.tempVars = new Array();
  14. Interpreter.tempVars.push(new SymItem("@result", SymType_REAL, 0.0));
  15. Interpreter.tempVars.push(new SymItem("@index", SymType_REAL, 0.0));
  16. /* 系统变量最大个数为 500 */
  17. for ( var i = 2; i <= 500; i++) {
  18. Interpreter.tempVars.push(new SymItem("@temp" + i, SymType_REAL,
  19. 0.0));
  20. }
  21. },
  22. /* 在总表中查询某变量,如果找到返回该符号表项,否则返回null */
  23. LookUp : function(s) {
  24. if (s.toString().indexOf("@") != -1) {
  25. return Interpreter.LookUpTempVar(s);
  26. }
  27. for ( var i = Interpreter.tableList.length - 1; i >= 0; i--) {
  28. if (Interpreter.tableList[i].position(s) != null) {
  29. return Interpreter.tableList[i].position(s);
  30. }
  31. }
  32. if (s.toString().indexOf("[") != -1) // 发生数组越界
  33. {
  34. console("<p>运行时错误: 数组下标越界</p>");
  35. return Interpreter.nonexistence;
  36. }
  37. return null;
  38. },
  39. /* 在内置变量表中查找内置变量 */
  40. LookUpTempVar : function(s) {
  41. if (s.toString().indexOf("@") == 0) {
  42. if (s == "@result") {
  43. return Interpreter.tempVars[0];
  44. } else if (s == "@index") {
  45. return Interpreter.tempVars[1];
  46. } else {
  47. var i;
  48. i = parseInt(s.substring(5));
  49. return Interpreter.tempVars[i];
  50. }
  51. } else {
  52. // 临时变量为下标的数组元素
  53. if (s.toString().indexOf("@result") != -1) {
  54. return Interpreter.LookUp(s.replace("@result",
  55. (parseInt(Interpreter.tempVars[0].Val))));
  56. } else {
  57. return Interpreter.LookUp(s.replace("@index",
  58. (parseInt(Interpreter.tempVars[1].Val))));
  59. }
  60. }
  61. },
  62. /* 打印中间代码 */
  63. // Output : function(intercode) {
  64. // var i = 0;
  65. // var output = "";
  66. // while (i < intercode.length) {
  67. // output += "( " + intercode[i] + " , " + intercode[i + 1] + " , "
  68. // + intercode[i + 2] + " , " + intercode[i + 3] + " )<br />";
  69. // i += 4;
  70. // }
  71. // return output;
  72. // },
  73. run : function(intercode) {
  74. Interpreter.init();
  75. Interpreter.tableList = new Array(); // 创建符号总表
  76. Interpreter.mainTable = new SymTable(); // 创建最底层的符号分表
  77. Interpreter.table = Interpreter.mainTable; // 当前符号分表初始为最底层的符号分表
  78. Interpreter.tableList.push(Interpreter.table); // 将最底层的符号分表加入符号总表
  79. var i = 0; // intercode的下标
  80. var num1 = 0, num2 = 0;
  81. var tempIndex;
  82. var isReal;
  83. ifflag = new Array(100); // 存放if语句中的条件表达式的值,下标对应着层数
  84. whileflag = new Array(100); // 存放while语句中的条件表达式的值,下标对应着层数
  85. for ( var m = 0; m < 100; m++) // 初始化两个数组
  86. {
  87. ifflag[m] = 0;
  88. whileflag[m] = 0;
  89. }
  90. while (i < intercode.length) {
  91. switch (intercode[i]) {
  92. case "new":
  93. if (intercode[i + 1] == "@item") {
  94. Interpreter.item = new SymItem();
  95. Interpreter.table.SymItemList.push(Interpreter.item);
  96. }
  97. if (intercode[i + 1] == "@table") {
  98. Interpreter.table = new SymTable();
  99. Interpreter.tableList.push(Interpreter.table);
  100. }
  101. break;
  102. case "remove":
  103. Interpreter.tableList.pop();
  104. Interpreter.table = Interpreter.tableList[Interpreter.tableList.length - 1];
  105. break;
  106. case "read":
  107. var input = prompt("请输入");
  108. if (intercode[i + 1] == "int")
  109. Interpreter.LookUp(intercode[i + 3]).Val = parseInt(input);
  110. else
  111. Interpreter.LookUp(intercode[i + 3]).Val = parseFloat(input);
  112. break;
  113. case "write":
  114. var tempOutput = Interpreter.LookUp(intercode[i + 1]);
  115. if (tempOutput.Name != "nonexistence") {
  116. outputresult(tempOutput.Val + "<br />");
  117. }
  118. break;
  119. case "assign":
  120. switch (intercode[i + 1]) {
  121. case "name":
  122. Interpreter.item.Name = intercode[i + 2];
  123. break;
  124. case "type":
  125. if (intercode[i + 2] == "INT")
  126. Interpreter.item.Type = SymType_INT;
  127. else if (intercode[i + 2] == "REAL")
  128. Interpreter.item.Type = SymType_REAL;
  129. break;
  130. case "int":
  131. Interpreter.LookUp(intercode[i + 3]).Val = parseInt(Interpreter
  132. .LookUp("@result").Val);
  133. break;
  134. case "real":
  135. Interpreter.LookUp(intercode[i + 3]).Val = parseFloat(Interpreter
  136. .LookUp("@result").Val);
  137. break;
  138. }
  139. break;
  140. case "judge":
  141. var jlevel;
  142. switch (intercode[i + 1]) {
  143. case "if":
  144. jlevel = parseInt(intercode[i + 3]);
  145. ifflag[jlevel] = parseInt(Interpreter.LookUp("@result").Val);
  146. if (ifflag[jlevel] != 1) // 条件为假则跳转至假出口
  147. {
  148. i += 4;
  149. while (true) {
  150. if (intercode[i] == "mark" && intercode[i + 1] == "if"
  151. && parseInt(intercode[i + 3]) == jlevel)
  152. break;
  153. i += 4;
  154. }
  155. }
  156. // 条件为真则继续
  157. break;
  158. case "while":
  159. jlevel = parseInt(intercode[i + 3]);
  160. whileflag[jlevel] = parseInt(Interpreter.LookUp("@result").Val);
  161. if (whileflag[jlevel] != 1) // 条件为假则跳转至假出口
  162. {
  163. i += 4;
  164. while (true) {
  165. if (intercode[i] == "mark"
  166. && intercode[i + 1] == "while"
  167. && parseInt(intercode[i + 3]) == jlevel)
  168. break;
  169. i += 4;
  170. }
  171. }
  172. // 条件为真则继续
  173. break;
  174. }
  175. break;
  176. case "mark":
  177. var mlevel;
  178. switch (intercode[i + 1]) {
  179. case "if":
  180. mlevel = parseInt(intercode[i + 3]);
  181. if (ifflag[mlevel] == 1) // 条件为真则跳转至假出口
  182. {
  183. while (true) {
  184. if (intercode[i] == "mark"
  185. && intercode[i + 1] == "else"
  186. && parseInt(intercode[i + 3]) == mlevel)
  187. break;
  188. i += 4;
  189. }
  190. }
  191. // 条件为假则继续
  192. break;
  193. case "else": // 无论条件真假都继续
  194. break;
  195. case "while":
  196. if (intercode[i + 2] == "end") {
  197. mlevel = parseInt(intercode[i + 3]);
  198. if (whileflag[mlevel] == 1) // 条件为真则跳转至while语句开头
  199. {
  200. while (true) {
  201. i -= 4;
  202. if (intercode[i] == "mark"
  203. && intercode[i + 1] == "while"
  204. && intercode[i + 2] == "begin"
  205. && parseInt(intercode[i + 3]) == mlevel) {
  206. break;
  207. }
  208. }
  209. }
  210. // 条件为假则跳出继续
  211. }
  212. break;
  213. }
  214. break;
  215. // 表达式运算
  216. case "add":
  217. isReal = false;
  218. // 取第一个运算数
  219. if (ExprCal
  220. .IsDigit(ExprCal.IsDigit(intercode[i + 1].toString()[0]))) { // 常量
  221. if (intercode[i + 1].toString().indexOf(".") != -1) {
  222. isReal = true;
  223. }
  224. num1 = parseFloat(intercode[i + 1]);
  225. } else { // 变量
  226. num1 = parseFloat(Interpreter.LookUp(intercode[i + 1]).Val);
  227. }
  228. // 取第二个运算数
  229. if (ExprCal.IsDigit(intercode[i + 2].toString()[0])) { // 常量
  230. if (intercode[i + 2].toString().indexOf(".") != -1) {
  231. isReal = true;
  232. }
  233. num2 = parseFloat(intercode[i + 2]);
  234. } else { // 变量
  235. num2 = parseFloat(Interpreter.LookUp(intercode[i + 2]).Val);
  236. }
  237. tempIndex = parseInt(intercode[i + 3].substring(5));
  238. if (isReal) {
  239. Interpreter.tempVars[tempIndex].Type = SymType_REAL;
  240. Interpreter.tempVars[tempIndex].Val = num1 + num2;
  241. } else {
  242. Interpreter.tempVars[tempIndex].Type = SymType_INT;
  243. Interpreter.tempVars[tempIndex].Val = parseInt((num1 + num2));
  244. }
  245. break;
  246. case "sub":
  247. isReal = false;
  248. // 取第一个运算数
  249. if (ExprCal.IsDigit(intercode[i + 1].toString()[0])) { // 常量
  250. if (intercode[i + 1].toString().indexOf(".") != -1) {
  251. isReal = true;
  252. }
  253. num1 = parseFloat(intercode[i + 1]);
  254. } else { // 变量
  255. num1 = parseFloat(Interpreter.LookUp(intercode[i + 1]).Val);
  256. }
  257. // 取第二个运算数
  258. if (ExprCal.IsDigit(intercode[i + 2].toString()[0])) { // 常量
  259. if (intercode[i + 2].toString().indexOf(".") != -1) {
  260. isReal = true;
  261. }
  262. num2 = parseFloat(intercode[i + 2]);
  263. } else { // 变量
  264. num2 = parseFloat(Interpreter.LookUp(intercode[i + 2]).Val);
  265. }
  266. tempIndex = parseInt(intercode[i + 3].substring(5));
  267. if (isReal) {
  268. Interpreter.tempVars[tempIndex].Type = SymType_REAL;
  269. Interpreter.tempVars[tempIndex].Val = num1 - num2;
  270. } else {
  271. Interpreter.tempVars[tempIndex].Type = SymType_INT;
  272. Interpreter.tempVars[tempIndex].Val = parseInt((num1 - num2));
  273. }
  274. break;
  275. case "mul":
  276. isReal = false;
  277. // 取第一个运算数
  278. if (ExprCal.IsDigit(intercode[i + 1].toString()[0])) { // 常量
  279. if (intercode[i + 1].toString().indexOf(".") != -1) {
  280. isReal = true;
  281. }
  282. num1 = parseFloat(intercode[i + 1]);
  283. } else { // 变量
  284. num1 = parseFloat(Interpreter.LookUp(intercode[i + 1]).Val);
  285. }
  286. // 取第二个运算数
  287. if (ExprCal.IsDigit(intercode[i + 2].toString()[0])) { // 常量
  288. if (intercode[i + 2].toString().indexOf(".") != -1) {
  289. isReal = true;
  290. }
  291. num2 = parseFloat(intercode[i + 2]);
  292. } else { // 变量
  293. num2 = parseFloat(Interpreter.LookUp(intercode[i + 2]).Val);
  294. }
  295. tempIndex = parseInt(intercode[i + 3].substring(5));
  296. if (isReal) {
  297. Interpreter.tempVars[tempIndex].Type = SymType_REAL;
  298. Interpreter.tempVars[tempIndex].Val = num1 * num2;
  299. } else {
  300. Interpreter.tempVars[tempIndex].Type = SymType_INT;
  301. Interpreter.tempVars[tempIndex].Val = parseInt((num1 * num2));
  302. }
  303. break;
  304. case "div":
  305. isReal = false;
  306. // 取第一个运算数
  307. if (ExprCal.IsDigit(intercode[i + 1].toString()[0])) { // 常量
  308. if (intercode[i + 1].toString().indexOf(".") != -1) {
  309. isReal = true;
  310. }
  311. num1 = parseFloat(intercode[i + 1]);
  312. } else { // 变量
  313. num1 = parseFloat(Interpreter.LookUp(intercode[i + 1]).Val);
  314. }
  315. // 取第二个运算数
  316. if (ExprCal.IsDigit(intercode[i + 2].toString()[0])) { // 常量
  317. if (intercode[i + 2].toString().indexOf(".") != -1) {
  318. isReal = true;
  319. }
  320. num2 = parseFloat(intercode[i + 2]);
  321. } else { // 变量
  322. num2 = parseFloat(Interpreter.LookUp(intercode[i + 2]).Val);
  323. }
  324. tempIndex = parseInt(intercode[i + 3].substring(5));
  325. if (!isReal && (parseInt(num1) % parseInt(num2) == 0)) {
  326. Interpreter.tempVars[tempIndex].Type = SymType_INT;
  327. Interpreter.tempVars[tempIndex].Val = parseInt((num1 / num2));
  328. } else {
  329. Interpreter.tempVars[tempIndex].Type = SymType_REAL;
  330. Interpreter.tempVars[tempIndex].Val = num1 / num2;
  331. }
  332. break;
  333. case "lt":
  334. // 取第一个运算数
  335. if (ExprCal.IsDigit(intercode[i + 1].toString()[0])) { // 常量
  336. if (intercode[i + 1].toString().indexOf(".") != -1) {
  337. isReal = true;
  338. }
  339. num1 = parseFloat(intercode[i + 1]);
  340. } else { // 变量
  341. num1 = parseFloat(Interpreter.LookUp(intercode[i + 1]).Val);
  342. }
  343. // 取第二个运算数
  344. if (ExprCal.IsDigit(intercode[i + 2].toString()[0])) { // 常量
  345. if (intercode[i + 2].toString().indexOf(".") != -1)
  346. isReal = true;
  347. num2 = parseFloat(intercode[i + 2]);
  348. } else { // 变量
  349. num2 = parseFloat(Interpreter.LookUp(intercode[i + 2]).Val);
  350. }
  351. tempIndex = parseInt(intercode[i + 3].substring(5));
  352. Interpreter.tempVars[tempIndex].Type = SymType_INT;
  353. if (num1 < num2) {
  354. Interpreter.tempVars[tempIndex].Val = 1;
  355. } else {
  356. Interpreter.tempVars[tempIndex].Val = 0;
  357. }
  358. break;
  359. case "gt":
  360. // 取第一个运算数
  361. if (ExprCal.IsDigit(intercode[i + 1].toString()[0])) { // 常量
  362. if (intercode[i + 1].toString().indexOf(".") != -1) {
  363. isReal = true;
  364. }
  365. num1 = parseFloat(intercode[i + 1]);
  366. } else { // 变量
  367. num1 = parseFloat(Interpreter.LookUp(intercode[i + 1]).Val);
  368. }
  369. // 取第二个运算数
  370. if (ExprCal.IsDigit(intercode[i + 2].toString()[0])) { // 常量
  371. if (intercode[i + 2].toString().indexOf(".") != -1) {
  372. isReal = true;
  373. }
  374. num2 = parseFloat(intercode[i + 2]);
  375. } else { // 变量
  376. num2 = parseFloat(Interpreter.LookUp(intercode[i + 2]).Val);
  377. }
  378. tempIndex = parseInt(intercode[i + 3].substring(5));
  379. Interpreter.tempVars[tempIndex].Type = SymType_INT;
  380. if (num1 > num2) {
  381. Interpreter.tempVars[tempIndex].Val = 1;
  382. } else {
  383. Interpreter.tempVars[tempIndex].Val = 0;
  384. }
  385. break;
  386. case "eq":
  387. // 取第一个运算数
  388. if (ExprCal.IsDigit(intercode[i + 1].toString()[0])) { // 常量
  389. if (intercode[i + 1].toString().indexOf(".") != -1) {
  390. isReal = true;
  391. }
  392. num1 = parseFloat(intercode[i + 1]);
  393. } else { // 变量
  394. num1 = parseFloat(Interpreter.LookUp(intercode[i + 1]).Val);
  395. }
  396. // 取第二个运算数
  397. if (ExprCal.IsDigit(intercode[i + 2].toString()[0])) { // 常量
  398. if (intercode[i + 2].toString().indexOf(".") != -1) {
  399. isReal = true;
  400. }
  401. num2 = parseFloat(intercode[i + 2]);
  402. } else { // 变量
  403. num2 = parseFloat(Interpreter.LookUp(intercode[i + 2]).Val);
  404. }
  405. tempIndex = parseInt(intercode[i + 3].substring(5));
  406. Interpreter.tempVars[tempIndex].Type = SymType_INT;
  407. if (num1 == num2) {
  408. Interpreter.tempVars[tempIndex].Val = 1;
  409. } else {
  410. Interpreter.tempVars[tempIndex].Val = 0;
  411. }
  412. break;
  413. case "ne":
  414. // 取第一个运算数
  415. if (ExprCal.IsDigit(intercode[i + 1].toString()[0])) { // 常量
  416. if (intercode[i + 1].toString().indexOf(".") != -1) {
  417. isReal = true;
  418. }
  419. num1 = parseFloat(intercode[i + 1]);
  420. } else { // 变量
  421. num1 = parseFloat(Interpreter.LookUp(intercode[i + 1]).Val);
  422. }
  423. // 取第二个运算数
  424. if (ExprCal.IsDigit(intercode[i + 2].toString()[0])) { // 常量
  425. if (intercode[i + 2].toString().indexOf(".") != -1) {
  426. isReal = true;
  427. }
  428. num2 = parseFloat(intercode[i + 2]);
  429. } else { // 变量
  430. num2 = parseFloat(Interpreter.LookUp(intercode[i + 2]).Val);
  431. }
  432. tempIndex = parseInt(intercode[i + 3].substring(5));
  433. Interpreter.tempVars[tempIndex].Type = SymType_INT;
  434. if (num1 != num2) {
  435. Interpreter.tempVars[tempIndex].Val = 1;
  436. } else {
  437. Interpreter.tempVars[tempIndex].Val = 0;
  438. }
  439. break;
  440. case "load":
  441. if (ExprCal.IsDigit(intercode[i + 2].toString()[0])) { // 常量
  442. Interpreter.item = Interpreter.LookUp(intercode[i + 3]);
  443. if (intercode[i + 2].toString().indexOf(".") != -1) {
  444. Interpreter.tempVars[0].Val = parseFloat(intercode[i + 2]);
  445. } else {
  446. Interpreter.tempVars[0].Val = parseInt(intercode[i + 2]);
  447. }
  448. } else { // 变量
  449. Interpreter.item = Interpreter.LookUp(intercode[i + 2]);
  450. Interpreter.LookUp(intercode[i + 3]).Val = Interpreter.item.Val;
  451. }
  452. break;
  453. }
  454. i += 4;
  455. }
  456. }
  457. }