protected sealed override Result <char, string> Run <TState>(TState state) { var result = ParsecState.AsEnumerable <char, TState>(state).Take(this._text.Length).ToArray(); var text = new string(result.Select(x => x.Current).ToArray()); return(string.Equals(text, this._text, this._comparison) ? Result.Success <char, TState, string>(text, result.Length == 0 ? state : result.Last().Next) : Result.Failure <char, TState, string>($"Expected '{this._text}' but was '{text}'", state)); }
public void TokenizedStreamTest() { // 任意のパーサを繰り返し適用した結果をソースストリームとして利用可能にします。 // 字句解析等の前段処理を可能にします。 // 空白に挟まれた文字列を1要素として返すパーサ。 var token = Many1(LetterOrDigit()).Between(Spaces()).AsString(); var source = "The quick brown fox jumps over the lazy dog"; using var stream = StringStream.Create(source); using var tokenized = ParsecState.Tokenize(stream, token); // 任意のトークンにマッチし、その長さを返すパーサ。 var parser = Many(Any <string>().Map(x => x.Length)); parser.Parse(tokenized).WillSucceed(value => value.Is(source.Split(' ').Select(x => x.Length))); }
protected sealed override Result <TToken, Unit> Run <TState>(TState state) => ParsecState.AsEnumerable <TToken, TState>(state).Take(this._count).ToArray() is var result && result.Length == this._count