U.DC.ST.js 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877
  1. var Syntax = {
  2. index :0,
  3. word :new Token(),
  4. root :new Node(),
  5. lineNubmer :1,
  6. readall :false,// 是否读取完所有
  7. error :"",
  8. tableList :new Array(),
  9. table :new SymTable(),
  10. mainTable :new SymTable(),
  11. item :new SymItem(),
  12. nonexistence :new SymItem("nonexistence", SymType_INT, 0),
  13. checkStr :'',
  14. varInDec :false,
  15. varInAss :false,
  16. isIndex :false,
  17. tempName :"",
  18. ifLevel :0,
  19. whileLevel :0,
  20. expressionVal :1,
  21. iIndex :0,
  22. instream :new Array(100),
  23. inWrite :false,
  24. intercode :new Array(),
  25. /* 获取最后一个临时存储单元名称 */
  26. getLastReg : function() {
  27. return Syntax.intercode[Syntax.intercode.length - 1];
  28. },
  29. /* 在总表中查询某变量,如果找到返回该符号表项,否则返回null */
  30. LookUp : function(s) {
  31. for ( var i = Syntax.tableList.length - 1; i >= 0; i--) {
  32. if (Syntax.tableList[i].position(s) != null)
  33. return Syntax.tableList[i].position(s);
  34. }
  35. return null;
  36. },
  37. /* 检查变量名冲突。如果存在冲突,则返回false,不存在则返回true */
  38. Check : function(str) {
  39. for ( var i = 0; i < Syntax.table.SymItemList.length; ++i) {
  40. if (Syntax.table.SymItemList[i].Name == str) {
  41. return false;
  42. }
  43. }
  44. return true;
  45. },
  46. /* 获得从当前位置开始的第一个表达式*/
  47. getExpressionStr : function() {
  48. var expIndex = Syntax.index;
  49. var s = "1";
  50. if (expIndex < tokens.length) {
  51. s = "";
  52. while (tokens[expIndex].value != ";"
  53. && tokens[expIndex].value != ","
  54. && tokens[expIndex].value != "="
  55. && tokens[expIndex].value != "{") {
  56. if (expIndex < tokens.length) {
  57. if (expIndex < tokens.length) {
  58. s += (tokens[expIndex]).value;
  59. }
  60. expIndex++;
  61. if (expIndex == tokens.length) {
  62. break;
  63. }
  64. } else {
  65. break;
  66. }
  67. }
  68. }
  69. return s;
  70. },
  71. /* 获得从当前位置开始的条件表达式*/
  72. getConditionStr : function() {
  73. var count = 0; // 取到一个左括号就减1,取到一个右括号就加1
  74. var conIndex = Syntax.index;
  75. var s = "(";
  76. if (conIndex < tokens.length) {
  77. while (count != 1) {
  78. if (conIndex < tokens.length) {
  79. if (tokens[conIndex].value == "(") {
  80. count--;
  81. }
  82. if (tokens[conIndex].value == ")") {
  83. count++;
  84. }
  85. s += (tokens[conIndex]).value;
  86. conIndex++;
  87. } else
  88. break;
  89. }
  90. }
  91. return s;
  92. },
  93. /* 获得从当前位置开始的数组下标表达式 */
  94. getIndexStr : function() {
  95. var count = 0; // 取到一个左括号就减1,取到一个右括号就加1
  96. var conIndex = Syntax.index;
  97. var s = "";
  98. if (conIndex < tokens.length) {
  99. while (count != 1) {
  100. if (conIndex < tokens.length) {
  101. if (tokens[conIndex].value == "[") {
  102. count--;
  103. }
  104. if (tokens[conIndex].value == "]") {
  105. count++;
  106. }
  107. s += tokens[conIndex].value;
  108. conIndex++;
  109. } else
  110. break;
  111. }
  112. }
  113. return s;
  114. },
  115. /* 求出表达式的值 */
  116. getExpressionValue : function(s) {
  117. // 去右端多余小括号
  118. var indexOfLastParen = s.lastIndexOf(')');
  119. if (indexOfLastParen == s.length - 1) {
  120. var leftToken = new Array();
  121. leftToken.push("(");
  122. var rightToken = new Array();
  123. rightToken.push(")");
  124. var leftCount = s.split(leftToken).length - 1;
  125. var rightCount = s.split(rightToken).length - 1;
  126. if (leftCount != rightCount)
  127. s = s.substring(0, s.length - 1);
  128. }
  129. // 去右端多余中括号
  130. var indexOfLastBracket = s.lastIndexOf(']');
  131. if (indexOfLastBracket == s.length - 1) {
  132. var leftToken = new Array();
  133. leftToken.push("(");
  134. var rightToken = new Array();
  135. rightToken.push(")");
  136. var leftCount = s.split(leftToken).length - 1;
  137. var rightCount = s.split(rightToken).length - 1;
  138. if (leftCount != rightCount)
  139. s = s.substring(0, s.length - 1);
  140. }
  141. ExprCal.init(s); // /////////////////////////////////////////////////////
  142. return ExprCal.Calculate();
  143. },
  144. /* 生成中间代码 */
  145. gen : function(s1, s2, s3, s4) {
  146. Syntax.intercode.push(s1);
  147. Syntax.intercode.push(s2);
  148. Syntax.intercode.push(s3);
  149. Syntax.intercode.push(s4);
  150. },
  151. /* 初始化语法语义分析 */
  152. init : function() {
  153. Syntax.index = 0;
  154. Syntax.root = null;
  155. Syntax.lineNubmer = 1;
  156. Syntax.readall = false;
  157. Syntax.error = "";
  158. Syntax.checkStr ='';
  159. Syntax.varInDec =false;
  160. Syntax.varInAss =false;
  161. Syntax.isIndex =false;
  162. Syntax.tempName ="";
  163. Syntax.ifLevel =0;
  164. Syntax.whileLevel =0;
  165. Syntax.expressionVal =1;
  166. Syntax.iIndex =0;
  167. Syntax.instream =new Array(100);
  168. Syntax.inWrite =false;
  169. Syntax.intercode =new Array();
  170. Syntax.tableList = new Array(); // 创建符号总表
  171. Syntax.mainTable = new SymTable(); // 创建最底层的符号分表
  172. Syntax.table = Syntax.mainTable; // 当前符号分表初始为最底层的符号分表
  173. Syntax.tableList.push(Syntax.table); // 将最底层的符号分表加入符号总表
  174. },
  175. // 获取当前的单词
  176. getWord : function() {
  177. if (Syntax.index < tokens.length) {
  178. Syntax.word = tokens[Syntax.index];
  179. }
  180. },
  181. /* 获取下一个单词 */
  182. nextWord : function() {
  183. if (Syntax.index < tokens.length) {
  184. Syntax.index++;
  185. if (Syntax.index == tokens.length) {
  186. Syntax.readall = true;
  187. }
  188. } else {
  189. Syntax.readall = true;
  190. return;
  191. }
  192. },
  193. /* 启动逐Token的语法分析 */
  194. run : function(tokens) {
  195. tokens.shift();// 删除数组第一个元素
  196. tokens.pop();//删除最后一个元素
  197. Syntax.init();// 初始化变量
  198. for ( var i = 0; i < 100; i++) {
  199. Syntax.instream[i] = "0";
  200. }
  201. // 语法分析 进程启动
  202. Syntax.root = Syntax.ParseProgram(tokens);
  203. },
  204. /* 分析程序 */
  205. ParseProgram : function(tokens) {
  206. var node = new Node('Program');
  207. var child;
  208. while (Syntax.index < tokens.length && !(Syntax.readall)) {
  209. Syntax.getWord();
  210. child = Syntax.ParseStatement();
  211. node.children.push(child);
  212. }
  213. return node;
  214. },
  215. /* 分析语句 */
  216. ParseStatement : function() {
  217. var node = new Node('Statement');
  218. var child;
  219. while (!(Syntax.readall)) {
  220. Syntax.getWord();
  221. if (Syntax.word.value == "read") {
  222. node.match2("read");
  223. child = Syntax.ParseInputStm(); // 进行输入语句分析
  224. node.children.push(child);
  225. break;
  226. } else if (Syntax.word.value == "write") {
  227. node.match2("write");
  228. child = Syntax.ParseOutputStm(); // 进行输出语句分析
  229. node.children.push(child);
  230. break;
  231. } else if (Syntax.word.value == "if") {
  232. node.match2("if");
  233. child = Syntax.ParseIfStm(); // 进行if语句分析
  234. node.children.push(child);
  235. break;
  236. } else if (Syntax.word.value == "while") {
  237. node.match2("while");
  238. child = Syntax.ParseWhileStm(); // 进行while语句分析
  239. node.children.push(child);
  240. break;
  241. } else if (Syntax.word.value == "int" || Syntax.word.value == "real") {
  242. if (Syntax.word.value == "int") {
  243. node.match2("int");
  244. } else {
  245. node.match2("real");
  246. }
  247. // 登录符号表
  248. Syntax.item = new SymItem();
  249. Syntax.table.SymItemList.push(Syntax.item);
  250. // 生成中间代码
  251. Syntax.gen("new", "@item", "_", "@table");
  252. // 确定符号表项的类型
  253. if (Syntax.word.value == "int") {
  254. Syntax.item.Type = SymType_INT;
  255. // 生成中间代码
  256. Syntax.gen("assign", "type", "int", "@item");
  257. } else {
  258. Syntax.item.Type = SymType_REAL;
  259. // 生成中间代码
  260. Syntax.gen("assign", "type", "real", "@item");
  261. }
  262. child = Syntax.ParseVarDeclaration(); // 进行变量声明分析
  263. node.children.push(child);
  264. break;
  265. } else if (Syntax.word.type == "IDENT") {
  266. child = Syntax.ParseAssignment(); // 进行赋值语句分析
  267. node.children.push(child);
  268. break;
  269. } else if (Syntax.word.value == "{") {
  270. node.match2("{");
  271. // 新建符号分表并接在符号总表的尾部
  272. Syntax.table = new SymTable();
  273. Syntax.tableList.push(Syntax.table);
  274. // 生成中间代码
  275. Syntax.gen("new", "@table", "_", "@tableList");
  276. child = Syntax.ParseBlock(); // 进行复合语句分析
  277. node.children.push(child);
  278. break;
  279. } else if (word.value == ";") {
  280. node.match2(";");
  281. break;
  282. } else {
  283. Syntax.error += "<br>错误发生在第" + Syntax.word.rowNum + "行:以不合法的token开头。";
  284. Syntax.nextWord();
  285. }
  286. }
  287. return node;
  288. },
  289. /* 分析输入语句 */
  290. ParseInputStm : function() {
  291. Syntax.getWord();
  292. //alert("inputstm");
  293. var node = new Node("InputStm");
  294. var child;
  295. node.match2("("); // 匹配左括号
  296. Syntax.getWord();
  297. if (Syntax.word.value == ")") {
  298. Syntax.error += "<br>错误发生在第" + Syntax.word.rowNum + "行:缺少参数。";
  299. } else {
  300. child = Syntax.ParseVariable(); // 进行变量分析
  301. node.children.push(child);
  302. /* 将输入流中的相应元素赋给当前的item的值 */
  303. if (Syntax.item.Type == SymType_INT) {
  304. Syntax.item.Val = parseInt(Syntax.instream[Syntax.iIndex]);
  305. } else {
  306. Syntax.item.Val = parseFloat(Syntax.instream[Syntax.iIndex]);
  307. }
  308. Syntax.iIndex++;
  309. /* 生成中间代码 */
  310. Syntax.gen("read", Syntax.item.Type, "_", Syntax.item.Name);
  311. }
  312. Syntax.getWord();
  313. while (Syntax.word.value == ",") // 如果有逗号,说明还有其它参数
  314. {
  315. node.match2(","); // 匹配逗号
  316. child = Syntax.ParseVariable(); // 进行变量分析
  317. node.children.push(child);
  318. /* 将输入流中的相应元素赋给当前的item的值 */
  319. if (Syntax.item.Type == SymType_INT)
  320. Syntax.item.Val = parseInt(Syntax.instream[Syntax.iIndex]);
  321. else
  322. Syntax.item.Val = parseFloat(Syntax.instream[Syntax.iIndex]);
  323. /* 生成中间代码 */
  324. Syntax.gen("read", Syntax.item.Type, "_", Syntax.item.Name);
  325. Syntax.iIndex++;
  326. Syntax.getWord();
  327. }
  328. node.match2(")"); // 匹配右括号
  329. node.match2(";"); // 匹配分号
  330. return node;
  331. },
  332. /* 分析输出语句 */
  333. ParseOutputStm : function() {
  334. Syntax.getWord();
  335. //alert("outputstm");
  336. var node = new Node("OutputStm");
  337. var child;
  338. node.match2("("); // 匹配左括号
  339. Syntax.getWord();
  340. if (Syntax.word.value != ")") {
  341. /* 将表达式的计算结果的字符串赋给输出流中的相应元素 */
  342. Syntax.expressionVal = Syntax.getExpressionValue(Syntax.getExpressionStr());
  343. // 生成中间代码
  344. Syntax.gen("write", "@result", "_", "@outstream");
  345. Syntax.inWrite = true;
  346. child = Syntax.ParseExpression(); // 进行表达式分析
  347. node.children.push(child);
  348. } else {
  349. Syntax.error += "<br>错误发生在第" + Syntax.word.rowNum + "行:缺少参数。";
  350. }
  351. Syntax.inWrite = false;
  352. node.match2(")"); // 匹配右括号
  353. node.match2(";"); // 匹配分号
  354. return node;
  355. },
  356. /* 分析if语句 */
  357. ParseIfStm : function() {
  358. Syntax.getWord();
  359. //alert("ifstm");
  360. var node = new Node("IfStm");
  361. var child;
  362. node.match2("("); // 匹配左括号
  363. Syntax.getWord();
  364. if (Syntax.word.value != ")") {
  365. Syntax.expressionVal = Syntax.getExpressionValue(Syntax.getConditionStr());
  366. // 生成中间代码
  367. Syntax.ifLevel++;
  368. Syntax.gen("judge", "if", "@result", Syntax.ifLevel);
  369. child = Syntax.ParseExpression(); // 进行表达式分析
  370. node.children.push(child);
  371. } else {
  372. Syntax.error += "<br>错误发生在第" + Syntax.word.rowNum + "行:缺少逻辑表达式。";
  373. }
  374. node.match2(")"); // 匹配右括号
  375. child = Syntax.ParseStatement(); // 进行语句分析
  376. node.children.push(child);
  377. // 生成中间代码
  378. Syntax.gen("mark", "if", "_", Syntax.ifLevel); // 如果条件为真,则执行到这里便开始跳转至else标记;否则从这里开始执行
  379. Syntax.getWord();
  380. if (Syntax.word.value == "else" && !(Syntax.readall)) // 如果有else,说明还有else语句
  381. {
  382. node.match2("else"); // 匹配else
  383. child = Syntax.ParseStatement(); // 进行语句分析
  384. node.children.push(child);
  385. Syntax.getWord();
  386. }
  387. // 生成中间代码
  388. Syntax.gen("mark", "else", "_", Syntax.ifLevel); // 如果条件为真,则跳转至到这里;否则可以不管
  389. Syntax.ifLevel--;
  390. return node;
  391. },
  392. /* 分析while语句 */
  393. ParseWhileStm : function() {
  394. Syntax.getWord();
  395. //alert(whilestm);
  396. var node = new Node("WhileStm");
  397. var child;
  398. node.match2("("); // 匹配左括号
  399. Syntax.getWord();
  400. if (Syntax.word.value != ")") {
  401. Syntax.whileLevel++;
  402. // 生成中间代码
  403. Syntax.gen("mark", "while", "begin", Syntax.whileLevel);
  404. Syntax.expressionVal = Syntax.getExpressionValue(Syntax.getConditionStr());
  405. // 生成中间代码
  406. Syntax.gen("judge", "while", "@result", Syntax.whileLevel);
  407. child = Syntax.ParseExpression(); // 进行表达式分析
  408. node.children.push(child);
  409. } else {
  410. Syntax.error += "<br>错误发生在第" + Syntax.word.rowNum + "行:缺少逻辑表达式。";
  411. }
  412. node.match2(")"); // 匹配右括号
  413. child = Syntax.ParseStatement(); // 进行语句分析
  414. node.children.push(child);
  415. // 生成中间代码
  416. Syntax.gen("mark", "while", "end", Syntax.whileLevel);
  417. Syntax.whileLevel--;
  418. return node;
  419. },
  420. /* 分析变量声明语句 */
  421. ParseVarDeclaration : function() {
  422. Syntax.varInDec = true;
  423. Syntax.getWord();
  424. //alert("vardec");
  425. var node = new Node("VarDeclaration");
  426. var child;
  427. child = Syntax.ParseVariable(); // 进行变量分析
  428. node.children.push(child);
  429. Syntax.getWord();
  430. if (Syntax.word.value == "=") {
  431. if (tokens[Syntax.index - 1].value != "]") // 声明的变量不是数组,可同时赋值
  432. {
  433. node.match2("="); // 匹配等号
  434. Syntax.getWord();
  435. // 将表达式的值赋给当前项的值
  436. Syntax.item.Val = Syntax.getExpressionValue(Syntax
  437. .getExpressionStr());
  438. // 生成中间代码
  439. Syntax.gen("assign", Syntax.item.Type, "@result", Syntax.item.Name);
  440. child = Syntax.ParseExpression(); // 进行表达式分析
  441. node.children.push(child);
  442. } else {
  443. Syntax.error += "<br>错误发生在第" + Syntax.word.rowNum + "行:数组在声明的同时被赋值。";
  444. }
  445. }
  446. Syntax.getWord();
  447. while (Syntax.word.value == ",") {
  448. if (Syntax.readall == true) {
  449. Syntax.error += "<br>错误发生在第" + Syntax.word.rowNum + "行:出现多余的逗号。";
  450. break;
  451. }
  452. Syntax.getWord();
  453. node.match2(","); // 匹配逗号
  454. // 记录之前的item类型
  455. var tempType = Syntax.item.Type;
  456. // 新建另外的符号表项
  457. Syntax.item = new SymItem();
  458. Syntax.table.SymItemList.push(Syntax.item);
  459. // 生成中间代码
  460. Syntax.gen("new", "@item", "_", "@table");
  461. // 确定符号表项的类型
  462. Syntax.item.Type = tempType;
  463. // 生成中间代码
  464. Syntax.gen("assign", "type", tempType, "@item");
  465. child = Syntax.ParseVariable(); // 进行变量分析
  466. node.children.push(child);
  467. Syntax.getWord();
  468. if (Syntax.word.value == "=") {
  469. if (tokens[Syntax.index - 1].value != "]") // 声明的变量不是数组,可同时赋值
  470. {
  471. node.match2("="); // 匹配等号
  472. Syntax.getWord();
  473. // 将表达式的值赋给当前项的值
  474. Syntax.item.Val = Syntax.getExpressionValue(Syntax.getExpressionStr());
  475. // 生成中间代码
  476. Syntax.gen("assign", tempType, "@result", Syntax.item.Name);
  477. child = Syntax.ParseExpression(); // 进行表达式分析
  478. node.children.push(child);
  479. } else {
  480. Syntax.error += "<br>错误发生在第" + Syntax.word.rowNum + "行:数组在声明的同时被赋值。";
  481. }
  482. }
  483. Syntax.getWord();
  484. }
  485. node.match2(";"); // 匹配分号
  486. Syntax.varInDec = false;
  487. return node;
  488. },
  489. /* 分析赋值语句 */
  490. ParseAssignment : function() {
  491. Syntax.varInAss = true;
  492. Syntax.getWord();
  493. //alert("assign");
  494. var node = new Node("Assignment");
  495. var child;
  496. child = Syntax.ParseVariable(); // 进行变量分析
  497. node.children.push(child);
  498. var tempType = Syntax.item.Type;
  499. node.match2("="); // 匹配等号
  500. Syntax.getWord();
  501. var itemVal = parseInt(Syntax.getExpressionValue(Syntax.getExpressionStr()));
  502. Syntax.item.Val = itemVal;
  503. // 生成中间代码
  504. if (Syntax.isIndex) // 要用开关变量
  505. {
  506. Syntax.gen("assign", tempType, "@result", Syntax.tempName + "[@index]");
  507. } else {
  508. Syntax.gen("assign", Syntax.item.Type, "@result", Syntax.item.Name);
  509. }
  510. Syntax.isIndex = false;
  511. child = Syntax.ParseExpression(); // 进行表达式分析
  512. node.children.push(child);
  513. node.match2(";"); // 匹配分号
  514. Syntax.varInAss = false;
  515. return node;
  516. },
  517. /* 分析复合语句 */
  518. ParseBlock : function() {
  519. Syntax.getWord();
  520. //alert("block");
  521. var node = new Node("Block");
  522. var child;
  523. while (Syntax.word.value != "}") {
  524. Syntax.getWord();
  525. child = Syntax.ParseStatement(); // 进行语句分析
  526. node.children.push(child);
  527. Syntax.getWord();
  528. if (Syntax.readall) // 如果结尾缺少右花括号则跳出
  529. break;
  530. }
  531. if (!(Syntax.readall)) {
  532. node.match2("}"); // 匹配右括号
  533. }
  534. if(node==null){
  535. Syntax.error += "<br>错误发生在第" + Syntax.word.rowNum + "行:缺少 } 。";
  536. }
  537. // 删除当前的符号分表
  538. Syntax.tableList.pop();
  539. Syntax.table = Syntax.tableList[Syntax.tableList.length - 1];
  540. Syntax.gen("remove", "@table", "_", "@tableList");
  541. return node;
  542. },
  543. /* 分析表达式 */
  544. ParseExpression : function() {
  545. Syntax.getWord();
  546. //alert("expr");
  547. var node = new Node("Expression");
  548. var child;
  549. child = Syntax.ParseTerm(); // 进行项分析
  550. node.children.push(child);
  551. Syntax.getWord();
  552. while (Syntax.word.value == "+" || Syntax.word.value == "-" || Syntax.word.value == "<"
  553. || Syntax.word.value == ">" || Syntax.word.value == "==" || Syntax.word.value == "<>") // 如果有加号或者减号,说明还有其它项
  554. {
  555. Syntax.getWord();
  556. if (Syntax.word.value == "+") // 如果有正号则匹配正号
  557. node.match2("+");
  558. if (Syntax.word.value == "-") // 如果有负号则匹配负号
  559. node.match2("-");
  560. if (word.value == "<") // 如果有小于号则匹配小于号
  561. node.match2("<");
  562. if (Syntax.word.value == ">") // 如果有大于号则匹配大于号
  563. node.match2(">");
  564. if (Syntax.word.value == "==") // 如果有等于号则匹配等于号
  565. node.match2("==");
  566. if (Syntax.word.value == "<>") // 如果有不等号则匹配不等号
  567. node.match2("<>");
  568. child = Syntax.ParseTerm(); // 进行项分析
  569. node.children.push(child);
  570. Syntax.getWord();
  571. }
  572. return node;
  573. },
  574. /* 分析项 */
  575. ParseTerm : function() {
  576. Syntax.getWord();
  577. //alert("term");
  578. var node = new Node("Term");
  579. var child;
  580. child = Syntax.ParseFactor(); // 进行因子分析
  581. node.children.push(child);
  582. Syntax.getWord();
  583. while (Syntax.word.value == "*" || Syntax.word.value == "/") // 如果有乘号或者除号,说明还有其它因子
  584. {
  585. Syntax.getWord();
  586. if (Syntax.word.value == "*") { // 如果有乘号则匹配乘号
  587. node.match2("*");
  588. }
  589. if (Syntax.word.value == "/") { // 如果有除号则匹配除号
  590. node.match2("/");
  591. }
  592. child = Syntax.ParseFactor(); // 进行因子分析
  593. node.children.push(child);
  594. Syntax.getWord();
  595. }
  596. return node;
  597. },
  598. /* 分析因子 */
  599. ParseFactor : function() {
  600. Syntax.getWord();
  601. //alert("factor");
  602. var node = new Node("Factor");
  603. var child;
  604. if (Syntax.word.type == "IDENT") {
  605. child = Syntax.ParseVariable(); // 进行变量分析
  606. node.children.push(child);
  607. } else if (Syntax.word.type == "INT" || Syntax.word.type == "REAL" || Syntax.word.value == "+"
  608. || Syntax.word.value == "-") {
  609. child = Syntax.ParseConstant(); // 进行常量分析
  610. node.children.push(child);
  611. } else if (word.value == "(") {
  612. node.match2("("); // 匹配左括号
  613. if (!(Syntax.readall)) {
  614. child = Syntax.ParseExpression(); // 进行表达式分析
  615. node.children.push(child);
  616. } else {
  617. Syntax.error += "<br>错误发生在第" + Syntax.word.rowNum + "行:小括号不匹配。";
  618. }
  619. node.match2(")"); // 匹配右括号
  620. } else {
  621. Syntax.error += "<br>错误发生在第" + Syntax.word.rowNum + "行:存在不合法的因子。";
  622. Syntax.nextWord();
  623. }
  624. return node;
  625. },
  626. /* 分析变量 */
  627. ParseVariable : function() {
  628. Syntax.getWord();
  629. //alert("var");
  630. var node = new Node("Variable");
  631. var child;
  632. if (Syntax.index < tokens.length) {
  633. if (Syntax.varInDec == false) {
  634. // 变量不在声明语句中,将item指向当前找到的符号表项
  635. Syntax.item = Syntax.LookUp(Syntax.word.value); // 如果item为null,要么使用了未定义的变量,要么变量是一个数组元素
  636. if (Syntax.item == null) {
  637. Syntax.tempName = Syntax.word.value;
  638. }
  639. if (Syntax.index < tokens.length - 1) {
  640. if (tokens[Syntax.index + 1].value != "[") // 不为数组元素
  641. {
  642. node.match1("IDENT"); // 匹配ID
  643. if (typeof (Syntax.item) == "undefined" || Syntax.item == null) // 使用了未定义的变量
  644. {
  645. Syntax.error += "<br>错误发生在第" + Syntax.word.rowNum + "行:使用了未声明的变量。";
  646. Syntax.item = Syntax.nonexistence;
  647. }
  648. } else {
  649. child = Syntax.ParseArray(); // 进行数组分析
  650. node.children.push(child);
  651. }
  652. } else {
  653. node.match1("IDENT"); // 匹配ID
  654. }
  655. } else {
  656. Syntax.checkStr = Syntax.word.value;
  657. if (Syntax.Check(Syntax.checkStr)) {
  658. // 在声明语句中,应该给符号表项的名字赋值
  659. Syntax.item.Name = Syntax.word.value;
  660. } else // 在同一层对变量进行了重复定义
  661. {
  662. Syntax.error += "<br>错误发生在第" + Syntax.word.rowNum + "行:变量名冲突。";
  663. }
  664. if (Syntax.index < tokens.length - 1) {
  665. if (tokens[Syntax.index + 1].value != "[") {
  666. // 生成中间代码
  667. Syntax.gen("assign", "name", Syntax.word.value, "@item");
  668. node.match1("IDENT"); // 匹配ID
  669. } else {
  670. if (!(Syntax.Check(Syntax.checkStr + "[0]"))) // 在同一层对变量进行了重复定义
  671. {
  672. Syntax.error += "<br>错误发生在第" + Syntax.word.rowNum + "行:变量名冲突。";
  673. }
  674. child = Syntax.ParseArray(); // 进行数组分析
  675. node.children.push(child);
  676. }
  677. } else {
  678. node.match1("IDENT"); // 匹配ID
  679. }
  680. }
  681. }
  682. return node;
  683. },
  684. /* 分析常量 */
  685. ParseConstant : function() {
  686. Syntax.getWord();
  687. //alert("const");
  688. var node = new Node("Constant");
  689. if (Syntax.word.value == "+") {
  690. node.match2("+");
  691. } else if (word.value == "-") {
  692. node.match2("-");
  693. }
  694. Syntax.getWord();
  695. if (Syntax.word.type == "INT") {
  696. node.match1("INT"); // 匹配整数
  697. } else {
  698. node.match1("REAL"); // 匹配实数
  699. }
  700. return node;
  701. },
  702. /* 分析数组 */
  703. ParseArray : function() {
  704. Syntax.getWord();
  705. //alert("array");
  706. var node = new Node("Array");
  707. var child;
  708. node.match1("IDENT"); // 匹配ID
  709. node.match2("["); // 匹配左括号
  710. Syntax.getWord();
  711. if (Syntax.varInDec == true) {
  712. if (Syntax.Check(Syntax.checkStr + "[0]")) {
  713. Syntax.item.Name += "[0]";
  714. // 生成中间代码
  715. Syntax.gen("assign", "name", Syntax.item.Name, "@item");
  716. if (Syntax.word.type != "INT") // 防止数组长度不为正整数,但没有包括对长度为0的检查
  717. {
  718. Syntax.error += "<br>错误发生在第" + Syntax.word.rowNum + "行:数组长度不为正整数。";
  719. } else {
  720. var length = parseInt(Syntax.word.value); // 获得数组长度
  721. var type = Syntax.item.Type; // 获得数组类型
  722. if (length < 1) // 防止声明数组的长度为0
  723. {
  724. Syntax.error += "<br>错误发生在第" + Syntax.word.rowNum + "行:数组长度不为正整数。";
  725. } else {
  726. for ( var i = 1; i < length; i++) {
  727. // 新建的符号表项名字
  728. var str = tokens[Syntax.index - 2].value + "[" + i + "]"; // 获得数组元素名字
  729. Syntax.item = new SymItem(str, type, 0); // 构造存放该数组元素的符号表项
  730. Syntax.table.SymItemList.push(Syntax.item);
  731. // 生成中间代码
  732. Syntax.gen("new", "@item", "_", "@table");
  733. Syntax.gen("assign", "type", type, "@item");
  734. Syntax.gen("assign", "name", str, "@item");
  735. }
  736. }
  737. }
  738. }
  739. } else {
  740. var arrayIndex;
  741. if (Syntax.varInAss == false) {
  742. arrayIndex = parseInt(Syntax.getExpressionValue(Syntax
  743. .getIndexStr()));
  744. } else {
  745. arrayIndex = parseInt(Syntax.getExpressionValue(Syntax
  746. .getIndexStr()));
  747. Syntax.isIndex = true;
  748. // 生成中间代码
  749. Syntax.gen("assign", "int", "@result", "@index");///////////////INT改int
  750. }
  751. if (Syntax.LookUp(Syntax.tempName + "[0]") == null) // 不检查数组越界,只检查是否有此数组存在
  752. {
  753. Syntax.error += "<br>错误发生在第" + Syntax.word.rowNum + "行:使用了未定义的变量。";
  754. Syntax.item = Syntax.nonexistence;
  755. } else {
  756. Syntax.item = Syntax.LookUp(Syntax.tempName + "[" + arrayIndex + "]"); // 可能发生数组越界
  757. }
  758. }
  759. child = Syntax.ParseExpression(); // 进行表达式分析
  760. node.children.push(child);
  761. node.match2("]"); // 匹配右括号
  762. return node;
  763. }
  764. //treeview : function(node) {
  765. // var ul = document.createElement("ul");
  766. // var li = document.createElement("li");
  767. // li.onclick = function(e) {
  768. // showNode(this);
  769. // e.cancelBubble = true;
  770. // }
  771. // if (node.children.length != 0) {
  772. // li.style.backgroundImage = "url(images/minus.gif)";
  773. // li.style.backgroundRepeat = "no-repeat";
  774. // li.style.backgroundPosition = "0px 5px";
  775. // }
  776. // var txt = document.createTextNode(node.type);
  777. // li.appendChild(txt);
  778. // for ( var i = 0; i < node.children.length; ++i) {
  779. // var child = Syntax.treeview(node.children[i]);
  780. // li.appendChild(child);
  781. // }
  782. // ul.appendChild(li);
  783. // return ul;
  784. //}
  785. }