123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877 |
- var Syntax = {
- index :0,
- word :new Token(),
- root :new Node(),
- lineNubmer :1,
- readall :false,
- error :"",
- tableList :new Array(),
- table :new SymTable(),
- mainTable :new SymTable(),
- item :new SymItem(),
- nonexistence :new SymItem("nonexistence", SymType_INT, 0),
- checkStr :'',
- varInDec :false,
- varInAss :false,
- isIndex :false,
- tempName :"",
- ifLevel :0,
- whileLevel :0,
- expressionVal :1,
- iIndex :0,
- instream :new Array(100),
- inWrite :false,
- intercode :new Array(),
-
-
- getLastReg : function() {
- return Syntax.intercode[Syntax.intercode.length - 1];
- },
-
- LookUp : function(s) {
- for ( var i = Syntax.tableList.length - 1; i >= 0; i--) {
- if (Syntax.tableList[i].position(s) != null)
- return Syntax.tableList[i].position(s);
- }
- return null;
- },
-
- Check : function(str) {
- for ( var i = 0; i < Syntax.table.SymItemList.length; ++i) {
- if (Syntax.table.SymItemList[i].Name == str) {
- return false;
- }
- }
- return true;
- },
-
- getExpressionStr : function() {
- var expIndex = Syntax.index;
- var s = "1";
- if (expIndex < tokens.length) {
- s = "";
- while (tokens[expIndex].value != ";"
- && tokens[expIndex].value != ","
- && tokens[expIndex].value != "="
- && tokens[expIndex].value != "{") {
- if (expIndex < tokens.length) {
- if (expIndex < tokens.length) {
- s += (tokens[expIndex]).value;
- }
- expIndex++;
- if (expIndex == tokens.length) {
- break;
- }
- } else {
- break;
- }
- }
- }
- return s;
- },
-
- getConditionStr : function() {
- var count = 0;
- var conIndex = Syntax.index;
- var s = "(";
- if (conIndex < tokens.length) {
- while (count != 1) {
- if (conIndex < tokens.length) {
- if (tokens[conIndex].value == "(") {
- count--;
- }
- if (tokens[conIndex].value == ")") {
- count++;
- }
- s += (tokens[conIndex]).value;
- conIndex++;
- } else
- break;
- }
- }
- return s;
- },
- getIndexStr : function() {
- var count = 0;
- var conIndex = Syntax.index;
- var s = "";
- if (conIndex < tokens.length) {
- while (count != 1) {
- if (conIndex < tokens.length) {
- if (tokens[conIndex].value == "[") {
- count--;
- }
- if (tokens[conIndex].value == "]") {
- count++;
- }
- s += tokens[conIndex].value;
- conIndex++;
- } else
- break;
- }
- }
- return s;
- },
- getExpressionValue : function(s) {
-
- var indexOfLastParen = s.lastIndexOf(')');
- if (indexOfLastParen == s.length - 1) {
- var leftToken = new Array();
- leftToken.push("(");
- var rightToken = new Array();
- rightToken.push(")");
- var leftCount = s.split(leftToken).length - 1;
- var rightCount = s.split(rightToken).length - 1;
- if (leftCount != rightCount)
- s = s.substring(0, s.length - 1);
- }
-
- var indexOfLastBracket = s.lastIndexOf(']');
- if (indexOfLastBracket == s.length - 1) {
- var leftToken = new Array();
- leftToken.push("(");
- var rightToken = new Array();
- rightToken.push(")");
- var leftCount = s.split(leftToken).length - 1;
- var rightCount = s.split(rightToken).length - 1;
- if (leftCount != rightCount)
- s = s.substring(0, s.length - 1);
- }
-
- ExprCal.init(s);
- return ExprCal.Calculate();
- },
- gen : function(s1, s2, s3, s4) {
- Syntax.intercode.push(s1);
- Syntax.intercode.push(s2);
- Syntax.intercode.push(s3);
- Syntax.intercode.push(s4);
- },
- init : function() {
- Syntax.index = 0;
- Syntax.root = null;
- Syntax.lineNubmer = 1;
- Syntax.readall = false;
- Syntax.error = "";
- Syntax.checkStr ='';
- Syntax.varInDec =false;
- Syntax.varInAss =false;
- Syntax.isIndex =false;
- Syntax.tempName ="";
- Syntax.ifLevel =0;
- Syntax.whileLevel =0;
- Syntax.expressionVal =1;
- Syntax.iIndex =0;
- Syntax.instream =new Array(100);
- Syntax.inWrite =false;
- Syntax.intercode =new Array();
- Syntax.tableList = new Array();
- Syntax.mainTable = new SymTable();
- Syntax.table = Syntax.mainTable;
- Syntax.tableList.push(Syntax.table);
- },
- getWord : function() {
- if (Syntax.index < tokens.length) {
- Syntax.word = tokens[Syntax.index];
- }
- },
-
- nextWord : function() {
- if (Syntax.index < tokens.length) {
- Syntax.index++;
- if (Syntax.index == tokens.length) {
- Syntax.readall = true;
- }
- } else {
- Syntax.readall = true;
- return;
- }
- },
-
- run : function(tokens) {
- tokens.shift();
- tokens.pop();
- Syntax.init();
- for ( var i = 0; i < 100; i++) {
- Syntax.instream[i] = "0";
- }
-
- Syntax.root = Syntax.ParseProgram(tokens);
- },
-
- ParseProgram : function(tokens) {
- var node = new Node('Program');
- var child;
- while (Syntax.index < tokens.length && !(Syntax.readall)) {
- Syntax.getWord();
- child = Syntax.ParseStatement();
- node.children.push(child);
- }
- return node;
- },
-
- ParseStatement : function() {
- var node = new Node('Statement');
- var child;
- while (!(Syntax.readall)) {
- Syntax.getWord();
- if (Syntax.word.value == "read") {
- node.match2("read");
- child = Syntax.ParseInputStm();
- node.children.push(child);
- break;
- } else if (Syntax.word.value == "write") {
- node.match2("write");
- child = Syntax.ParseOutputStm();
- node.children.push(child);
- break;
- } else if (Syntax.word.value == "if") {
- node.match2("if");
- child = Syntax.ParseIfStm();
- node.children.push(child);
- break;
- } else if (Syntax.word.value == "while") {
- node.match2("while");
- child = Syntax.ParseWhileStm();
- node.children.push(child);
- break;
- } else if (Syntax.word.value == "int" || Syntax.word.value == "real") {
- if (Syntax.word.value == "int") {
- node.match2("int");
- } else {
- node.match2("real");
- }
-
- Syntax.item = new SymItem();
- Syntax.table.SymItemList.push(Syntax.item);
-
- Syntax.gen("new", "@item", "_", "@table");
-
- if (Syntax.word.value == "int") {
- Syntax.item.Type = SymType_INT;
-
- Syntax.gen("assign", "type", "int", "@item");
- } else {
- Syntax.item.Type = SymType_REAL;
-
- Syntax.gen("assign", "type", "real", "@item");
- }
- child = Syntax.ParseVarDeclaration();
- node.children.push(child);
- break;
- } else if (Syntax.word.type == "IDENT") {
- child = Syntax.ParseAssignment();
- node.children.push(child);
- break;
- } else if (Syntax.word.value == "{") {
- node.match2("{");
-
- Syntax.table = new SymTable();
- Syntax.tableList.push(Syntax.table);
-
- Syntax.gen("new", "@table", "_", "@tableList");
- child = Syntax.ParseBlock();
- node.children.push(child);
- break;
- } else if (word.value == ";") {
- node.match2(";");
- break;
- } else {
- Syntax.error += "<br>错误发生在第" + Syntax.word.rowNum + "行:以不合法的token开头。";
- Syntax.nextWord();
- }
- }
- return node;
- },
- ParseInputStm : function() {
- Syntax.getWord();
- var node = new Node("InputStm");
- var child;
- node.match2("(");
- Syntax.getWord();
- if (Syntax.word.value == ")") {
- Syntax.error += "<br>错误发生在第" + Syntax.word.rowNum + "行:缺少参数。";
-
- } else {
- child = Syntax.ParseVariable();
- node.children.push(child);
-
- if (Syntax.item.Type == SymType_INT) {
- Syntax.item.Val = parseInt(Syntax.instream[Syntax.iIndex]);
- } else {
- Syntax.item.Val = parseFloat(Syntax.instream[Syntax.iIndex]);
- }
- Syntax.iIndex++;
-
- Syntax.gen("read", Syntax.item.Type, "_", Syntax.item.Name);
- }
- Syntax.getWord();
- while (Syntax.word.value == ",")
- {
- node.match2(",");
- child = Syntax.ParseVariable();
- node.children.push(child);
-
- if (Syntax.item.Type == SymType_INT)
- Syntax.item.Val = parseInt(Syntax.instream[Syntax.iIndex]);
- else
- Syntax.item.Val = parseFloat(Syntax.instream[Syntax.iIndex]);
-
- Syntax.gen("read", Syntax.item.Type, "_", Syntax.item.Name);
- Syntax.iIndex++;
- Syntax.getWord();
- }
- node.match2(")");
- node.match2(";");
- return node;
- },
- ParseOutputStm : function() {
- Syntax.getWord();
-
- var node = new Node("OutputStm");
- var child;
- node.match2("(");
- Syntax.getWord();
- if (Syntax.word.value != ")") {
-
- Syntax.expressionVal = Syntax.getExpressionValue(Syntax.getExpressionStr());
-
- Syntax.gen("write", "@result", "_", "@outstream");
- Syntax.inWrite = true;
- child = Syntax.ParseExpression();
- node.children.push(child);
- } else {
- Syntax.error += "<br>错误发生在第" + Syntax.word.rowNum + "行:缺少参数。";
-
- }
- Syntax.inWrite = false;
- node.match2(")");
- node.match2(";");
- return node;
- },
- ParseIfStm : function() {
- Syntax.getWord();
-
- var node = new Node("IfStm");
- var child;
- node.match2("(");
- Syntax.getWord();
- if (Syntax.word.value != ")") {
- Syntax.expressionVal = Syntax.getExpressionValue(Syntax.getConditionStr());
-
- Syntax.ifLevel++;
- Syntax.gen("judge", "if", "@result", Syntax.ifLevel);
- child = Syntax.ParseExpression();
- node.children.push(child);
- } else {
- Syntax.error += "<br>错误发生在第" + Syntax.word.rowNum + "行:缺少逻辑表达式。";
- }
- node.match2(")");
- child = Syntax.ParseStatement();
- node.children.push(child);
-
- Syntax.gen("mark", "if", "_", Syntax.ifLevel);
- Syntax.getWord();
- if (Syntax.word.value == "else" && !(Syntax.readall))
- {
- node.match2("else");
- child = Syntax.ParseStatement();
- node.children.push(child);
- Syntax.getWord();
- }
-
- Syntax.gen("mark", "else", "_", Syntax.ifLevel);
- Syntax.ifLevel--;
- return node;
- },
- ParseWhileStm : function() {
- Syntax.getWord();
-
- var node = new Node("WhileStm");
- var child;
- node.match2("(");
- Syntax.getWord();
- if (Syntax.word.value != ")") {
- Syntax.whileLevel++;
-
- Syntax.gen("mark", "while", "begin", Syntax.whileLevel);
- Syntax.expressionVal = Syntax.getExpressionValue(Syntax.getConditionStr());
-
- Syntax.gen("judge", "while", "@result", Syntax.whileLevel);
- child = Syntax.ParseExpression();
- node.children.push(child);
- } else {
- Syntax.error += "<br>错误发生在第" + Syntax.word.rowNum + "行:缺少逻辑表达式。";
- }
- node.match2(")");
- child = Syntax.ParseStatement();
- node.children.push(child);
-
- Syntax.gen("mark", "while", "end", Syntax.whileLevel);
- Syntax.whileLevel--;
- return node;
- },
- ParseVarDeclaration : function() {
- Syntax.varInDec = true;
- Syntax.getWord();
-
- var node = new Node("VarDeclaration");
- var child;
- child = Syntax.ParseVariable();
- node.children.push(child);
- Syntax.getWord();
- if (Syntax.word.value == "=") {
- if (tokens[Syntax.index - 1].value != "]")
- {
- node.match2("=");
- Syntax.getWord();
-
- Syntax.item.Val = Syntax.getExpressionValue(Syntax
- .getExpressionStr());
-
- Syntax.gen("assign", Syntax.item.Type, "@result", Syntax.item.Name);
- child = Syntax.ParseExpression();
- node.children.push(child);
- } else {
- Syntax.error += "<br>错误发生在第" + Syntax.word.rowNum + "行:数组在声明的同时被赋值。";
- }
- }
- Syntax.getWord();
- while (Syntax.word.value == ",") {
- if (Syntax.readall == true) {
- Syntax.error += "<br>错误发生在第" + Syntax.word.rowNum + "行:出现多余的逗号。";
- break;
- }
- Syntax.getWord();
- node.match2(",");
-
- var tempType = Syntax.item.Type;
-
- Syntax.item = new SymItem();
- Syntax.table.SymItemList.push(Syntax.item);
-
- Syntax.gen("new", "@item", "_", "@table");
-
- Syntax.item.Type = tempType;
-
- Syntax.gen("assign", "type", tempType, "@item");
- child = Syntax.ParseVariable();
- node.children.push(child);
- Syntax.getWord();
- if (Syntax.word.value == "=") {
- if (tokens[Syntax.index - 1].value != "]")
- {
- node.match2("=");
- Syntax.getWord();
-
- Syntax.item.Val = Syntax.getExpressionValue(Syntax.getExpressionStr());
-
- Syntax.gen("assign", tempType, "@result", Syntax.item.Name);
- child = Syntax.ParseExpression();
- node.children.push(child);
- } else {
- Syntax.error += "<br>错误发生在第" + Syntax.word.rowNum + "行:数组在声明的同时被赋值。";
- }
- }
- Syntax.getWord();
- }
- node.match2(";");
- Syntax.varInDec = false;
- return node;
- },
- ParseAssignment : function() {
- Syntax.varInAss = true;
- Syntax.getWord();
-
- var node = new Node("Assignment");
- var child;
- child = Syntax.ParseVariable();
- node.children.push(child);
- var tempType = Syntax.item.Type;
- node.match2("=");
- Syntax.getWord();
- var itemVal = parseInt(Syntax.getExpressionValue(Syntax.getExpressionStr()));
- Syntax.item.Val = itemVal;
-
- if (Syntax.isIndex)
- {
- Syntax.gen("assign", tempType, "@result", Syntax.tempName + "[@index]");
- } else {
- Syntax.gen("assign", Syntax.item.Type, "@result", Syntax.item.Name);
- }
- Syntax.isIndex = false;
- child = Syntax.ParseExpression();
- node.children.push(child);
- node.match2(";");
- Syntax.varInAss = false;
- return node;
- },
- ParseBlock : function() {
- Syntax.getWord();
-
- var node = new Node("Block");
- var child;
- while (Syntax.word.value != "}") {
- Syntax.getWord();
- child = Syntax.ParseStatement();
- node.children.push(child);
- Syntax.getWord();
- if (Syntax.readall)
- break;
- }
- if (!(Syntax.readall)) {
- node.match2("}");
- }
- if(node==null){
- Syntax.error += "<br>错误发生在第" + Syntax.word.rowNum + "行:缺少 } 。";
- }
- Syntax.tableList.pop();
- Syntax.table = Syntax.tableList[Syntax.tableList.length - 1];
- Syntax.gen("remove", "@table", "_", "@tableList");
- return node;
- },
- ParseExpression : function() {
- Syntax.getWord();
- var node = new Node("Expression");
- var child;
- child = Syntax.ParseTerm();
- node.children.push(child);
- Syntax.getWord();
- while (Syntax.word.value == "+" || Syntax.word.value == "-" || Syntax.word.value == "<"
- || Syntax.word.value == ">" || Syntax.word.value == "==" || Syntax.word.value == "<>")
- {
- Syntax.getWord();
- if (Syntax.word.value == "+")
- node.match2("+");
- if (Syntax.word.value == "-")
- node.match2("-");
- if (word.value == "<")
- node.match2("<");
- if (Syntax.word.value == ">")
- node.match2(">");
- if (Syntax.word.value == "==")
- node.match2("==");
- if (Syntax.word.value == "<>")
- node.match2("<>");
- child = Syntax.ParseTerm();
- node.children.push(child);
- Syntax.getWord();
- }
- return node;
- },
- ParseTerm : function() {
- Syntax.getWord();
-
- var node = new Node("Term");
- var child;
- child = Syntax.ParseFactor();
- node.children.push(child);
- Syntax.getWord();
- while (Syntax.word.value == "*" || Syntax.word.value == "/")
- {
- Syntax.getWord();
- if (Syntax.word.value == "*") {
- node.match2("*");
- }
- if (Syntax.word.value == "/") {
- node.match2("/");
- }
- child = Syntax.ParseFactor();
- node.children.push(child);
- Syntax.getWord();
- }
- return node;
- },
- ParseFactor : function() {
- Syntax.getWord();
-
- var node = new Node("Factor");
- var child;
- if (Syntax.word.type == "IDENT") {
- child = Syntax.ParseVariable();
- node.children.push(child);
- } else if (Syntax.word.type == "INT" || Syntax.word.type == "REAL" || Syntax.word.value == "+"
- || Syntax.word.value == "-") {
- child = Syntax.ParseConstant();
- node.children.push(child);
- } else if (word.value == "(") {
- node.match2("(");
- if (!(Syntax.readall)) {
- child = Syntax.ParseExpression();
- node.children.push(child);
- } else {
- Syntax.error += "<br>错误发生在第" + Syntax.word.rowNum + "行:小括号不匹配。";
- }
- node.match2(")");
- } else {
- Syntax.error += "<br>错误发生在第" + Syntax.word.rowNum + "行:存在不合法的因子。";
- Syntax.nextWord();
- }
- return node;
- },
- ParseVariable : function() {
- Syntax.getWord();
- var node = new Node("Variable");
- var child;
- if (Syntax.index < tokens.length) {
- if (Syntax.varInDec == false) {
-
- Syntax.item = Syntax.LookUp(Syntax.word.value);
- if (Syntax.item == null) {
- Syntax.tempName = Syntax.word.value;
- }
- if (Syntax.index < tokens.length - 1) {
- if (tokens[Syntax.index + 1].value != "[")
- {
- node.match1("IDENT");
- if (typeof (Syntax.item) == "undefined" || Syntax.item == null)
- {
- Syntax.error += "<br>错误发生在第" + Syntax.word.rowNum + "行:使用了未声明的变量。";
- Syntax.item = Syntax.nonexistence;
- }
- } else {
- child = Syntax.ParseArray();
- node.children.push(child);
- }
- } else {
- node.match1("IDENT");
- }
- } else {
- Syntax.checkStr = Syntax.word.value;
- if (Syntax.Check(Syntax.checkStr)) {
-
- Syntax.item.Name = Syntax.word.value;
- } else
- {
- Syntax.error += "<br>错误发生在第" + Syntax.word.rowNum + "行:变量名冲突。";
- }
- if (Syntax.index < tokens.length - 1) {
- if (tokens[Syntax.index + 1].value != "[") {
-
- Syntax.gen("assign", "name", Syntax.word.value, "@item");
- node.match1("IDENT");
- } else {
- if (!(Syntax.Check(Syntax.checkStr + "[0]")))
- {
- Syntax.error += "<br>错误发生在第" + Syntax.word.rowNum + "行:变量名冲突。";
- }
- child = Syntax.ParseArray();
- node.children.push(child);
- }
- } else {
- node.match1("IDENT");
- }
- }
- }
- return node;
- },
- ParseConstant : function() {
- Syntax.getWord();
- var node = new Node("Constant");
- if (Syntax.word.value == "+") {
- node.match2("+");
- } else if (word.value == "-") {
- node.match2("-");
- }
- Syntax.getWord();
- if (Syntax.word.type == "INT") {
- node.match1("INT");
- } else {
- node.match1("REAL");
- }
- return node;
- },
- ParseArray : function() {
- Syntax.getWord();
- var node = new Node("Array");
- var child;
- node.match1("IDENT");
- node.match2("[");
- Syntax.getWord();
- if (Syntax.varInDec == true) {
- if (Syntax.Check(Syntax.checkStr + "[0]")) {
- Syntax.item.Name += "[0]";
-
- Syntax.gen("assign", "name", Syntax.item.Name, "@item");
- if (Syntax.word.type != "INT")
- {
- Syntax.error += "<br>错误发生在第" + Syntax.word.rowNum + "行:数组长度不为正整数。";
- } else {
- var length = parseInt(Syntax.word.value);
- var type = Syntax.item.Type;
- if (length < 1)
- {
- Syntax.error += "<br>错误发生在第" + Syntax.word.rowNum + "行:数组长度不为正整数。";
- } else {
- for ( var i = 1; i < length; i++) {
-
- var str = tokens[Syntax.index - 2].value + "[" + i + "]";
- Syntax.item = new SymItem(str, type, 0);
- Syntax.table.SymItemList.push(Syntax.item);
-
- Syntax.gen("new", "@item", "_", "@table");
- Syntax.gen("assign", "type", type, "@item");
- Syntax.gen("assign", "name", str, "@item");
- }
- }
- }
- }
- } else {
- var arrayIndex;
- if (Syntax.varInAss == false) {
- arrayIndex = parseInt(Syntax.getExpressionValue(Syntax
- .getIndexStr()));
- } else {
- arrayIndex = parseInt(Syntax.getExpressionValue(Syntax
- .getIndexStr()));
- Syntax.isIndex = true;
-
- Syntax.gen("assign", "int", "@result", "@index");
- }
- if (Syntax.LookUp(Syntax.tempName + "[0]") == null)
- {
- Syntax.error += "<br>错误发生在第" + Syntax.word.rowNum + "行:使用了未定义的变量。";
- Syntax.item = Syntax.nonexistence;
- } else {
- Syntax.item = Syntax.LookUp(Syntax.tempName + "[" + arrayIndex + "]");
- }
- }
- child = Syntax.ParseExpression();
- node.children.push(child);
- node.match2("]");
- return node;
- }
- }
|