예제 #1
0
        private void LazyLoadPath(VirtualForestNodePath path)
        {
            var transitionState    = path.TransitionState;
            var completedParseNode = path.ForestNode;

            if (transitionState.NextTransition != null)
            {
                var virtualNode = new VirtualForestNode(Location, transitionState.NextTransition, completedParseNode);

                if (transitionState.Reduction.ParseNode == null)
                {
                    AddUniqueFamily(virtualNode);
                }
                else
                {
                    AddUniqueFamily(transitionState.Reduction.ParseNode, virtualNode);
                }
            }
            else if (transitionState.Reduction.ParseNode != null)
            {
                AddUniqueFamily(transitionState.Reduction.ParseNode, completedParseNode);
            }
            else
            {
                AddUniqueFamily(completedParseNode);
            }
        }
예제 #2
0
 public void AddNewVirtualNode(
     VirtualForestNode virtualNode)
 {
     var hash = ComputeHashCode(
         virtualNode.Symbol,
         virtualNode.Origin,
         virtualNode.Location);
     _virtualNodes.Add(hash, virtualNode);
 }
예제 #3
0
        public bool TryGetExistingVirtualNode(
            int location,
            ITransitionState transitionState,
            out VirtualForestNode node)
        {
            var targetState = transitionState.GetTargetState();
            var hash        = ComputeHashCode(targetState.DottedRule.Production.LeftHandSide, targetState.Origin, location);

            return(_virtualNodes.TryGetValue(hash, out node));
        }
예제 #4
0
        public void AddNewVirtualNode(
            VirtualForestNode virtualNode)
        {
            var hash = ComputeHashCode(
                virtualNode.Symbol,
                virtualNode.Origin,
                virtualNode.Location);

            _virtualNodes.Add(hash, virtualNode);
        }
예제 #5
0
 public bool TryGetExistingVirtualNode(
     int location,
     ITransitionState transitionState,
     out VirtualForestNode node)
 {
     var targetState = transitionState.GetTargetState();
     var hash = ComputeHashCode(targetState.Production.LeftHandSide, targetState.Origin, location);
     return _virtualNodes.TryGetValue(hash, out node);
 }
예제 #6
0
        private VirtualForestNode CreateVirtualParseNode(IState completed, int k, ITransitionState rootTransitionState)
        {
            VirtualForestNode virtualParseNode = null;
            if (!_nodeSet.TryGetExistingVirtualNode(
                k,
                rootTransitionState,
                out virtualParseNode))
            {
                virtualParseNode = new VirtualForestNode(k, rootTransitionState, completed.ParseNode);
                _nodeSet.AddNewVirtualNode(virtualParseNode);
            }
            else
            {
                virtualParseNode.AddUniquePath(
                    new VirtualForestNodePath(rootTransitionState, completed.ParseNode));
            }

            return virtualParseNode;
        }
예제 #7
0
        private void LazyLoadPath(VirtualForestNodePath path)
        {
            var transitionState = path.TransitionState;
            var completedParseNode = path.ForestNode;
            if (transitionState.NextTransition != null)
            {
                var virtualNode = new VirtualForestNode(Location, transitionState.NextTransition, completedParseNode);

                if (transitionState.Reduction.ParseNode == null)
                    AddUniqueFamily(virtualNode);
                else
                    AddUniqueFamily(transitionState.Reduction.ParseNode, virtualNode);
            }
            else if (transitionState.Reduction.ParseNode != null)
            {
                AddUniqueFamily(transitionState.Reduction.ParseNode, completedParseNode);
            }
            else
            {
                AddUniqueFamily(completedParseNode);
            }
        }