public BitSet GetAncestors(int rule) { BitSet ancestors = new BitSet(); ancestors.Or(parents[rule]); while (true) { int cardinality = ancestors.Cardinality(); for (int i = ancestors.NextSetBit(0); i >= 0; i = ancestors.NextSetBit(i + 1)) { ancestors.Or(parents[i]); } if (ancestors.Cardinality() == cardinality) { // nothing changed break; } } return ancestors; }
public BitSet GetDescendants(int rule) { BitSet descendants = new BitSet(); descendants.Or(children[rule]); while (true) { int cardinality = descendants.Cardinality(); for (int i = descendants.NextSetBit(0); i >= 0; i = descendants.NextSetBit(i + 1)) { descendants.Or(children[i]); } if (descendants.Cardinality() == cardinality) { // nothing changed break; } } return descendants; }
protected internal override void ReportAttemptingFullContext(DFA dfa, BitSet conflictingAlts, SimulatorState conflictState, int startIndex, int stopIndex) { if (conflictingAlts != null) { conflictingAltResolvedBySLL = conflictingAlts.NextSetBit(0); } else { conflictingAltResolvedBySLL = conflictState.s0.configs.RepresentedAlternatives.NextSetBit(0); } decisions[currentDecision].LL_Fallback++; base.ReportAttemptingFullContext(dfa, conflictingAlts, conflictState, startIndex, stopIndex); }
protected internal override void ReportAmbiguity(DFA dfa, DFAState D, int startIndex, int stopIndex, bool exact, BitSet ambigAlts, ATNConfigSet configs) { int prediction; if (ambigAlts != null) { prediction = ambigAlts.NextSetBit(0); } else { prediction = configs.RepresentedAlternatives.NextSetBit(0); } if (conflictingAltResolvedBySLL != ATN.InvalidAltNumber && prediction != conflictingAltResolvedBySLL) { // Even though this is an ambiguity we are reporting, we can // still detect some context sensitivities. Both SLL and LL // are showing a conflict, hence an ambiguity, but if they resolve // to different minimum alternatives we have also identified a // context sensitivity. decisions[currentDecision].contextSensitivities.Add(new ContextSensitivityInfo(currentDecision, currentState, _input, startIndex, stopIndex)); } decisions[currentDecision].ambiguities.Add(new AmbiguityInfo(currentDecision, currentState, ambigAlts, _input, startIndex, stopIndex)); base.ReportAmbiguity(dfa, D, startIndex, stopIndex, exact, ambigAlts, configs); }
protected override void ReportAttemptingFullContext(DFA dfa, BitSet conflictingAlts, ATNConfigSet configs, int startIndex, int stopIndex) { if (conflictingAlts != null) { conflictingAltResolvedBySLL = conflictingAlts.NextSetBit(0); } else { conflictingAltResolvedBySLL = configs.GetAlts().NextSetBit(0); } decisions[currentDecision].LL_Fallback++; base.ReportAttemptingFullContext(dfa, conflictingAlts, configs, startIndex, stopIndex); }