Ejemplo n.º 1
0
        /// <summary>
        /// Creates node in context of given grammar, from completeEdge
        /// </summary>
        /// <param name="grammar">Grammar which rules created current node</param>
        /// <param name="completeEdge">Edge that will be represented by created node</param>
        internal Node(GrammarBase grammar, CompleteEdge completeEdge)
        {
            Edge    = completeEdge;
            Grammar = grammar;

            if (TerminalEdge == null)
            {
                Name = completeEdge.CompleteLabel.Parent.Name;
            }
            else
            {
                Name = TerminalEdge.Parent.Name;
            }

            addChild(completeEdge.ExtendingEdge);

            var current = completeEdge.ExtendedEdge;

            while (current != null)
            {
                addChild(current.ExtendingEdge);
                current = current.ExtendedEdge;
            }
            ChildNodes.Reverse();

            skipTransientChildren();
            removePunctuation();
        }
Ejemplo n.º 2
0
        internal ActiveEdge(ActiveEdge extendedEdge, CompleteEdge extendingEdge)
            : base(extendedEdge.StartContext, extendingEdge.EndContext)
        {
            ExtendingEdge = extendingEdge;

            ExtendedEdge = extendedEdge;
            Label        = ExtendedEdge.Label.NextInChain;
        }
Ejemplo n.º 3
0
 internal CompleteEdge(ActiveEdge extendedEdge, CompleteEdge extendingEdge)
     : base(extendedEdge.StartContext, extendingEdge.EndContext)
 {
     CompleteLabel = extendedEdge.Label.CompleteLabel;
     Parent        = CompleteLabel.Parent;
     ExtendedEdge  = extendedEdge;
     ExtendingEdge = extendingEdge;
 }
Ejemplo n.º 4
0
        internal bool Connect(CompleteEdge edge)
        {
            if (!_completeEdges.Add(edge))
            {
                return(false);
            }

            return(true);
        }
Ejemplo n.º 5
0
        private Node buildOutput(CompleteEdge result)
        {
            if (result == null)
            {
                return(null);
            }
            var root = new Node(_grammar, result);

            return(root);
        }
Ejemplo n.º 6
0
        internal IEnumerable <ActiveEdge> ExtensibleWith(CompleteEdge edge)
        {
            HashSet <ActiveEdge> extensible;
            var term = edge.Parent;

            if (_extensibleEdges.TryGetValue(term, out extensible))
            {
                return(extensible);
            }
            return(new ActiveEdge[0]);
        }
Ejemplo n.º 7
0
        /// <summary>
        /// Add child node representing given edge
        /// </summary>
        /// <param name="edge">Edge that will be represented by added child</param>
        private void addChild(CompleteEdge edge)
        {
            if (edge == null)
            {
                return;
            }

            var child = new Node(Grammar, edge);

            ChildNodes.Add(child);
        }
Ejemplo n.º 8
0
        private static void predict(CompleteEdge constituent, ActiveEdge edge)
        {
            //TODO check if new possible interpretation of input is added
            var newEdge    = edge.ExtendBy(constituent);
            var endContext = newEdge.EndContext;

            if (endContext.Connect(newEdge))
            {
                foreach (var transition in newEdge.Label.Transitions)
                {
                    var transitionEdge = new ActiveEdge(transition, newEdge);
                    endContext.Connect(transitionEdge);
                }
            }
        }
Ejemplo n.º 9
0
        private void print(CompleteEdge edge)
        {
            if (edge == null)
            {
                return;
            }
            Console.ForegroundColor = ConsoleColor.Green;
            Console.WriteLine(edge);
            print(edge.ExtendingEdge);
            var current = edge.ExtendedEdge;

            while (current != null)
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine(current);
                print(edge.ExtendingEdge);
                current = current.ExtendedEdge;
            }
        }
Ejemplo n.º 10
0
        private void complete(CompleteEdge constituent, ActiveEdge edge)
        {
            //new constituent will be created
            var newConstituent = edge.CompleteBy(constituent);
            var endContext     = newConstituent.EndContext;

            if (endContext.Connect(newConstituent))
            {
                //constituent doesn't exists in the graph yet
                _agenda.Enqueue(newConstituent);
            }

            if (newConstituent.IsFinal && newConstituent.EndContext.EOF && newConstituent.StartContext.BOF)
            {
                _result = newConstituent;
                //prevent further processing
                _agenda.Clear();
            }
        }
Ejemplo n.º 11
0
        /// <summary>
        /// Run parsing according to parser grammar on given text
        /// TODO: Error reporting
        /// </summary>
        /// <param name="text">Text input for parsing</param>
        /// <returns>Parse source data</returns>
        public SourceData Parse(string text)
        {
            var w = Stopwatch.StartNew();

            //initialize
            _agenda.Clear();
            _interpretations.Clear();
            _nextWordContexts.Clear();
            _result = null;

            var inputTokens = _grammar.OutlineTokens(new[] { Token.Text(text, 0) });
            var tokenStream = new TokenStream(inputTokens);

            var sourceData   = new SourceData(text, tokenStream);
            var startContext = sourceData.StartContext;

            startContext.AddSelfEdgesFrom(_rootTransitions);

            _nextWordContexts.Add(startContext);

            while (_result == null)
            {
                if (!scan())
                {
                    break;
                }

                processAgenda();
            }

            w.Stop();
            Console.WriteLine("{0}ms", w.ElapsedMilliseconds);
            var root = buildOutput(_result);

            sourceData.Root = root;
            return(sourceData);
        }
Ejemplo n.º 12
0
 internal ActiveEdge ExtendBy(CompleteEdge constituent)
 {
     //            return new ActiveEdge(Label.NextInChain, OriginContext, StartContext, constituent.EndContext);
     return(new ActiveEdge(this, constituent));
 }
Ejemplo n.º 13
0
 internal CompleteEdge CompleteBy(CompleteEdge constituent)
 {
     //  return new CompleteEdge(Label.CompleteLabel, OriginContext, constituent.EndContext);
     return(new CompleteEdge(this, constituent));
 }