Esempio n. 1
0
        /// <summary>
        /// Creates the memory index any child.
        /// </summary>
        /// <param name="unknownIndex">Index of the unknown.</param>
        /// <returns>Child node</returns>
        public virtual LocationCollectorNode CreateMemoryIndexAnyChild(MemoryIndex unknownIndex)
        {
            MemoryIndexCollectorNode node = new MemoryIndexCollectorNode(unknownIndex);

            addAnyChild(node);
            return(node);
        }
Esempio n. 2
0
        /// <summary>
        /// Creates the memory index child.
        /// </summary>
        /// <param name="name">The name.</param>
        /// <param name="memoryIndex">Index of the memory.</param>
        /// <returns>Child node</returns>
        public virtual LocationCollectorNode CreateMemoryIndexChild(string name, MemoryIndex memoryIndex)
        {
            MemoryIndexCollectorNode node = new MemoryIndexCollectorNode(memoryIndex);

            addChild(node, name);
            return(node);
        }
Esempio n. 3
0
        /// <summary>
        /// Collects the temporary variables.
        /// </summary>
        /// <param name="treeIndexCollector">The tree index collector.</param>
        /// <param name="temporaryPathSegment">The temporary path segment.</param>
        /// <exception cref="System.NotImplementedException">Temporary memory index is visited more than once</exception>
        public void CollectTemporary(TreeIndexCollector treeIndexCollector, TemporaryPathSegment temporaryPathSegment)
        {
            if (TemporaryNodes.ContainsKey(temporaryPathSegment.TemporaryIndex))
            {
                throw new NotImplementedException("Temporary memory index is visited more than once");
            }

            MemoryIndexCollectorNode node = new MemoryIndexCollectorNode(temporaryPathSegment.TemporaryIndex);

            node.IsMust = true;
            TemporaryNodes.Add(temporaryPathSegment.TemporaryIndex, node);
            treeIndexCollector.AddNode(node);
            HasRootNode = true;
        }
Esempio n. 4
0
            private bool processAlias(MemoryIndex index)
            {
                if (lastCreatedNode == null)
                {
                    if (parentNode != null && lastSegment != null)
                    {
                        if (lastSegment.IsAny)
                        {
                            if (testAndProcessReturnedAnyNode(parentNode, index))
                            {
                                MemoryIndexCollectorNode newNode = new MemoryIndexCollectorNode(index);
                                newNode.IsMust = false;
                                currentNode.addAnyChild(newNode);

                                collector.AddNode(newNode);
                            }
                        }
                        else
                        {
                            if (testAndProcessReturnedNode(lastSegment.Name, parentNode, isMust, index))
                            {
                                MemoryIndexCollectorNode newNode = new MemoryIndexCollectorNode(index);
                                newNode.IsMust = isMust;
                                currentNode.addChild(newNode, lastSegment.Name);

                                collector.AddNode(newNode);
                            }
                        }

                        return(true);
                    }
                    else
                    {
                        return(false);
                    }
                }
                else
                {
                    lastCreatedNode.SetMemoryIndex(index);
                    collector.AddNode(lastCreatedNode);

                    return(true);
                }
            }
Esempio n. 5
0
            private void processIndexSegment(IndexSegment segment)
            {
                lastSegment = segment;
                if (segment.IsAny)
                {
                    if (currentNode.AnyChildNode != null)
                    {
                        parentNode  = currentNode;
                        currentNode = currentNode.AnyChildNode;
                    }
                    else
                    {
                        MemoryIndexCollectorNode newNode = new MemoryIndexCollectorNode(null);
                        newNode.IsMust = false;
                        currentNode.addAnyChild(newNode);

                        parentNode      = currentNode;
                        currentNode     = newNode;
                        lastCreatedNode = newNode;
                    }
                }
                else
                {
                    if (currentNode.NamedChildNodes != null && currentNode.NamedChildNodes.ContainsKey(segment.Name))
                    {
                        parentNode  = currentNode;
                        currentNode = currentNode.NamedChildNodes[segment.Name];
                    }
                    else
                    {
                        MemoryIndexCollectorNode newNode = new MemoryIndexCollectorNode(null);
                        newNode.IsMust = isMust;
                        currentNode.addChild(newNode, segment.Name);

                        parentNode      = currentNode;
                        currentNode     = newNode;
                        lastCreatedNode = newNode;
                    }
                }
            }
Esempio n. 6
0
            public void VisitTemporaryIndex(TemporaryIndex index)
            {
                MemoryIndexCollectorNode node;

                if (!rootNode.TemporaryNodes.TryGetValue(index.RootIndex, out node))
                {
                    MemoryIndexCollectorNode newNode = new MemoryIndexCollectorNode(index.RootIndex);
                    newNode.IsMust = isMust;
                    rootNode.TemporaryNodes.Add(index.RootIndex, newNode);

                    currentNode = newNode;
                }
                else
                {
                    currentNode = node;
                }

                processIndexPath(index);

                if (!processAlias(index))
                {
                    if (isMust)
                    {
                        rootNode.TemporaryNodes.Remove(index.RootIndex);

                        MemoryIndexCollectorNode newNode = new MemoryIndexCollectorNode(index.RootIndex);
                        newNode.IsMust = isMust;
                        rootNode.TemporaryNodes.Add(index.RootIndex, newNode);
                    }
                    else
                    {
                        MemoryIndexCollectorNode childNode = rootNode.TemporaryNodes[index.RootIndex];

                        collector.AddNode(childNode);
                        childNode.TargetIndex = index;
                        childNode.SourceIndex = index;
                        childNode.IsMust      = false;
                    }
                }
            }