public string Parse(string code) { calledProcedures = new List <string>(); declaredProcedures = new List <string>(); firstLineOfProcedure = new List <int>(); pkb = new Pkb(); lastParent = ""; currentProcedure = ""; currentIndex = 0; currentLine = 0; currentLevel = 0; wordsInCode = null; wordsInCode = GetWordsInCode(code); while (currentIndex < wordsInCode.Length) { ParseProcedure(); } foreach (string p in calledProcedures) { if (!declaredProcedures.Contains(p)) { throw new SourceCodeException("Procedure: " + p + " is called but not delcared"); } } //if (pkb.GetNumberOfProcs() > 1) //{ // string firstProcedure = pkb.GetProcName(0); // var calledProcedures = pkb.GetCalled(firstProcedure); // foreach (string calledProcedure in calledProcedures) // { // int callLine = pkb.IsCalls(firstProcedure, calledProcedure); // if (callLine > 0) // { // SetRecursiveModifiesAndUses(callLine, calledProcedure); // } // } //} //Trace.WriteLine("PROC TABLE:"); //for (int i = 0; i < pkb.GetNumberOfProcs(); i++) //{ // Trace.WriteLine(firstLineOfProcedure[i] + " " + pkb.GetProcName(i)); //} //Trace.WriteLine("VAR TABLE:"); //for (int i = 0; i < pkb.GetNumberOfVars(); i++) //{ // Trace.WriteLine(pkb.GetVarName(i)); //} //Trace.WriteLine("MODIFIES TABLE:"); //pkb.PrintModifiesTable(); //Trace.WriteLine("USES TABLE:"); //pkb.PrintUsesTable(); //Trace.WriteLine("CALLS TABLE:"); //pkb.PrintCallsTable(); return(GetParsedSouceCode()); }
public string PrintResult() { result = string.Empty; if (queryPreProcessor.ReturnTypeIsBoolean()) { result = queryResult.resultBoolean.ToString().ToLower(); return(result); } else if (queryPreProcessor.returnList.Count == 1) { List <TNode> collection; var returnList = queryPreProcessor.returnList; foreach (var v in returnList) { if (!queryResult.DeclarationWasDeterminated(v.Key)) { collection = astManager.GetNodes(v.Value); queryEvaluator.UpdateResultTable(collection, v.Key); } } if (!queryResult.resultTableList.Any()) { return("none"); } var returnElement = queryPreProcessor.returnList.First(); if (!returnElement.Key.Contains('.')) { List <TNode> resultList = new List <TNode>(); if (queryResult.DeclarationWasDeterminated(returnElement.Key)) { int indexOfDeclaration = queryResult.FindIndexOfDeclaration(returnElement.Key); foreach (var record in queryResult.resultTableList) { resultList.Add(record[indexOfDeclaration]); } resultList = resultList.Distinct().ToList(); } else { resultList = astManager.GetNodes(returnElement.Value); } if (!resultList.Any()) { result = "none"; return(result); } else if (returnElement.Value == Entity.procedure) { foreach (var p in resultList) { result += Pkb.GetProcName((int)p.indexOfName) + ", "; } } else if (returnElement.Value == Entity.constant) { foreach (var cs in resultList) { result += cs.value + ", "; } } else if (returnElement.Value == Entity.variable) { foreach (var v in resultList) { result += Pkb.GetVarName((int)v.indexOfName) + ", "; } } else { foreach (var r in resultList) { result += r.programLine + ", "; } } result = result.Substring(0, result.Length - 2); return(result); } else { List <TNode> resultList = new List <TNode>(); string key = returnElement.Key.Substring(0, returnElement.Key.IndexOf('.')); string attr = returnElement.Key.Substring(returnElement.Key.IndexOf('.') + 1); if (queryResult.DeclarationWasDeterminated(key)) { int indexOfDeclaration = queryResult.FindIndexOfDeclaration(key); foreach (var record in queryResult.resultTableList) { resultList.Add(record[indexOfDeclaration]); } resultList = resultList.Distinct().ToList(); } else { resultList = astManager.GetNodes(returnElement.Value); } if (!resultList.Any()) { result = "none"; return(result); } else if (returnElement.Value == Entity.procedure || returnElement.Value == Entity.call) { foreach (var pc in resultList) { result += Pkb.GetProcName((int)pc.indexOfName) + ", "; } } else if (returnElement.Value == Entity.constant) { foreach (var cs in resultList) { result += cs.value + ", "; } } else if (returnElement.Value == Entity.variable) { foreach (var v in resultList) { result += Pkb.GetVarName((int)v.indexOfName) + ", "; } } else { foreach (var r in resultList) { result += r.programLine + ", "; } } result = result.Substring(0, result.Length - 2); return(result); } } else { List <TNode> collection; var returnList = queryPreProcessor.returnList; foreach (var v in returnList) { if (!queryResult.DeclarationWasDeterminated(v.Key)) { collection = astManager.GetNodes(v.Value); queryEvaluator.UpdateResultTable(collection, v.Key); } } if (!queryResult.resultTableList.Any()) { return("none"); } List <(int, (string, string))> indexList = new List <(int, (string, string))>(); foreach (var v in returnList) { indexList.Add((queryResult.FindIndexOfDeclaration(v.Key), (v.Key, v.Value))); } foreach (var r in queryResult.resultTableList) { foreach (var i in indexList) { switch (queryResult.declarationsTable[i.Item1].value) { case Entity.procedure: result += Pkb.GetProcName((int)r[i.Item1].indexOfName) + " "; break; case Entity.variable: result += Pkb.GetVarName((int)r[i.Item1].indexOfName) + " "; break; case Entity.constant: result += r[i.Item1].value + " "; break; case Entity.call: if (i.Item2.Item1.Contains('.')) { result += Pkb.GetProcName((int)r[i.Item1].indexOfName) + " "; } else { result += r[i.Item1].programLine + " "; } break; default: result += r[i.Item1].programLine + " "; break; } } result = result.Substring(0, result.Length - 1); result += ", "; } if (result.Length > 2) { result = result.Substring(0, result.Length - 2); } else { result = "none"; } return(result); } }