public static void ParseIlSnippet(string inputText, ParsingDirection direction, Func <IlParsingUtils.IlSnippetLocation, bool> predicate, Action <IlParsingUtils.IlSnippetFinalizaton> finalization = null) { bool withinString = false; bool withinScope = false; bool atOuterBracket = false; int nestedBrackets = 0; int endIndex = inputText.Length - 1; bool wasInterupted = false; int val2 = -1; int num1 = direction == ParsingDirection.Forward ? 1 : -1; int num2 = direction == ParsingDirection.Forward ? 0 : endIndex; Func <int, bool> func = direction == ParsingDirection.Forward ? (Func <int, bool>)(i => i <= endIndex) : (Func <int, bool>)(i => i > -1); int lastPosition = -1; char ch = char.MinValue; string lastIdentifier = (string)null; int index = num2; while (func(index)) { char currentChar = inputText[index]; atOuterBracket = false; if ((int)currentChar == 39) { withinString = !withinString; if (!withinString && val2 > -1) { int val1 = index - num1; int startIndex = Math.Min(val1, val2); int num3 = Math.Max(val1, val2); lastIdentifier = val2 != val1?inputText.Substring(0, num3 + 1).Substring(startIndex) : ""; } else { lastIdentifier = (string)null; } if (withinString && (int)ch == 91) { withinScope = true; } } else { if (withinString && (int)ch == 39) { val2 = index; } if (!withinString) { val2 = -1; if (withinScope && (int)currentChar == 93) { withinScope = false; } if ((int)currentChar == 41) { atOuterBracket = nestedBrackets == 0; ++nestedBrackets; } else if ((int)currentChar == 40) { --nestedBrackets; atOuterBracket = nestedBrackets == 0; } } } if (!predicate(new IlParsingUtils.IlSnippetLocation(inputText, index, currentChar, lastIdentifier, withinString, withinScope, nestedBrackets, atOuterBracket))) { wasInterupted = true; break; } lastPosition = index; ch = currentChar; index += num1; } if (finalization == null) { return; } finalization(new IlParsingUtils.IlSnippetFinalizaton(inputText, lastPosition, wasInterupted, lastIdentifier, withinString, withinScope, nestedBrackets, atOuterBracket)); }
public SubFunction() { ParsingDirection = ParsingDirection.Send; //默认解析发送 }