Esempio n. 1
0
        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));
        }
Esempio n. 2
0
 public SubFunction()
 {
     ParsingDirection = ParsingDirection.Send; //默认解析发送
 }