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()); } }
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()); }
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); }