public DeterministicState(DottedRuleSet dottedRuleSet, int origin) { DottedRuleSet = dottedRuleSet; Origin = origin; _hashCode = ComputeHashCode(DottedRuleSet, Origin); }
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)); }
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); }
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)); }
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)); } } }
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)); }
public CachedDottedRuleSetTransition(ISymbol symbol, DottedRuleSet dottedRuleSet, int origin) { Symbol = symbol; DottedRuleSet = dottedRuleSet; Origin = origin; }
private static DottedRuleSet Goto(DottedRuleSet fromAH, IToken token) { return(fromAH.TokenTransitions.GetOrReturnNull(token.TokenType)); }
private static DottedRuleSet Goto(DottedRuleSet fromAH, ISymbol symbol) { return(fromAH.Reductions.GetOrReturnNull(symbol)); }
private static DottedRuleSet Goto(DottedRuleSet fromAH) { return(fromAH.NullTransition); }
private static int ComputeHashCode(DottedRuleSet dottedRuleSet, int origin) { return(HashCode.Compute(dottedRuleSet.GetHashCode(), origin.GetHashCode())); }
private static int ComputeHashCode(DottedRuleSet dottedRuleSet) { return(dottedRuleSet.GetHashCode()); }