예제 #1
0
        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));
        }
예제 #2
0
        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)));
        }
예제 #3
0
 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