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}"); } }
private Expression BuildTree(CaptureIterator <Expression> iterator) { var result = iterator.Iterate(BuildTreeNode).ToList(); if (result.Count != 1) { throw new PegParsingException($"Parsed {result.Count} regex expressions, expected 1 expression."); } return(result.First()); }
public Node ToNodes() { var iterator = new CaptureIterator <Node>(InputData, Captures); var result = iterator.Iterate(BuildNode).ToList(); if (result.Count == 1) { return(result[0]); } else { return(new ListNode("matches", result)); } }