//public static IParser<T2> RemapResult<T, T2>(this IParser<T> p, // Func<IInputReader, IParseResult<T>, IParseResult<T2>> remap) //{ // return new Parser<T2>(p.Name, inp => // { // var parsed = p.TryParse(inp); // if (!parsed.IsSuccess()) // { // return Parse.Error<T2>(parsed.Error, inp); // } // return remap(inp, parsed); // }); //} //public static IParser<T> Skip<T>(this IParser<T> p) //{ // return new Parser<T>($"~{p.Name}", inp => // { // var parsed = p.TryParse(inp); // if (parsed.IsSuccess()) // { // return Parse.Success<T>(parsed.Rest); // } // return parsed; // }); //} //public static IParser<T> Then<T>(this IParser<T> p1, IParser<T> p2, // Func<IEnumerable<IParseResult<T>>, T> apply) //{ // var name = $"{p1.Name}.>>{p2.Name}"; // return new Parser<T>(name, inp => // { // var parsed1 = p1.TryParse(inp); // if (!parsed1.IsSuccess()) // { // return parsed1; // } // var parsed2 = p2.TryParse(inp); // if (!parsed2.IsSuccess()) // { // return parsed2; // } // return GetAccumResult() // return apply(new[] { parsed1, parsed2 }); // }); //} //public static IParser<T> ThenLeft<T>(this IParser<T> p1, IParser<T> p2) //{ // var name = $"{p1.Name}.>>{p2.Name}"; // return new Parser<T>(name, inp => // { // var parsed1 = p1.TryParse(inp); // if (!parsed1.IsSuccess()) // { // return parsed1; // } // var parsed2 = p2.TryParse(inp); // if (!parsed2.IsSuccess()) // { // return parsed2; // } // return parsed1; // }); //} public static IEnumerable <IParseResult <T> > TryParseAllText <T>(this IParser <T> p, string code) { IInputReader inp = new StringInputReader(code); do { var parsed = p.TryParse(inp); if (!parsed.IsSuccess()) { yield return(parsed); break; } yield return(parsed); inp.AdvanceByBlanks(); } while (!inp.Eof()); }
public static IParseResult <T> TryParseText <T>(this IParser <T> p, string code) { IInputReader inp = new StringInputReader(code); return(p.TryParse(inp)); }