Boo.BooLangService.StringParsing.StringWalker.Iterate C# (CSharp) Метод

Iterate() публичный Метод

public Iterate ( string value ) : IEnumerable
value string
Результат IEnumerable
        public IEnumerable<StringPosition> Iterate(string value)
        {
            state = new Stack<StringWalkerState>();

            for (var currentIndex = 0; currentIndex < value.Length; currentIndex++)
            {
                if (abort) break;

                var currentChar = value[currentIndex];

                if (currentChar == LeftParenthesis)
                    state.Push(StringWalkerState.InsideParentheses);
                else if (currentChar == RightParenthesis && StateIs(StringWalkerState.InsideParentheses))
                    state.Pop();
                else if (currentChar == DoubleQuote && StateIs(StringWalkerState.InsideString))
                    state.Pop();
                else if (currentChar == DoubleQuote)
                    state.Push(StringWalkerState.InsideString);
                else if (currentChar == BackSlash && StateIs(StringWalkerState.InsideString))
                    currentIndex += 1; // skip next (escaped) char

                if (ShouldYield(currentChar))
                    yield return new StringPosition(currentChar, currentIndex);
            }
        }

Usage Example

Пример #1
0
        public Invocation[] GetEntityNames(string line)
        {
            var entities = new Queue<Invocation>();
            var stringWalker = new StringWalker();
            var startIndex = 0;

            line = line.Trim();

            foreach (var currentPosition in stringWalker.Iterate(line))
            {
                if (currentPosition.Character == ' ' && !stringWalker.StateIs(StringWalkerState.InsideString) && !stringWalker.StateIs(StringWalkerState.InsideParentheses))
                {
                    stringWalker.Abort();
                    return GetEntityNames(line.Substring(currentPosition.Index));
                }

                if (currentPosition.Character == '.' && stringWalker.HasNoState)
                {
                    Enqueue(entities, line.Substring(startIndex, currentPosition.Index - startIndex));
                    startIndex = currentPosition.Index + 1;
                }
            }

            Enqueue(entities, line.Substring(startIndex));

            return entities.ToArray();
        }