コード例 #1
0
ファイル: Parse.cs プロジェクト: frankvanbokhoven/Bitcoin-3
        public static Parser <TToken, IEnumerable <T> > Many <TToken, T>(this Parser <TToken, T> parser)
        {
            if (parser == null)
            {
                throw new ArgumentNullException(nameof(parser));
            }

            return(i =>
            {
                var rest = i;
                var result = new List <T>();
                var r = parser(i);
                while (r.IsSuccess)
                {
                    if (rest.Equals(r.Rest))
                    {
                        break;
                    }
                    result.Add(r.Value);
                    rest = r.Rest;
                    r = parser(rest);
                }

                return ParserResult <TToken, IEnumerable <T> > .Success(rest, result);
            });
        }
コード例 #2
0
        public static Parser <ScriptToken, ScriptToken> ScriptToken(Func <int, bool> predicate, string expected)
        {
            return(i =>
            {
                if (i.AtEnd)
                {
                    return ParserResult <ScriptToken, ScriptToken> .Failure(i, new [] { expected }, "Unexpected end of input");
                }

                if (predicate(i.GetCurrent().Tag))
                {
                    return ParserResult <ScriptToken, ScriptToken> .Success(i.Advance(), i.GetCurrent());
                }
                return ParserResult <ScriptToken, ScriptToken> .Failure(i, $"Unexpected {i.GetCurrent()}");
            });
        }
コード例 #3
0
        public static Parser <char, char> Char(Func <char, bool> predicate, string expected)
        {
            if (predicate == null)
            {
                throw new ArgumentNullException(nameof(predicate));
            }

            return(i =>
            {
                if (i.AtEnd)
                {
                    return ParserResult <char, char> .Failure(i, new [] { expected }, "Unexpected end of input");
                }

                if (predicate(i.GetCurrent()))
                {
                    return ParserResult <char, char> .Success(i.Advance(), i.GetCurrent());
                }

                return ParserResult <char, char> .Failure(i, new [] { expected }, $"Unexpected '{i.GetCurrent()}'");
            });
        }
コード例 #4
0
ファイル: Parse.cs プロジェクト: frankvanbokhoven/Bitcoin-3
 /// <summary>
 /// Lift to a parser monad world
 /// </summary>
 /// <param name="v"></param>
 /// <typeparam name="TToken"></typeparam>
 /// <typeparam name="T"></typeparam>
 /// <returns></returns>
 public static Parser <TToken, T> Return <TToken, T>(T v)
 => i => ParserResult <TToken, T> .Success(i, v);