protected T Parse <T>(IRunner runner, string data) where T : class { var captures = new List <Capture>(); var result = runner.Run(data, captures); if (result.IsSuccessful) { var iterator = new CaptureIterator <Expression>(data, captures); var output = BuildTree(iterator); if (output as T == null) { throw new PegParsingException($"Unable to parse PEG: {output}"); } return(output as T); } else { var near = data.Substring(result.InputPosition); if (near.Length > 10) { near = near.Substring(0, 10); } throw new PegParsingException($"Parsing error at character {result.InputPosition}. {runner.ExplainResult(result, data)} near {near}"); } }
protected List <Operator> Parse(IRunner runner, string data) { var captures = new List <Capture>(); var result = runner.Run(data, captures); if (!result.IsSuccessful || result.InputPosition < data.Length) { throw new PegParsingException($"Parsing error at character {result.InputPosition}. {runner.ExplainResult(result, data)}"); } var iterator = new CaptureIterator <Operator>(data, captures); var output = BuildTree(iterator).ToList(); if (output.Count <= 0) { throw new PegParsingException($"Unable to parse PEG: {output}"); } return(output); }