Example #1
0
        public string Read(Predicate <char> predicate, bool inline = true)
        {
            using (this.RecordReadRange())
            {
                var result = new StringBuilder();
                while (!this.EndOfInput)
                {
                    var chr = this.Peek();

                    if (!Scanner.CheckInline(chr, inline))
                    {
                        break;
                    }

                    if (!predicate(chr))
                    {
                        break;
                    }

                    result.Append(chr);
                    this.MoveNext();
                }

                return(result.ToString());
            }
        }
Example #2
0
        public string Peek(int length, bool inline = true)
        {
            var savedPointer = _textPointer;

            var result = new StringBuilder();

            while (!this.EndOfInput && length > 0)
            {
                var chr = this.Peek();

                if (!Scanner.CheckInline(chr, inline))
                {
                    break;
                }

                result.Append(chr);
                this.MoveNext();

                --length;
            }

            this.SetPointer(savedPointer);

            return(result.ToString());
        }
Example #3
0
        public ParenthesisReadResult TryReadParenthesis(out string result,
                                                        char open  = '(',
                                                        char close = ')',
                                                        bool includeParenthesis = false,
                                                        bool allowNesting       = true,
                                                        bool inline             = true)
        {
            Anchor anchor = null;

            if (includeParenthesis)
            {
                anchor = this.MakeAnchor();
            }

            if (!this.Expect(open))
            {
                result = string.Empty;
                return(ParenthesisReadResult.MissingOpen);
            }

            if (!includeParenthesis)
            {
                anchor = this.MakeAnchor();
            }

            var builder = new StringBuilder();

            if (includeParenthesis)
            {
                builder.Append(open);
            }

            var nestLevel = 1;  // won't be increased if allowNesting is false

            while (!this.EndOfInput)
            {
                var chr = this.Peek();

                if (!Scanner.CheckInline(chr, inline))
                {
                    this.MoveNext();
                    result = builder.ToString();
                    return(ParenthesisReadResult.MissingClose);
                }

                if (chr == open && allowNesting)
                {
                    ++nestLevel;
                }
                else if (chr == close)
                {
                    --nestLevel;
                    if (nestLevel == 0)
                    {
                        if (includeParenthesis)
                        {
                            builder.Append(this.Read());
                            this.LastReadRange = anchor.Range;
                        }
                        else
                        {
                            this.LastReadRange = anchor.Range;
                            this.MoveNext();
                        }

                        break;
                    }
                }

                builder.Append(this.Read());
            }

            result = builder.ToString();
            return(nestLevel == 0 ? ParenthesisReadResult.Success : ParenthesisReadResult.MissingClose);
        }