public IResult <TOutput> Parse(IParseState <TInput> state) { Assert.ArgumentNotNull(state, nameof(state)); var startCheckpoint = state.Input.Checkpoint(); try { var seqState = new State <TInput>(state); var result = Function(seqState); return(state.Success(this, result, seqState.Consumed, startCheckpoint.Location)); } catch (ParseFailedException spe) { // This exception is part of normal flow-control for this parser // Other exceptions bubble up like normal. startCheckpoint.Rewind(); if (spe.Result != null) { var result = spe.Result; state.Log(this, $"Parse failed during sequential callback: {result}\n\n{spe.StackTrace}"); return(state.Fail(this, $"Error during parsing: {result.Parser} {result.ErrorMessage} at {result.Location}")); } state.Log(this, $"Failure triggered during sequential callback: {spe.Message}"); return(state.Fail(this, $"Failure during parsing: {spe.Message}")); } catch (Exception e) { startCheckpoint.Rewind(); state.Log(this, $"Parse failed during sequential callback: {e.Message}"); throw; } }
/// <summary> /// Create a Failure result. /// </summary> /// <typeparam name="TInput"></typeparam> /// <param name="state"></param> /// <param name="parser"></param> /// <param name="error"></param> /// <param name="location"></param> /// <param name="data"></param> /// <returns></returns> public static IResult Fail <TInput>(this IParseState <TInput> state, IParser <TInput> parser, string error, Location location, IReadOnlyList <object>?data = null) { state.Log(parser, "Failed with error " + error); return(new FailureResult <object>(parser, location, error, data)); }
/// <summary> /// Create a Success result. /// </summary> /// <typeparam name="TInput"></typeparam> /// <param name="state"></param> /// <param name="parser"></param> /// <param name="output"></param> /// <param name="consumed"></param> /// <param name="location"></param> /// <param name="data"></param> /// <returns></returns> public static IResult <object> Success <TInput>(this IParseState <TInput> state, IParser <TInput> parser, object output, int consumed, Location location, IReadOnlyList <object>?data = null) { state.Log(parser, "Succeeded"); return(new SuccessResult <object>(parser, output, location, consumed, data)); }