Exemple #1
0
        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}");
            }
        }
Exemple #2
0
        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());
        }
Exemple #3
0
        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));
            }
        }