Example #1
0
        private void AnalyzeBlock(string code, McClureVariable variable, string currentName, int lvl,
                                  Parser.Program currentProgram)
        {
            if (variable.J < lvl)
            {
                variable.J = lvl;
            }
            int i = 0;

            string[] stringSeparators = { "\r\n" };
            string[] lines            = code.Split(stringSeparators, StringSplitOptions.None);
            foreach (string line in lines)
            {
                foreach (Parser.Program subprogram in subprograms)
                {
                    if (subprogram != currentProgram)
                    {
                        int argumentIndex = FindArgumentIndex(variable, currentName, line, subprogram);
                        if (argumentIndex != -1)
                        {
                            variable.D++;
                            variable.AddSubprogram(subprogram);
                            if (subprogram.Arguments.Count > argumentIndex)
                            {
                                AnalyzeBlock(subprogram.BlockBeginEnd, variable, subprogram.Arguments[argumentIndex],
                                             lvl + 1, subprogram);
                            }
                        }
                    }
                }
            }
        }
Example #2
0
        private void McClureRepeat(ref string sourceCode, Parser.Program ownerProgram)
        {
            string code           = sourceCode.Substring(sourceCode.IndexOf("repeat")).Trim();
            var    clureVariables = new List <McClureVariable>();
            string untilString    = code.Substring(McCabeMetrics.GetIndexEndOfRepeat(code));

            sourceCode  = sourceCode.Substring(McCabeMetrics.GetIndexEndOfRepeat(sourceCode));
            sourceCode  = sourceCode.Substring(sourceCode.IndexOf(";") + 1);
            untilString =
                untilString.Remove(untilString.IndexOf(";")).Substring(untilString.IndexOf("until") + 5);
            string[] variablesNames = GetNamesVariables(untilString);
            foreach (string name in variablesNames)
            {
                var variable = new McClureVariable();
                variable.OwnerProgram = ownerProgram;
                variable.Name         = name;
                clureVariables.Add(variable);
                variables.Add(variable);
            }
            foreach (McClureVariable variable in clureVariables)
            {
                AnalyzeBlock(code.Substring(6).Remove(McCabeMetrics.GetIndexEndOfRepeat(code)), variable, variable.Name,
                             0,
                             ownerProgram);
            }
        }
Example #3
0
        private void McClureWhile(ref string sourceCode, Parser.Program ownerProgram)
        {
            string code           = sourceCode.Substring(sourceCode.IndexOf("while") + 5).Trim();
            var    clureVariables = new List <McClureVariable>();

            sourceCode = sourceCode.Substring(sourceCode.IndexOf("do") + 2);
            string[] variablesNames = GetNamesVariables(code.Remove(code.IndexOf("do")).Trim());
            code = code.Substring(code.IndexOf("do") + 2).Trim();
            foreach (string name in variablesNames)
            {
                var variable = new McClureVariable();
                variable.OwnerProgram = ownerProgram;
                variable.Name         = name;
                clureVariables.Add(variable);
                variables.Add(variable);
            }

            if (code.IndexOf("begin") == 0)
            {
                foreach (McClureVariable variable in clureVariables)
                {
                    AnalyzeBlock(code.Remove(Parser.GetIndexEndOfBegin(code)), variable, variable.Name, 0, ownerProgram);
                }
                sourceCode = sourceCode.Substring(Parser.GetIndexEndOfBegin(sourceCode));
            }
            else
            {
                foreach (McClureVariable variable in clureVariables)
                {
                    AnalyzeBlock(code.Remove(code.IndexOf(";") + 1), variable, variable.Name, 0, ownerProgram);
                }
                sourceCode = sourceCode.Substring(sourceCode.IndexOf(";"));
            }
        }
Example #4
0
        private static int FindArgumentIndex(McClureVariable variable, string currentName, string line,
                                             Parser.Program subprogram)
        {
            int result = -1;

            if (line.IndexOf(subprogram.Name) != -1)
            {
                if (line.IndexOf("(") != -1)
                {
                    line = line.Remove(line.IndexOf(")")).Substring(line.IndexOf("(") + 1);
                    string[] arguments = line.Split(',');
                    for (int i = 0; i < arguments.Length; i++)
                    {
                        if (arguments[i].Trim() == currentName)
                        {
                            result = i;
                        }
                    }
                }
            }
            return(result);
        }
Example #5
0
        private void McClureFor(ref string sourceCode, Parser.Program ownerProgram)
        {
            string code = sourceCode.Substring(sourceCode.IndexOf("for") + 3).Trim();

            sourceCode = sourceCode.Substring(sourceCode.IndexOf("for") + 3);
            var variable = new McClureVariable();

            variable.OwnerProgram = ownerProgram;
            variable.Name         = code.Substring(0, code.IndexOf(":")).Trim();
            code = code.Substring(code.IndexOf("do") + 2).Trim();
            if (code.IndexOf("begin") == 0)
            {
                AnalyzeBlock(code.Remove(Parser.GetIndexEndOfBegin(code)), variable, variable.Name, 0, ownerProgram);
                sourceCode = sourceCode.Substring(Parser.GetIndexEndOfBegin(sourceCode));
            }
            else
            {
                AnalyzeBlock(code.Remove(code.IndexOf(";") + 1), variable, variable.Name, 0, ownerProgram);
                sourceCode = sourceCode.Substring(sourceCode.IndexOf(";"));
            }
            variables.Add(variable);
        }
Example #6
0
        private void McClureCase(ref string sourceCode, Parser.Program ownerProgram)
        {
            string code = sourceCode.Substring(sourceCode.IndexOf("case") + 4).Trim();

            var variable = new McClureVariable();

            variable.OwnerProgram = ownerProgram;
            variable.Name         = code.Remove(code.IndexOf("of")).Trim();
            variables.Add(variable);
            sourceCode = sourceCode.Substring(sourceCode.IndexOf("of") + 2);
            code       = code.Substring(code.IndexOf("of") + 2).Trim();
            int i = 0;

            while (i < code.Length)
            {
                string currentCode = code.Substring(i);
                if (currentCode.IndexOf("end") != 0)
                {
                    if (currentCode.Trim().IndexOf(":") == 0)
                    {
                        string codeAfterValue = currentCode.Substring(currentCode.IndexOf(":") + 1);
                        if (codeAfterValue.Trim().IndexOf("begin") == 0)
                        {
                            i += Parser.GetIndexEndOfBegin(currentCode);
                        }
                        else
                        {
                            if ((codeAfterValue.IndexOf("else") != -1) &&
                                (codeAfterValue.IndexOf("else") < codeAfterValue.IndexOf(";")))
                            {
                                i += currentCode.IndexOf("else");
                            }
                            else
                            {
                                i += currentCode.IndexOf(";");
                            }
                        }
                    }
                    else
                    {
                        if (currentCode.Trim().IndexOf("else") == 0)
                        {
                            string codeAfterElse = currentCode.Substring(currentCode.IndexOf("else") + 4);
                            if (codeAfterElse.Trim().IndexOf("begin") == 0)
                            {
                                i += Parser.GetIndexEndOfBegin(currentCode);
                            }
                            else
                            {
                                i += currentCode.IndexOf(";");
                            }
                        }
                        else
                        {
                            i++;
                        }
                    }
                }
                else
                {
                    AnalyzeBlock(code.Substring(0, i + 3), variable, variable.Name, 0, ownerProgram);
                    sourceCode = sourceCode.Substring(i + 3);
                    break;
                }
            }
        }