/*выводит переменные и их характеристики*/ static void PrintVaribles(Vareble[] arr) { for (int i = 0; i < arr.Length; i++) { if (arr[i].kind == VaribleKind.Испоьзуемая) arr[i].kind = arr[i].kind | VaribleKind.Модифицируемая; Console.WriteLine("{0} {1}", arr[i].name, arr[i].kind); } CalculateChepinValue(arr); }
/*добавляет новый элемент в массив строк*/ static void AddToVarArray(ref Vareble[] arr, string str) { Array.Resize(ref arr, arr.Length + 1); arr[arr.Length - 1] = new Vareble(str, VaribleKind.Неиспользуемая); }
/*выписывает все переменные, стоящие после ближайшего слова var, в массив VariblesArr*/ static void FindVaribles(ref string str, ref int pos, ref Vareble[] varArray) { string ident; do { do { ident = FindNextIdentifier(ref str, ref pos, false); AddToVarArray(ref varArray, ident); } while (FindNextSymbol(ref str, ref pos) != ':'); while (FindNextSymbol(ref str, ref pos) != ';') ; //пропускаем тип переменных ident = FindNextIdentifier(ref str, ref pos, true); } while (!FindWordInArray(ref ident, ref DescriptionWords)); //пока не найден новый раздел описания }
/*инициализирует вид переменной с именем name в массиве arr*/ static bool DetermineVaribleInArr(ref Vareble[] arr, ref string name, VaribleKind kind) { int i = 0; bool result = false; while ((i < arr.Length) && !result) { result = String.Compare(arr[i].name, name, true) == 0; if (result) arr[i].kind = arr[i].kind | kind; i++; } return result; }
static void CalculateChepinValue(Vareble[] arr) { int P, M, C, T; P = M = C = T = 0; for (int i = 0; i < arr.Length; i++) if ((arr[i].kind & VaribleKind.Испоьзуемая) != 0) { if ((arr[i].kind & VaribleKind.Вводимая) != 0) P++; if ((arr[i].kind & VaribleKind.Модифицируемая) != 0) M++; if ((arr[i].kind & VaribleKind.Управляющая) != 0) C++; } else T++; double result = P + 2 * M + 3 * C + 0.5 * T; PrintValues(P, M, C, T, result); totalP += P; totalM += M; totalC += C; totalT += T; ChepinValue += result; }
/*анализирует программный код находя в нём основные разделы описания*/ static void AnalyzeProgram(ref string str, ref int pos) { bool global = true; string ident = FindNextIdentifier(ref str, ref pos, false); while (ident != null) { switch (ident.ToLower()) { case "var": if (global) FindVaribles(ref str, ref pos, ref GlobalVaribles); else FindVaribles(ref str, ref pos, ref LocalVaribles); break; case "function": global = false; LocalVaribles = new Vareble[0]; AnalayzeMethodHead(ref str, ref pos); AddToVarArray(ref LocalVaribles, "Result"); DetermineVarible("Result", VaribleKind.Испоьзуемая); break; case "procedure": global = false; LocalVaribles = new Vareble[0]; AnalayzeMethodHead(ref str, ref pos); break; case "begin": beginEndCounter++; while (beginEndCounter != 0) AnalyzeOperator(ref str, ref pos); if (!global) PrintVaribles(LocalVaribles); LocalVaribles = new Vareble[0]; global = true; break; default: break; } ident = FindNextIdentifier(ref str, ref pos, false); } }