Ejemplo n.º 1
0
 public KthSet(KthSet prev)
 {
     Prev            = prev;
     LA              = prev.LA + 1;
     Alt             = prev.Alt;
     IsNongreedyExit = prev.IsNongreedyExit;
     Set             = prev.Set.Empty;
 }
Ejemplo n.º 2
0
            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);
            }
Ejemplo n.º 3
0
            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);
            }
Ejemplo n.º 4
0
			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;
			}
Ejemplo n.º 5
0
			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;
			}
Ejemplo n.º 6
0
			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);
			}