Example #1
0
        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
        }
Example #2
0
        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;
            }
        }
Example #3
0
 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));
 }
Example #4
0
        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();
        }
Example #5
0
        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);
        }
Example #6
0
        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);
        }