feat: Grammar Parser (#3)
Reviewed-on: https://git.bupt-hpc.cn/jackfiled/CanonSharp/pulls/3 Co-authored-by: jackfiled <xcrenchangjun@outlook.com> Co-committed-by: jackfiled <xcrenchangjun@outlook.com>
This commit is contained in:
@@ -19,7 +19,7 @@ public static class ParserExtensions
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <returns></returns>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static Parser<TToken, T> Alternative<TToken, T>(this Parser<TToken, T> first, Parser<TToken, T> second)
|
||||
public static IParser<TToken, T> Alternative<TToken, T>(this IParser<TToken, T> first, IParser<TToken, T> second)
|
||||
=> new AlternativeParser<TToken, T>(first, second);
|
||||
|
||||
/// <summary>
|
||||
@@ -32,8 +32,8 @@ public static class ParserExtensions
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <returns></returns>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static Parser<TToken, T> Alternative<TToken, T>(this Parser<TToken, T> parser,
|
||||
Func<FailedResult<TToken, T>, Parser<TToken, T>> resume)
|
||||
public static IParser<TToken, T> Alternative<TToken, T>(this IParser<TToken, T> parser,
|
||||
Func<IFailedResult<TToken, T>, IParser<TToken, T>> resume)
|
||||
=> new ResumeParser<TToken, T>(parser, resume);
|
||||
|
||||
/// <summary>
|
||||
@@ -46,8 +46,8 @@ public static class ParserExtensions
|
||||
/// <typeparam name="TResult"></typeparam>
|
||||
/// <returns></returns>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static Parser<TToken, TResult> Bind<TToken, T, TResult>(this Parser<TToken, T> parser,
|
||||
Func<T, Parser<TToken, TResult>> next)
|
||||
public static IParser<TToken, TResult> Bind<TToken, T, TResult>(this IParser<TToken, T> parser,
|
||||
Func<T, IParser<TToken, TResult>> next)
|
||||
=> new BindParser<TToken, T, TResult>(parser, next);
|
||||
|
||||
/// <summary>
|
||||
@@ -60,7 +60,7 @@ public static class ParserExtensions
|
||||
/// <typeparam name="TResult"></typeparam>
|
||||
/// <returns></returns>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static Parser<TToken, TResult> Map<TToken, T, TResult>(this Parser<TToken, T> parser, Func<T, TResult> map)
|
||||
public static IParser<TToken, TResult> Map<TToken, T, TResult>(this IParser<TToken, T> parser, Func<T, TResult> map)
|
||||
=> new MapParser<TToken, T, TResult>(parser, map);
|
||||
|
||||
/// <summary>
|
||||
@@ -73,7 +73,7 @@ public static class ParserExtensions
|
||||
/// <typeparam name="TResult"></typeparam>
|
||||
/// <returns></returns>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static Parser<TToken, TResult> Map<TToken, T, TResult>(this Parser<TToken, T> parser, TResult result)
|
||||
public static IParser<TToken, TResult> Map<TToken, T, TResult>(this IParser<TToken, T> parser, TResult result)
|
||||
=> parser.Map(_ => result);
|
||||
|
||||
/// <summary>
|
||||
@@ -87,9 +87,9 @@ public static class ParserExtensions
|
||||
/// <typeparam name="TResult"></typeparam>
|
||||
/// <returns></returns>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static Parser<TToken, TResult> Next<TToken, T, TResult>(this Parser<TToken, T> parser,
|
||||
Func<T, Parser<TToken, TResult>> next,
|
||||
Func<FailedResult<TToken, T>, Parser<TToken, TResult>> failedNext)
|
||||
public static IParser<TToken, TResult> Next<TToken, T, TResult>(this IParser<TToken, T> parser,
|
||||
Func<T, IParser<TToken, TResult>> next,
|
||||
Func<IFailedResult<TToken, T>, IParser<TToken, TResult>> failedNext)
|
||||
=> new NextParser<TToken, T, TResult>(parser, next, failedNext);
|
||||
|
||||
/// <summary>
|
||||
@@ -103,8 +103,8 @@ public static class ParserExtensions
|
||||
/// <typeparam name="TResult"></typeparam>
|
||||
/// <returns></returns>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static Parser<TToken, TResult> Next<TToken, T, TResult>(this Parser<TToken, T> parser,
|
||||
Func<T, Parser<TToken, TResult>> next, Func<FailedResult<TToken, T>, TResult> failedHandler)
|
||||
public static IParser<TToken, TResult> Next<TToken, T, TResult>(this IParser<TToken, T> parser,
|
||||
Func<T, IParser<TToken, TResult>> next, Func<IFailedResult<TToken, T>, TResult> failedHandler)
|
||||
=> parser.Next(next, failedResult => Pure<TToken, TResult>(failedHandler(failedResult)));
|
||||
|
||||
/// <summary>
|
||||
@@ -118,8 +118,8 @@ public static class ParserExtensions
|
||||
/// <typeparam name="TResult"></typeparam>
|
||||
/// <returns></returns>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static Parser<TToken, TResult> Next<TToken, T, TResult>(this Parser<TToken, T> parser,
|
||||
Func<T, Parser<TToken, TResult>> next, TResult failedResult)
|
||||
public static IParser<TToken, TResult> Next<TToken, T, TResult>(this IParser<TToken, T> parser,
|
||||
Func<T, IParser<TToken, TResult>> next, TResult failedResult)
|
||||
=> parser.Next(next, _ => Pure<TToken, TResult>(failedResult));
|
||||
|
||||
/// <summary>
|
||||
@@ -133,8 +133,8 @@ public static class ParserExtensions
|
||||
/// <typeparam name="TResult"></typeparam>
|
||||
/// <returns></returns>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static Parser<TToken, TResult> Next<TToken, T, TResult>(this Parser<TToken, T> parser,
|
||||
Func<T, TResult> nextResult, Func<FailedResult<TToken, T>, Parser<TToken, TResult>> failedResume)
|
||||
public static IParser<TToken, TResult> Next<TToken, T, TResult>(this IParser<TToken, T> parser,
|
||||
Func<T, TResult> nextResult, Func<IFailedResult<TToken, T>, IParser<TToken, TResult>> failedResume)
|
||||
=> parser.Next(x => Pure<TToken, TResult>(nextResult(x)), failedResume);
|
||||
|
||||
/// <summary>
|
||||
@@ -148,8 +148,8 @@ public static class ParserExtensions
|
||||
/// <typeparam name="TResult"></typeparam>
|
||||
/// <returns></returns>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static Parser<TToken, TResult> Next<TToken, T, TResult>(this Parser<TToken, T> parser,
|
||||
Func<T, TResult> nextResult, Func<FailedResult<TToken, T>, TResult> failedResult)
|
||||
public static IParser<TToken, TResult> Next<TToken, T, TResult>(this IParser<TToken, T> parser,
|
||||
Func<T, TResult> nextResult, Func<IFailedResult<TToken, T>, TResult> failedResult)
|
||||
=> new SuccessfulMapParser<TToken, T, TResult>(parser, nextResult, failedResult);
|
||||
|
||||
/// <summary>
|
||||
@@ -163,7 +163,7 @@ public static class ParserExtensions
|
||||
/// <typeparam name="TResult"></typeparam>
|
||||
/// <returns></returns>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static Parser<TToken, TResult> Next<TToken, T, TResult>(this Parser<TToken, T> parser,
|
||||
public static IParser<TToken, TResult> Next<TToken, T, TResult>(this IParser<TToken, T> parser,
|
||||
Func<T, TResult> successfulHandler, TResult failedResult)
|
||||
=> parser.Next(successfulHandler, _ => failedResult);
|
||||
|
||||
@@ -181,8 +181,8 @@ public static class ParserExtensions
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <returns></returns>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static Parser<TToken, T> Do<TToken, T>(this Parser<TToken, T> parser, Action<T> successfulAction,
|
||||
Action<FailedResult<TToken, T>> failedAction)
|
||||
public static IParser<TToken, T> Do<TToken, T>(this IParser<TToken, T> parser, Action<T> successfulAction,
|
||||
Action<IFailedResult<TToken, T>> failedAction)
|
||||
=> new DoParser<TToken, T>(parser, successfulAction, failedAction);
|
||||
|
||||
/// <summary>
|
||||
@@ -194,7 +194,7 @@ public static class ParserExtensions
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <returns></returns>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static Parser<TToken, T> Do<TToken, T>(this Parser<TToken, T> parser, Action<T> successfulAction)
|
||||
public static IParser<TToken, T> Do<TToken, T>(this IParser<TToken, T> parser, Action<T> successfulAction)
|
||||
=> parser.Do(successfulAction, _ => { });
|
||||
|
||||
/// <summary>
|
||||
@@ -206,7 +206,7 @@ public static class ParserExtensions
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <returns></returns>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static Parser<TToken, T> LookAhead<TToken, T>(this Parser<TToken, T> parser)
|
||||
public static IParser<TToken, T> LookAhead<TToken, T>(this IParser<TToken, T> parser)
|
||||
=> new LookAheadParser<TToken, T>(parser);
|
||||
|
||||
/// <summary>
|
||||
@@ -219,7 +219,7 @@ public static class ParserExtensions
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <returns></returns>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static Parser<TToken, T> Not<TToken, TIgnore, T>(this Parser<TToken, TIgnore> parser, T result)
|
||||
public static IParser<TToken, T> Not<TToken, TIgnore, T>(this IParser<TToken, TIgnore> parser, T result)
|
||||
=> new ReverseParser<TToken, TIgnore, T>(parser, result);
|
||||
|
||||
/// <summary>
|
||||
@@ -231,21 +231,21 @@ public static class ParserExtensions
|
||||
/// <typeparam name="TIgnore"></typeparam>
|
||||
/// <returns></returns>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static Parser<TToken, Unit> Not<TToken, TIgnore>(this Parser<TToken, TIgnore> parser)
|
||||
public static IParser<TToken, Unit> Not<TToken, TIgnore>(this IParser<TToken, TIgnore> parser)
|
||||
=> parser.Not(Unit.Instance);
|
||||
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static Parser<TToken, T> Try<TToken, T>(this Parser<TToken, T> parser,
|
||||
Func<FailedResult<TToken, T>, T> resume)
|
||||
public static IParser<TToken, T> Try<TToken, T>(this IParser<TToken, T> parser,
|
||||
Func<IFailedResult<TToken, T>, T> resume)
|
||||
=> new TryParser<TToken, T>(parser, resume);
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static Parser<TToken, T> Try<TToken, T>(this Parser<TToken, T> parser, T result)
|
||||
public static IParser<TToken, T> Try<TToken, T>(this IParser<TToken, T> parser, T result)
|
||||
=> parser.Try(_ => result);
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static Parser<TToken, bool> Try<TToken, T>(this Parser<TToken, T> parser)
|
||||
public static IParser<TToken, bool> Try<TToken, T>(this IParser<TToken, T> parser)
|
||||
=> parser.Next(_ => true, false).Try(false);
|
||||
|
||||
#endregion
|
||||
@@ -262,8 +262,8 @@ public static class ParserExtensions
|
||||
/// <typeparam name="TRight"></typeparam>
|
||||
/// <returns></returns>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static Parser<TToken, TLeft> Left<TToken, TLeft, TRight>(this Parser<TToken, TLeft> left,
|
||||
Parser<TToken, TRight> right)
|
||||
public static IParser<TToken, TLeft> Left<TToken, TLeft, TRight>(this IParser<TToken, TLeft> left,
|
||||
IParser<TToken, TRight> right)
|
||||
=> left.Bind(right.Map);
|
||||
|
||||
/// <summary>
|
||||
@@ -276,12 +276,12 @@ public static class ParserExtensions
|
||||
/// <typeparam name="TRight"></typeparam>
|
||||
/// <returns></returns>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static Parser<TToken, TRight> Right<TToken, TLeft, TRight>(this Parser<TToken, TLeft> left,
|
||||
Parser<TToken, TRight> right)
|
||||
public static IParser<TToken, TRight> Right<TToken, TLeft, TRight>(this IParser<TToken, TLeft> left,
|
||||
IParser<TToken, TRight> right)
|
||||
=> left.Bind(_ => right);
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private static Parser<TToken, IEnumerable<T>> ManyRecursively<TToken, T>(this Parser<TToken, T> parser,
|
||||
private static IParser<TToken, IEnumerable<T>> ManyRecursively<TToken, T>(this IParser<TToken, T> parser,
|
||||
IEnumerable<T> result)
|
||||
=> parser.Next(x => parser.ManyRecursively(result.Append(x)), result);
|
||||
|
||||
@@ -293,7 +293,7 @@ public static class ParserExtensions
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <returns></returns>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static Parser<TToken, IEnumerable<T>> Many<TToken, T>(this Parser<TToken, T> parser)
|
||||
public static IParser<TToken, IEnumerable<T>> Many<TToken, T>(this IParser<TToken, T> parser)
|
||||
=> parser.ManyRecursively([]);
|
||||
|
||||
/// <summary>
|
||||
@@ -304,7 +304,7 @@ public static class ParserExtensions
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <returns></returns>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static Parser<TToken, IEnumerable<T>> Many1<TToken, T>(this Parser<TToken, T> parser)
|
||||
public static IParser<TToken, IEnumerable<T>> Many1<TToken, T>(this IParser<TToken, T> parser)
|
||||
=> parser.Bind(x => parser.ManyRecursively([x]));
|
||||
|
||||
/// <summary>
|
||||
@@ -317,7 +317,7 @@ public static class ParserExtensions
|
||||
/// <typeparam name="TIgnore"></typeparam>
|
||||
/// <returns></returns>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static Parser<TToken, Unit> SkipMany<TToken, TIgnore>(this Parser<TToken, TIgnore> parser)
|
||||
public static IParser<TToken, Unit> SkipMany<TToken, TIgnore>(this IParser<TToken, TIgnore> parser)
|
||||
=> Fix<TToken, Unit>(self => parser.Next(_ => self, Unit.Instance));
|
||||
|
||||
/// <summary>
|
||||
@@ -330,11 +330,11 @@ public static class ParserExtensions
|
||||
/// <typeparam name="TIgnore"></typeparam>
|
||||
/// <returns></returns>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static Parser<TToken, Unit> SkipMany1<TToken, TIgnore>(this Parser<TToken, TIgnore> parser)
|
||||
public static IParser<TToken, Unit> SkipMany1<TToken, TIgnore>(this IParser<TToken, TIgnore> parser)
|
||||
=> parser.Right(parser.SkipMany());
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private static Parser<TToken, T> ChainRecursively<TToken, T>(Func<T, Parser<TToken, T>> chain, T value)
|
||||
private static IParser<TToken, T> ChainRecursively<TToken, T>(Func<T, IParser<TToken, T>> chain, T value)
|
||||
=> chain(value).Next(x => ChainRecursively(chain, x), value);
|
||||
|
||||
/// <summary>
|
||||
@@ -347,12 +347,12 @@ public static class ParserExtensions
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <returns></returns>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static Parser<TToken, T> Chain<TToken, T>(this Parser<TToken, T> parser, Func<T, Parser<TToken, T>> chain)
|
||||
public static IParser<TToken, T> Chain<TToken, T>(this IParser<TToken, T> parser, Func<T, IParser<TToken, T>> chain)
|
||||
=> parser.Bind(x => ChainRecursively(chain, x));
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private static Parser<TToken, IEnumerable<T>> ManyTillRecursively<TToken, T, TIgnore>(this Parser<TToken, T> parser,
|
||||
Parser<TToken, TIgnore> terminator, IEnumerable<T> result)
|
||||
private static IParser<TToken, IEnumerable<T>> ManyTillRecursively<TToken, T, TIgnore>(this IParser<TToken, T> parser,
|
||||
IParser<TToken, TIgnore> terminator, IEnumerable<T> result)
|
||||
=> terminator.Next(_ => Pure<TToken, IEnumerable<T>>(result),
|
||||
_ => parser.Bind(x => parser.ManyTillRecursively(terminator, result.Append(x))));
|
||||
|
||||
@@ -367,8 +367,8 @@ public static class ParserExtensions
|
||||
/// <typeparam name="TIgnore"></typeparam>
|
||||
/// <returns></returns>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static Parser<TToken, IEnumerable<T>> ManyTill<TToken, T, TIgnore>(this Parser<TToken, T> parser,
|
||||
Parser<TToken, TIgnore> terminator)
|
||||
public static IParser<TToken, IEnumerable<T>> ManyTill<TToken, T, TIgnore>(this IParser<TToken, T> parser,
|
||||
IParser<TToken, TIgnore> terminator)
|
||||
=> parser.ManyTillRecursively(terminator, []);
|
||||
|
||||
/// <summary>
|
||||
@@ -382,8 +382,8 @@ public static class ParserExtensions
|
||||
/// <typeparam name="TIgnore"></typeparam>
|
||||
/// <returns></returns>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static Parser<TToken, IEnumerable<T>> Many1Till<TToken, T, TIgnore>(this Parser<TToken, T> parser,
|
||||
Parser<TToken, TIgnore> terminator)
|
||||
public static IParser<TToken, IEnumerable<T>> Many1Till<TToken, T, TIgnore>(this IParser<TToken, T> parser,
|
||||
IParser<TToken, TIgnore> terminator)
|
||||
=> parser.Bind(x => parser.ManyTillRecursively(terminator, [x]));
|
||||
|
||||
/// <summary>
|
||||
@@ -397,8 +397,8 @@ public static class ParserExtensions
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <returns></returns>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static Parser<TToken, T> SkipTill<TToken, TIgnore, T>(this Parser<TToken, TIgnore> parser,
|
||||
Parser<TToken, T> terminator)
|
||||
public static IParser<TToken, T> SkipTill<TToken, TIgnore, T>(this IParser<TToken, TIgnore> parser,
|
||||
IParser<TToken, T> terminator)
|
||||
=> Fix<TToken, T>(self => terminator | parser.Right(self));
|
||||
|
||||
/// <summary>
|
||||
@@ -412,8 +412,8 @@ public static class ParserExtensions
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <returns></returns>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static Parser<TToken, T> Skip1Till<TToken, TIgnore, T>(this Parser<TToken, TIgnore> parser,
|
||||
Parser<TToken, T> terminator)
|
||||
public static IParser<TToken, T> Skip1Till<TToken, TIgnore, T>(this IParser<TToken, TIgnore> parser,
|
||||
IParser<TToken, T> terminator)
|
||||
=> parser.Right(parser.SkipTill(terminator));
|
||||
|
||||
/// <summary>
|
||||
@@ -424,7 +424,7 @@ public static class ParserExtensions
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <returns></returns>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static Parser<TToken, T> Match<TToken, T>(this Parser<TToken, T> parser)
|
||||
public static IParser<TToken, T> Match<TToken, T>(this IParser<TToken, T> parser)
|
||||
=> SkipTill(Any<TToken>(), parser);
|
||||
|
||||
/// <summary>
|
||||
@@ -440,8 +440,8 @@ public static class ParserExtensions
|
||||
/// <typeparam name="TRight"></typeparam>
|
||||
/// <returns></returns>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static Parser<TToken, IEnumerable<T>> Quote<TToken, T, TLeft, TRight>(this Parser<TToken, T> parser,
|
||||
Parser<TToken, TLeft> left, Parser<TToken, TRight> right)
|
||||
public static IParser<TToken, IEnumerable<T>> Quote<TToken, T, TLeft, TRight>(this IParser<TToken, T> parser,
|
||||
IParser<TToken, TLeft> left, IParser<TToken, TRight> right)
|
||||
=> left.Right(parser.ManyTill(right));
|
||||
|
||||
/// <summary>
|
||||
@@ -454,8 +454,8 @@ public static class ParserExtensions
|
||||
/// <typeparam name="TQuote"></typeparam>
|
||||
/// <returns></returns>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static Parser<TToken, IEnumerable<T>> Quote<TToken, T, TQuote>(this Parser<TToken, T> parser,
|
||||
Parser<TToken, TQuote> quotedParser)
|
||||
public static IParser<TToken, IEnumerable<T>> Quote<TToken, T, TQuote>(this IParser<TToken, T> parser,
|
||||
IParser<TToken, TQuote> quotedParser)
|
||||
=> parser.Quote(quotedParser, quotedParser);
|
||||
|
||||
/// <summary>
|
||||
@@ -470,8 +470,8 @@ public static class ParserExtensions
|
||||
/// <typeparam name="TSeparator"></typeparam>
|
||||
/// <returns></returns>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static Parser<TToken, IEnumerable<T>> SeparatedBy1<TToken, T, TSeparator>(this Parser<TToken, T> parser,
|
||||
Parser<TToken, TSeparator> separator)
|
||||
public static IParser<TToken, IEnumerable<T>> SeparatedBy1<TToken, T, TSeparator>(this IParser<TToken, T> parser,
|
||||
IParser<TToken, TSeparator> separator)
|
||||
=> parser.Bind(x => separator.Right(parser).ManyRecursively([x]));
|
||||
|
||||
/// <summary>
|
||||
@@ -486,8 +486,8 @@ public static class ParserExtensions
|
||||
/// <typeparam name="TSeparator"></typeparam>
|
||||
/// <returns></returns>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static Parser<TToken, IEnumerable<T>> SeparatedBy<TToken, T, TSeparator>(this Parser<TToken, T> parser,
|
||||
Parser<TToken, TSeparator> separator)
|
||||
public static IParser<TToken, IEnumerable<T>> SeparatedBy<TToken, T, TSeparator>(this IParser<TToken, T> parser,
|
||||
IParser<TToken, TSeparator> separator)
|
||||
=> parser.SeparatedBy1(separator).Try([]);
|
||||
|
||||
/// <summary>
|
||||
@@ -502,8 +502,8 @@ public static class ParserExtensions
|
||||
/// <typeparam name="TSeparator"></typeparam>
|
||||
/// <returns></returns>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static Parser<TToken, IEnumerable<T>> EndBy<TToken, T, TSeparator>(this Parser<TToken, T> parser,
|
||||
Parser<TToken, TSeparator> separator)
|
||||
public static IParser<TToken, IEnumerable<T>> EndBy<TToken, T, TSeparator>(this IParser<TToken, T> parser,
|
||||
IParser<TToken, TSeparator> separator)
|
||||
=> parser.Many().Left(separator);
|
||||
|
||||
/// <summary>
|
||||
@@ -518,8 +518,8 @@ public static class ParserExtensions
|
||||
/// <typeparam name="TSeparator"></typeparam>
|
||||
/// <returns></returns>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static Parser<TToken, IEnumerable<T>> EndBy1<TToken, T, TSeparator>(this Parser<TToken, T> parser,
|
||||
Parser<TToken, TSeparator> separator)
|
||||
public static IParser<TToken, IEnumerable<T>> EndBy1<TToken, T, TSeparator>(this IParser<TToken, T> parser,
|
||||
IParser<TToken, TSeparator> separator)
|
||||
=> parser.Many1().Left(separator);
|
||||
|
||||
/// <summary>
|
||||
@@ -534,8 +534,8 @@ public static class ParserExtensions
|
||||
/// <typeparam name="TSeparator"></typeparam>
|
||||
/// <returns></returns>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static Parser<TToken, IEnumerable<T>> SeparatedOrEndBy1<TToken, T, TSeparator>(this Parser<TToken, T> parser,
|
||||
Parser<TToken, TSeparator> separator)
|
||||
public static IParser<TToken, IEnumerable<T>> SeparatedOrEndBy1<TToken, T, TSeparator>(this IParser<TToken, T> parser,
|
||||
IParser<TToken, TSeparator> separator)
|
||||
=> parser.SeparatedBy1(separator).Left(separator.Try());
|
||||
|
||||
/// <summary>
|
||||
@@ -550,8 +550,8 @@ public static class ParserExtensions
|
||||
/// <typeparam name="TSeparator"></typeparam>
|
||||
/// <returns></returns>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static Parser<TToken, IEnumerable<T>> SeparatedOrEndBy<TToken, T, TSeparator>(this Parser<TToken, T> parser,
|
||||
Parser<TToken, TSeparator> separator)
|
||||
public static IParser<TToken, IEnumerable<T>> SeparatedOrEndBy<TToken, T, TSeparator>(this IParser<TToken, T> parser,
|
||||
IParser<TToken, TSeparator> separator)
|
||||
=> parser.SeparatedOrEndBy1(separator).Try([]);
|
||||
|
||||
#endregion
|
||||
@@ -559,13 +559,13 @@ public static class ParserExtensions
|
||||
#region LINQ
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static Parser<TToken, TResult> Select<TToken, T, TResult>(this Parser<TToken, T> parser,
|
||||
public static IParser<TToken, TResult> Select<TToken, T, TResult>(this IParser<TToken, T> parser,
|
||||
Func<T, TResult> selector)
|
||||
=> parser.Map(selector);
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static Parser<TToken, TResult> SelectMany<TToken, T, TIntermediate, TResult>(this Parser<TToken, T> parser,
|
||||
Func<T, Parser<TToken, TIntermediate>> selector, Func<T, TIntermediate, TResult> projector)
|
||||
public static IParser<TToken, TResult> SelectMany<TToken, T, TIntermediate, TResult>(this IParser<TToken, T> parser,
|
||||
Func<T, IParser<TToken, TIntermediate>> selector, Func<T, TIntermediate, TResult> projector)
|
||||
=> parser.Bind(x => selector(x).Map(y => projector(x, y)));
|
||||
|
||||
#endregion
|
||||
|
Reference in New Issue
Block a user