Ejemplo n.º 1
0
        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());
        }
Ejemplo n.º 2
0
        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);
            }
        }