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); } } } } } }
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); } }
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(";")); } }
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); }
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); }
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; } } }