public void dump() { #if DUMMY Console.WriteLine("[Dfa begin dump]"); Console.WriteLine("group=" + Int32.ToString(group)); Console.WriteLine("mark=" + Boolean.ToString(mark)); if (accept == null) { Console.WriteLine("accept=null"); } else { accept.dump(); } Console.WriteLine("anchor=" + Int32.ToString(anchor)); if (nfa_set == null) { Console.WriteLine("nfa_set=null"); } else { int n1 = nfa_set.Count; for (int i = 0; i < n1; i++) { Object o2 = nfa_set[i]; Console.Write("i=" + Int32.ToString(i) + " elem="); if (o2 == null) { Console.WriteLine("null"); } else { Nfa elem = (CNfa)o2; elem.dump(); } } } if (nfa_bit == null) { Console.WriteLine("nfa_bit=null"); } else { Console.Write("nfa_bit(" + Int32.ToString(nfa_bit.GetLength()) + ")="); for (int i = 0; i < nfa_bit.GetLength(); i++) { if (nfa_bit.Get(i)) { Console.Write("1"); } else { Console.Write("0"); } } Console.WriteLine(""); } Console.WriteLine("[Dfa end dump]"); #endif }
/* * Compute minimum set of character classes needed to disambiguate * edges. We optimistically assume that every character belongs to * a single character class, and then incrementally split classes * as we see edges that require discrimination between characters in * the class. */ static private void computeClasses(Spec spec) { original_charset_size = spec.dtrans_ncols; ccls = new int[original_charset_size]; // initially all zero. int nextcls = 1; BitSet clsA = new BitSet(); BitSet clsB = new BitSet(); Dictionary <int, int> h = new Dictionary <int, int>(); Console.WriteLine("Working on character classes."); for (int index = 0; index < spec.nfa_states.Count; index++) { Nfa nfa = (Nfa)spec.nfa_states[index]; if (nfa.GetEdge() == Nfa.EMPTY || nfa.GetEdge() == Nfa.EPSILON) { continue; // no discriminatory information. } clsA.ClearAll(); clsB.ClearAll(); for (int i = 0; i < ccls.Length; i++) { if (nfa.GetEdge() == i || // edge labeled with a character nfa.GetEdge() == Nfa.CCL && nfa.GetCharSet().contains(i)) // set of characters { clsA.Set(ccls[i], true); } else { clsB.Set(ccls[i], true); } } /* * now figure out which character classes we need to split. */ clsA.And(clsB); // split the classes which show up on both sides of edge if (clsA.GetLength() == 0) { Console.Write("."); continue; } Console.Write(":"); /* * and split them. */ h.Clear(); // h will map old to new class name for (int i = 0; i < ccls.Length; i++) { if (clsA.Get(ccls[i])) // a split class { if (nfa.GetEdge() == i || nfa.GetEdge() == Nfa.CCL && nfa.GetCharSet().contains(i)) { // on A side int split = ccls[i]; if (!h.ContainsKey(split)) { h.Add(split, nextcls++); // make new class #if DEBUG Console.WriteLine("Adding char " + (nextcls - 1) + " split=" + split + " i=" + i); #endif } ccls[i] = (int)h[split]; } } } } Console.WriteLine(); Console.WriteLine("NFA has " + nextcls + " distinct character classes."); mapped_charset_size = nextcls; }
public void dump() { Console.WriteLine("[Nfa begin dump]"); Console.WriteLine("label=" + label); Console.WriteLine("edge=" + edge); Console.Write("set="); if (cset == null) { Console.WriteLine("null"); } else { Console.WriteLine(cset); } Console.Write("next="); if (next == null) { Console.WriteLine("null"); } else { Console.WriteLine(next); } Console.Write("next2="); if (next2 == null) { Console.WriteLine("null"); } else { Console.WriteLine(next2); } Console.Write("accept="); if (accept == null) { Console.WriteLine("null"); } else { accept.dump(); } Console.WriteLine("anchor=" + anchor); Console.Write("states="); if (states == null) { Console.WriteLine("null"); } else { for (int i = 0; i < states.GetLength(); i++) { if (states.Get(i)) { Console.Write("1"); } else { Console.Write("0"); } } Console.WriteLine(""); } Console.WriteLine("[Nfa end dump]"); }