30 lines
1.3 KiB
C#
30 lines
1.3 KiB
C#
namespace CanonSharp.Combinator.Abstractions;
|
|
|
|
/// <summary>
|
|
/// 成功解析结果基类
|
|
/// </summary>
|
|
/// <typeparam name="TToken">输入流类型</typeparam>
|
|
/// <typeparam name="T">实际的解析结果类型</typeparam>
|
|
public interface ISuccessfulResult<TToken,out T> : IParseResult<TToken, T>
|
|
{
|
|
/// <summary>
|
|
/// 运行下一个解析器
|
|
/// </summary>
|
|
/// <param name="parser">下一个解析器</param>
|
|
/// <param name="continuation">处理解析结果的后继函数</param>
|
|
/// <typeparam name="TNext">下一个解析器返回的结果类型</typeparam>
|
|
/// <typeparam name="TResult">最终的结果类型</typeparam>
|
|
/// <returns>最终的结果</returns>
|
|
protected IParseResult<TToken, TResult> RunNext<TNext, TResult>(IParser<TToken, TNext> parser,
|
|
Func<IParseResult<TToken, TNext>, IParseResult<TToken, TResult>> continuation);
|
|
|
|
IParseResult<TToken, TResult> IParseResult<TToken, T>.Next<TNext, TResult>(
|
|
Func<T, IParser<TToken, TNext>> nextParser,
|
|
Func<IParseResult<TToken, TNext>, IParseResult<TToken, TResult>> continuation)
|
|
=> RunNext(nextParser(Value), continuation);
|
|
|
|
TResult IParseResult<TToken, T>.CaseOf<TResult>(Func<ISuccessfulResult<TToken, T>, TResult> successfulHandler,
|
|
Func<IFailedResult<TToken, T>, TResult> failedHandler)
|
|
=> successfulHandler(this);
|
|
}
|