static Symbol curSy; // current symbol in computation of sets //--------------------------------------------------------------------- // Symbol set computations //--------------------------------------------------------------------- /* Computes the first set for the given Node. */ static BitArray First0(Node p, BitArray mark) { BitArray fs = new BitArray(Symbol.terminals.Count); while (p != null && !mark[p.n]) { mark[p.n] = true; switch (p.typ) { case Node.nt: { if (p.sym.firstReady) fs.Or(p.sym.first); else fs.Or(First0(p.sym.graph, mark)); break; } case Node.t: case Node.wt: { fs[p.sym.n] = true; break; } case Node.any: { fs.Or(p.set); break; } case Node.alt: { fs.Or(First0(p.sub, mark)); fs.Or(First0(p.down, mark)); break; } case Node.iter: case Node.opt: { fs.Or(First0(p.sub, mark)); break; } } if (!Node.DelNode(p)) break; p = p.next; } return fs; }
static void GetSingles(Node p, ArrayList singles) { if (p == null) return; // end of graph if (p.typ == Node.nt) { if (p.up || Node.DelGraph(p.next)) singles.Add(p.sym); } else if (p.typ == Node.alt || p.typ == Node.iter || p.typ == Node.opt) { if (p.up || Node.DelGraph(p.next)) { GetSingles(p.sub, singles); if (p.typ == Node.alt) GetSingles(p.down, singles); } } if (!p.up && Node.DelNode(p)) GetSingles(p.next, singles); }
static Node LeadingAny(Node p) { if (p == null) return null; Node a = null; if (p.typ == Node.any) a = p; else if (p.typ == Node.alt) { a = LeadingAny(p.sub); if (a == null) a = LeadingAny(p.down); } else if (p.typ == Node.opt || p.typ == Node.iter) a = LeadingAny(p.sub); else if (Node.DelNode(p) && !p.up) a = LeadingAny(p.next); return a; }