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