private static void Main(string[] args) { Console.WriteLine("Hello World!"); #if TEST_MODE Exp1Test.TestMain(); #endif #if NORMAL_MODE while (true) { Console.Write("请选择实验编号(1-{0}):", ExpCount); var expId = Console.ReadLine(); Console.WriteLine("输入 exit 退出"); switch (expId) { case "1": Exp1.Run(); break; case "2": Exp2.Run(); break; case "exit": Console.WriteLine("学业繁忙,告辞~"); return; default: Console.WriteLine("输入错误,没有这个实验!"); break; } } #endif }
internal virtual void GetIdentifiers(ISet <string> set) { switch (kind) { case Kind.REGEXP_UNION: case Kind.REGEXP_CONCATENATION: case Kind.REGEXP_INTERSECTION: Exp1.GetIdentifiers(set); Exp2.GetIdentifiers(set); break; case Kind.REGEXP_OPTIONAL: case Kind.REGEXP_REPEAT: case Kind.REGEXP_REPEAT_MIN: case Kind.REGEXP_REPEAT_MINMAX: case Kind.REGEXP_COMPLEMENT: Exp1.GetIdentifiers(set); break; case Kind.REGEXP_AUTOMATON: set.Add(s); break; default: break; } }
public override string ToString(string indent, bool last) { return(indent + NodePrefix(last) + Type + "\r\n" + Exp1.ToString(indent + ChildrenPrefix(last), false) + Exp2.ToString(indent + ChildrenPrefix(last), false) + Exp3.ToString(indent + ChildrenPrefix(last), false) + Stat.ToString(indent + ChildrenPrefix(last), true)); }
static void Main(string[] args) { General g = new General(); Exp e = new Exp(); // Can use all General, override and Exp specific methods General e2 = new Exp2(); // Can use override methods and General Methods but can't use Exp2 specific methods g.a(); g.b(); e.a(); e.b(); e.d(); // Exp specific method e2.a(); // When has no override execute the General Method e2.b(); // Another override with different function g.Unique(); // Can execute General Specific methods e.Unique(); e2.Unique(); }
internal virtual StringBuilder ToStringBuilder(StringBuilder b) { switch (kind) { case Kind.REGEXP_UNION: b.Append("("); Exp1.ToStringBuilder(b); b.Append("|"); Exp2.ToStringBuilder(b); b.Append(")"); break; case Kind.REGEXP_CONCATENATION: Exp1.ToStringBuilder(b); Exp2.ToStringBuilder(b); break; case Kind.REGEXP_INTERSECTION: b.Append("("); Exp1.ToStringBuilder(b); b.Append("&"); Exp2.ToStringBuilder(b); b.Append(")"); break; case Kind.REGEXP_OPTIONAL: b.Append("("); Exp1.ToStringBuilder(b); b.Append(")?"); break; case Kind.REGEXP_REPEAT: b.Append("("); Exp1.ToStringBuilder(b); b.Append(")*"); break; case Kind.REGEXP_REPEAT_MIN: b.Append("("); Exp1.ToStringBuilder(b); b.Append("){").Append(Min).Append(",}"); break; case Kind.REGEXP_REPEAT_MINMAX: b.Append("("); Exp1.ToStringBuilder(b); b.Append("){").Append(Min).Append(",").Append(Max).Append("}"); break; case Kind.REGEXP_COMPLEMENT: b.Append("~("); Exp1.ToStringBuilder(b); b.Append(")"); break; case Kind.REGEXP_CHAR: b.Append("\\").Append(Character.ToChars(c)); break; case Kind.REGEXP_CHAR_RANGE: b.Append("[\\").Append(Character.ToChars(From)).Append("-\\").Append(Character.ToChars(To)).Append("]"); break; case Kind.REGEXP_ANYCHAR: b.Append("."); break; case Kind.REGEXP_EMPTY: b.Append("#"); break; case Kind.REGEXP_STRING: b.Append("\"").Append(s).Append("\""); break; case Kind.REGEXP_ANYSTRING: b.Append("@"); break; case Kind.REGEXP_AUTOMATON: b.Append("<").Append(s).Append(">"); break; case Kind.REGEXP_INTERVAL: string s1 = Convert.ToString(Min); string s2 = Convert.ToString(Max); b.Append("<"); if (Digits > 0) { for (int i = s1.Length; i < Digits; i++) { b.Append('0'); } } b.Append(s1).Append("-"); if (Digits > 0) { for (int i = s2.Length; i < Digits; i++) { b.Append('0'); } } b.Append(s2).Append(">"); break; } return(b); }
private Automaton ToAutomaton(IDictionary <string, Automaton> automata, AutomatonProvider automaton_provider) { IList <Automaton> list; Automaton a = null; switch (kind) { case Kind.REGEXP_UNION: list = new List <Automaton>(); FindLeaves(Exp1, Kind.REGEXP_UNION, list, automata, automaton_provider); FindLeaves(Exp2, Kind.REGEXP_UNION, list, automata, automaton_provider); a = BasicOperations.Union(list); MinimizationOperations.Minimize(a); break; case Kind.REGEXP_CONCATENATION: list = new List <Automaton>(); FindLeaves(Exp1, Kind.REGEXP_CONCATENATION, list, automata, automaton_provider); FindLeaves(Exp2, Kind.REGEXP_CONCATENATION, list, automata, automaton_provider); a = BasicOperations.Concatenate(list); MinimizationOperations.Minimize(a); break; case Kind.REGEXP_INTERSECTION: a = Exp1.ToAutomaton(automata, automaton_provider).Intersection(Exp2.ToAutomaton(automata, automaton_provider)); MinimizationOperations.Minimize(a); break; case Kind.REGEXP_OPTIONAL: a = Exp1.ToAutomaton(automata, automaton_provider).Optional(); MinimizationOperations.Minimize(a); break; case Kind.REGEXP_REPEAT: a = Exp1.ToAutomaton(automata, automaton_provider).Repeat(); MinimizationOperations.Minimize(a); break; case Kind.REGEXP_REPEAT_MIN: a = Exp1.ToAutomaton(automata, automaton_provider).Repeat(Min); MinimizationOperations.Minimize(a); break; case Kind.REGEXP_REPEAT_MINMAX: a = Exp1.ToAutomaton(automata, automaton_provider).Repeat(Min, Max); MinimizationOperations.Minimize(a); break; case Kind.REGEXP_COMPLEMENT: a = Exp1.ToAutomaton(automata, automaton_provider).Complement(); MinimizationOperations.Minimize(a); break; case Kind.REGEXP_CHAR: a = BasicAutomata.MakeChar(c); break; case Kind.REGEXP_CHAR_RANGE: a = BasicAutomata.MakeCharRange(From, To); break; case Kind.REGEXP_ANYCHAR: a = BasicAutomata.MakeAnyChar(); break; case Kind.REGEXP_EMPTY: a = BasicAutomata.MakeEmpty(); break; case Kind.REGEXP_STRING: a = BasicAutomata.MakeString(s); break; case Kind.REGEXP_ANYSTRING: a = BasicAutomata.MakeAnyString(); break; case Kind.REGEXP_AUTOMATON: Automaton aa = null; if (automata != null) { aa = automata[s]; } if (aa == null && automaton_provider != null) { try { aa = automaton_provider.GetAutomaton(s); } catch (System.IO.IOException e) { throw new System.ArgumentException(e.Message, e); } } if (aa == null) { throw new System.ArgumentException("'" + s + "' not found"); } a = (Automaton)aa.Clone(); // always clone here (ignore allow_mutate) break; case Kind.REGEXP_INTERVAL: a = BasicAutomata.MakeInterval(Min, Max, Digits); break; } return(a); }