コード例 #1
0
        public DeterministicState(DottedRuleSet dottedRuleSet, int origin)
        {
            DottedRuleSet = dottedRuleSet;
            Origin        = origin;

            _hashCode = ComputeHashCode(DottedRuleSet, Origin);
        }
コード例 #2
0
 public override bool Equals(object obj)
 {
     if (obj is null)
     {
         return(false);
     }
     if (!(obj is DeterministicState deterministicState))
     {
         return(false);
     }
     return(deterministicState.Origin == Origin && DottedRuleSet.Equals(deterministicState.DottedRuleSet));
 }
コード例 #3
0
        private void AddEimPair(int iLoc, DottedRuleSet confirmedAH, int origLoc)
        {
            var confirmedEIM = new DeterministicState(confirmedAH, origLoc);
            var predictedAH  = Goto(confirmedAH);

            Chart.Enqueue(iLoc, confirmedEIM);
            if (predictedAH == null)
            {
                return;
            }
            var predictedEIM = new DeterministicState(predictedAH, iLoc);

            Chart.Enqueue(iLoc, predictedEIM);
        }
コード例 #4
0
        public override bool Equals(object obj)
        {
            if (((object)obj) == null)
            {
                return(false);
            }
            var deterministicState = obj as DeterministicState;

            if (((object)deterministicState) == null)
            {
                return(false);
            }
            return(deterministicState.Origin == Origin && DottedRuleSet.Equals(deterministicState.DottedRuleSet));
        }
コード例 #5
0
        private void ReduceDottedRuleSet(int i, int parent, DottedRuleSet dottedRuleSet)
        {
            var parentSet = _chart.Sets[parent];
            var parentSetDeterministicStates     = parentSet.States;
            var parentSetDeterministicStateCount = parentSetDeterministicStates.Count;

            for (var d = 0; d < dottedRuleSet.Data.Count; ++d)
            {
                var preComputedState = dottedRuleSet.Data[d];

                var production = preComputedState.Production;

                if (!preComputedState.IsComplete)
                {
                    continue;
                }

                var leftHandSide = production.LeftHandSide;

                for (var p = 0; p < parentSetDeterministicStateCount; p++)
                {
                    var pState  = parentSetDeterministicStates[p];
                    var pParent = pState.Origin;

                    DottedRuleSet target = null;
                    if (!pState.DottedRuleSet.Reductions.TryGetValue(leftHandSide, out target))
                    {
                        continue;
                    }

                    if (!_chart.Enqueue(i, new DeterministicState(target, pParent)))
                    {
                        continue;
                    }

                    if (target.NullTransition == null)
                    {
                        continue;
                    }

                    _chart.Enqueue(i, new DeterministicState(target.NullTransition, i));
                }
            }
        }
コード例 #6
0
        private void ScanDottedRuleSet(int location, IToken token, int parent, DottedRuleSet dottedRuleSet)
        {
            //PERF: This could perhaps be improved with an int array and direct index lookup based on "token.TokenType.Id"?...
            if (!dottedRuleSet.TokenTransitions.TryGetValue(token.TokenType, out DottedRuleSet target))
            {
                return;
            }

            if (!_chart.Enqueue(location + 1, new DeterministicState(target, parent)))
            {
                return;
            }

            if (target.NullTransition is null)
            {
                return;
            }

            _chart.Enqueue(location + 1, new DeterministicState(target.NullTransition, location + 1));
        }
コード例 #7
0
 public CachedDottedRuleSetTransition(ISymbol symbol, DottedRuleSet dottedRuleSet, int origin)
 {
     Symbol        = symbol;
     DottedRuleSet = dottedRuleSet;
     Origin        = origin;
 }
コード例 #8
0
 private static DottedRuleSet Goto(DottedRuleSet fromAH, IToken token)
 {
     return(fromAH.TokenTransitions.GetOrReturnNull(token.TokenType));
 }
コード例 #9
0
 private static DottedRuleSet Goto(DottedRuleSet fromAH, ISymbol symbol)
 {
     return(fromAH.Reductions.GetOrReturnNull(symbol));
 }
コード例 #10
0
 private static DottedRuleSet Goto(DottedRuleSet fromAH)
 {
     return(fromAH.NullTransition);
 }
コード例 #11
0
 private static int ComputeHashCode(DottedRuleSet dottedRuleSet, int origin)
 {
     return(HashCode.Compute(dottedRuleSet.GetHashCode(), origin.GetHashCode()));
 }
コード例 #12
0
 private static int ComputeHashCode(DottedRuleSet dottedRuleSet)
 {
     return(dottedRuleSet.GetHashCode());
 }