public KthSet(KthSet prev) { Prev = prev; LA = prev.LA + 1; Alt = prev.Alt; IsNongreedyExit = prev.IsNongreedyExit; Set = prev.Set.Empty; }
private KthSet NarrowDownToSet(KthSet kthSet, IPGTerminalSet set) { kthSet = kthSet.Clone(false); var cases = kthSet.Cases; for (int i = cases.Count - 1; i >= 0; i--) { cases[i].Set = cases[i].Set.Intersection(set); if (cases[i].Set.IsEmptySet) { cases.RemoveAt(i); } } kthSet.UpdateSet(false); return(kthSet); }
public KthSet Clone(bool updateSet) { KthSet copy = new KthSet(Prev) { LA = LA, Set = Set, Alt = Alt }; for (int i = 0; i < Cases.Count; i++) { copy.Cases.Add(Cases[i].Clone()); } if (updateSet) { copy.UpdateSet(Set.ContainsEOF); } return(copy); }
private IPGTerminalSet ComputeSetForNextBranch(KthSet[] kthSets, List<KthSet> thisBranch, IPGTerminalSet covered) { int i; IPGTerminalSet set = null; for (i = 0; ; i++) { if (i == kthSets.Length) return null; // done! set = kthSets[i].Set.Subtract(covered); if (!set.IsEmptySet) { if (_currentRule.FullLLk ?? LLPG.FullLLk) set = NarrowDownToOneCase(set, kthSets[i].Cases); break; } } thisBranch.Add(kthSets[i]); for (i++; i < kthSets.Length; i++) { var next = set.Intersection(kthSets[i].Set); if (!next.IsEmptySet) { set = next; if (_currentRule.FullLLk ?? LLPG.FullLLk) set = NarrowDownToOneCase(set, kthSets[i].Cases); thisBranch.Add(kthSets[i]); } } return set; }
private KthSet NarrowDownToSet(KthSet kthSet, IPGTerminalSet set) { kthSet = kthSet.Clone(false); var cases = kthSet.Cases; for (int i = cases.Count-1; i >= 0; i--) { cases[i].Set = cases[i].Set.Intersection(set); if (cases[i].Set.IsEmptySet) cases.RemoveAt(i); } kthSet.UpdateSet(kthSet.Set.ContainsEOF); Debug.Assert(cases.Count > 0 || set.ContainsEOF); return kthSet; }
protected PredictionTree ComputePredictionTree(KthSet[] kthSets) { var children = InternalList<PredictionBranch>.Empty; var thisBranch = new List<KthSet>(); int lookahead = kthSets[0].LA; Debug.Assert(kthSets.All(p => p.LA == lookahead)); IPGTerminalSet covered = CGH.EmptySet; for (;;) { thisBranch.Clear(); // e.g. given an Alts value of ('0' '0'..'7'+ | '0'..'9'+), // ComputeSetForNextBranch finds the set '0' in the first // iteration (recording both alts in 'thisBranch'), '1'..'9' // on the second iteration, and finally null. IPGTerminalSet set = ComputeSetForNextBranch(kthSets, thisBranch, covered); if (set == null) break; if (thisBranch.Count == 1) { var branch = thisBranch[0]; children.Add(new PredictionBranch(set, branch.Alt, covered)); } else { Debug.Assert(thisBranch.Count > 1); NarrowDownToSet(thisBranch, set); PredictionTreeOrAlt sub; if (thisBranch.Any(ks => ks.HasAnyAndPreds)) sub = ComputeAssertionTree(thisBranch); else sub = ComputeNestedPredictionTree(thisBranch); children.Add(new PredictionBranch(set, sub, covered)); } covered = covered.Union(set); } return new PredictionTree(lookahead, children, covered); }