private void YYNXT_table() { int size = spec.dtrans_list.Count; int lastelem = size - 1; int lastcol = spec.dtrans_ncols - 1; StringBuilder sb = new StringBuilder(Lex.MAXSTR); sb.Append("private static int[,] yy_nxt = new int[,]\n {\n"); for (int elem = 0; elem < size; elem++) { DTrans cdt_list = (DTrans)spec.dtrans_list[elem]; #if DEBUG Utility.assert(spec.dtrans_ncols <= cdt_list.GetDTransLength()); #endif sb.Append(" { "); for (int i = 0; i < spec.dtrans_ncols; i++) { sb.Append(cdt_list.GetDTrans(i)); if (i < lastcol) { sb.Append(","); if (((i + 1) % 8) == 0) { sb.Append("\n "); } else { sb.Append(" "); } } } sb.Append(" }"); if (elem < lastelem) { sb.Append(","); } sb.Append("\n"); } sb.Append(" };\n"); outstream.Write(sb.ToString()); }
/* * Function: make_dtrans * Description: Creates uncompressed CDTrans transition table. */ //private void make_dtrans() private static void make_dtrans(Spec s) { Dfa dfa; int nextstate; Console.WriteLine("Working on DFA states."); /* Reference passing type and initializations. */ s.InitUnmarkedDFA(); Console.WriteLine("done init"); /* Allocate mapping array. */ int nstates = s.state_rules.Length; s.state_dtrans = new int[nstates]; for (int istate = 0; istate < nstates; istate++) { /* Create start state and initialize fields. */ Bunch bunch = new Bunch(s.state_rules[istate]); bunch.e_closure(); add_to_dstates(s, bunch); s.state_dtrans[istate] = s.dtrans_list.Count; /* Main loop of DTrans creation. */ while (null != (dfa = s.GetNextUnmarkedDFA())) { Console.Write("."); #if DEBUG Utility.assert(!dfa.IsMarked()); #endif /* Get first unmarked node, then mark it. */ dfa.SetMarked(); /* Allocate new DTrans, then initialize fields. */ DTrans dt = new DTrans(s, dfa); /* Set dt array for each character transition. */ for (int i = 0; i < s.dtrans_ncols; i++) { /* Create new dfa set by attempting character transition. */ bunch.move(dfa, i); if (!bunch.IsEmpty()) { bunch.e_closure(); } #if DEBUG Utility.assert((null == bunch.GetNFASet() && null == bunch.GetNFABit()) || (null != bunch.GetNFASet() && null != bunch.GetNFABit())); #endif /* Create new state or set state to empty. */ if (bunch.IsEmpty()) { nextstate = DTrans.F; } else { nextstate = in_dstates(s, bunch); if (nextstate == NOT_IN_DSTATES) { nextstate = add_to_dstates(s, bunch); } } #if DEBUG Utility.assert(nextstate < s.dfa_states.Count); #endif dt.SetDTrans(i, nextstate); } #if DEBUG Utility.assert(s.dtrans_list.Count == dfa.GetLabel()); #endif #if DEBUG StringBuilder sb1 = new StringBuilder(Lex.MAXSTR); sb1.Append("Current count = " + s.dtrans_list.Count.ToString() + "\n"); for (int i1 = 0; i1 < dt.GetDTransLength(); i1++) { sb1.Append(dt.GetDTrans(i1).ToString() + ","); } sb1.Append("end\n"); Console.Write(sb1.ToString()); #endif s.dtrans_list.Add(dt); } } Console.WriteLine(""); }