Пример #1
0
        public static State NoCloneOption(State start)
        {
            var end    = new State();
            var oldEnd = start.FindEnd();

            oldEnd.Transition.Add(Epsilon, end);
            start.Transition.Add(Epsilon, end);

            return(start);
        }
Пример #2
0
        /// <summary>
        /// Example: arg, arg, arg
        /// </summary>
        public static State NoCloneRepeatBy(State item, State separator)
        {
            separator.FindEnd().Transition.Add(State.Epsilon, item);

            var itemEnd = item.FindEnd();

            itemEnd.Transition.Add(State.Epsilon, new State());
            itemEnd.Transition.Add(State.Epsilon, separator);

            return(item);
        }
Пример #3
0
        public static State NoCloneStar(State state)
        {
            var oldStart = state;

            var end    = new State();
            var start  = new State(Epsilon, oldStart, end);
            var oldEnd = start.FindEnd();

            oldEnd.Transition.Add(Epsilon, oldStart);
            oldEnd.Transition.Add(Epsilon, end);

            return(start);
        }
Пример #4
0
        public static State MarkRange(State begin1, string name, int lookup, int beginOffset)
        {
            //State begin2;

            if (lookup == 0)
            {
                //begin2 = new State(Epsilon, begin1);
                ////begin2.IsBeginRange = true;
                ////begin2.RangeName = name;
                //begin2.Mark = Marks.BeginRange;
                //begin2.Name = name;
                //begin2.Offset = beginOffset;

                begin1.AddMark(new MarkImpl(Marks.BeginRange, name)
                {
                    Offset = beginOffset,
                });
            }
            else if (lookup == 1)
            {
                //begin2 = begin1;
                //begin2.MarkNext(name, Marks.BeginRange, beginOffset);
                begin1.MarkNext(name, Marks.BeginRange, beginOffset);
            }
            else
            {
                throw new ArgumentOutOfRangeException("lookup", "Must be 0 or 1, other value is not supported.");
            }



            begin1.FindEnd().AddMark(new MarkImpl(Marks.EndRange, name));

            return(begin1);

            //var end2 = new State();
            ////end2.IsEndRange = true;
            ////end2.RangeName = name;
            //end2.Mark = Marks.EndRange;
            //end2.Name = name;

            //var end1 = begin1.FindEnd();
            //end1.Transition.Add(Epsilon, end2);

            //return begin2;
        }
Пример #5
0
        public static State MarkCustom(State begin1, string name, string select, string custom, string type)
        {
            switch (select)
            {
            case "Begin":

                begin1.AddMark(new MarkImpl(Marks.Custom, name)
                {
                    Value = custom, Type = type,
                });

                return(begin1);

            //return new State(Epsilon, begin1)
            //{
            //    Mark = Marks.Custom,
            //    Name = name,
            //    Value = custom,
            //    Type = type,
            //};

            case "End":

                begin1.FindEnd().AddMark(new MarkImpl(Marks.Custom, name)
                {
                    Value = custom, Type = type,
                });

                //var end2 = new State()
                //{
                //    Mark = Marks.Custom,
                //    Name = name,
                //    Value = custom,
                //    Type = type,
                //};

                //begin1.FindEnd().Transition.Add(Epsilon, end2);

                return(begin1);
            }

            throw new Exception("Not implemented");
        }
Пример #6
0
        public static State MarkEndRange(State begin1, Marks mark, string name, bool atBegin, int offset)
        {
            if (atBegin)
            {
                begin1.AddMark(new MarkImpl()
                {
                    Mark   = mark,
                    Name   = name,
                    Offset = offset,
                });

                return(begin1);

                //return new State(Epsilon, begin1)
                //{
                //    Mark = mark,
                //    Name = name,
                //    Offset = offset,
                //};
            }
            else
            {
                begin1.FindEnd().AddMark(new MarkImpl(mark, name)
                {
                    Offset = offset,
                });

                //var end2 = new State()
                //{
                //    Mark = mark,
                //    Name = name,
                //    Offset = offset,
                //};

                //begin1.FindEnd().Transition.Add(Epsilon, end2);

                return(begin1);
            }
        }
Пример #7
0
		public static State NoCloneStar(State state)
		{
			var oldStart = state;

			var end = new State();
			var start = new State(Epsilon, oldStart, end);
			var oldEnd = start.FindEnd();

			oldEnd.Transition.Add(Epsilon, oldStart);
			oldEnd.Transition.Add(Epsilon, end);

			return start;
		}
Пример #8
0
		public static State NoCloneOption(State start)
		{
			var end = new State();
			var oldEnd = start.FindEnd();

			oldEnd.Transition.Add(Epsilon, end);
			start.Transition.Add(Epsilon, end);

			return start;
		}
Пример #9
0
		/// <summary>
		/// Example: arg, arg, arg
		/// </summary>
		public static State NoCloneRepeatBy(State item, State separator)
		{
			separator.FindEnd().Transition.Add(State.Epsilon, item);

			var itemEnd = item.FindEnd();
			itemEnd.Transition.Add(State.Epsilon, new State());
			itemEnd.Transition.Add(State.Epsilon, separator);

			return item;
		}
Пример #10
0
		public static State Substract(State nfa1, State nfa2)
		{
			nfa1.FindEnd().AddMark(Marks.Service1);
			nfa2.FindEnd().AddMark(Marks.Service2);

			int count;
			var dfa1 = nfa1.ToDfa3(out count, false);
			var dfa2 = nfa2.ToDfa3(out count, false);

			dfa1.Minimize(false);
			dfa2.Minimize(false);

			var error = new DfaState(new[] { new State().Id, });
			for (int i = 0; i <= 255; i++)
				error.AddTransition((byte)i, error);
			dfa2.ForEachNR((state) =>
			{
				if (state != error)
				{
					for (int i = 0; i <= 255; i++)
					{
						byte key = (byte)i;
						if (state.Transition[i] == null)
							state.AddTransition(key, error);
					}
				}
			});



			var nfa3 = DfaIntersect.Intersect(dfa1, dfa2).ToNfa2();


			var ends = new List<State>();
			nfa3.ForEach((state) =>
				{
					bool s1 = false, s2 = false;

					state.RemoveAllMarks((mark) =>
					{
						if (mark.Mark == Marks.Service1)
							s1 = true;

						if (mark.Mark == Marks.Service2)
							s2 = true;

						return mark.Mark == Marks.Service1 || mark.Mark == Marks.Service2;
					});

					if (s1 == true && s2 == false)
						ends.Add(state);
				});


			var end = new State();
			foreach (var item in ends)
				item.Transition.Add(Epsilon, end);


			return nfa3;
		}
Пример #11
0
		public static State MarkEndRange(State begin1, Marks mark, string name, bool atBegin, int offset)
		{
			if (atBegin)
			{
				begin1.AddMark(new MarkImpl()
					{
						Mark = mark,
						Name = name,
						Offset = offset,
					});

				return begin1;

				//return new State(Epsilon, begin1)
				//{
				//    Mark = mark,
				//    Name = name,
				//    Offset = offset,
				//};
			}
			else
			{
				begin1.FindEnd().AddMark(new MarkImpl(mark, name) { Offset = offset, });

				//var end2 = new State()
				//{
				//    Mark = mark,
				//    Name = name,
				//    Offset = offset,
				//};

				//begin1.FindEnd().Transition.Add(Epsilon, end2);

				return begin1;
			}
		}
Пример #12
0
		public static State MarkRange(State begin1, string name, int lookup, int beginOffset)
		{
			//State begin2;

			if (lookup == 0)
			{
				//begin2 = new State(Epsilon, begin1);
				////begin2.IsBeginRange = true;
				////begin2.RangeName = name;
				//begin2.Mark = Marks.BeginRange;
				//begin2.Name = name;
				//begin2.Offset = beginOffset;

				begin1.AddMark(new MarkImpl(Marks.BeginRange, name) { Offset = beginOffset, });
			}
			else if (lookup == 1)
			{
				//begin2 = begin1;
				//begin2.MarkNext(name, Marks.BeginRange, beginOffset);
				begin1.MarkNext(name, Marks.BeginRange, beginOffset);
			}
			else
				throw new ArgumentOutOfRangeException("lookup", "Must be 0 or 1, other value is not supported.");



			begin1.FindEnd().AddMark(new MarkImpl(Marks.EndRange, name));

			return begin1;

			//var end2 = new State();
			////end2.IsEndRange = true;
			////end2.RangeName = name;
			//end2.Mark = Marks.EndRange;
			//end2.Name = name;

			//var end1 = begin1.FindEnd();
			//end1.Transition.Add(Epsilon, end2);

			//return begin2;
		}
Пример #13
0
		public static State MarkCustom(State begin1, string name, string select, string custom, string type)
		{
			switch (select)
			{
				case "Begin":

					begin1.AddMark(new MarkImpl(Marks.Custom, name) { Value = custom, Type = type, });

					return begin1;

				//return new State(Epsilon, begin1)
				//{
				//    Mark = Marks.Custom,
				//    Name = name,
				//    Value = custom,
				//    Type = type,
				//};

				case "End":

					begin1.FindEnd().AddMark(new MarkImpl(Marks.Custom, name) { Value = custom, Type = type, });

					//var end2 = new State()
					//{
					//    Mark = Marks.Custom,
					//    Name = name,
					//    Value = custom,
					//    Type = type,
					//};

					//begin1.FindEnd().Transition.Add(Epsilon, end2);

					return begin1;
			}

			throw new Exception("Not implemented");
		}
Пример #14
0
        public static State Substract(State nfa1, State nfa2)
        {
            nfa1.FindEnd().AddMark(Marks.Service1);
            nfa2.FindEnd().AddMark(Marks.Service2);

            int count;
            var dfa1 = nfa1.ToDfa3(out count, false);
            var dfa2 = nfa2.ToDfa3(out count, false);

            dfa1.Minimize(false);
            dfa2.Minimize(false);

            var error = new DfaState(new[] { new State().Id, });

            for (int i = 0; i <= 255; i++)
            {
                error.AddTransition((byte)i, error);
            }
            dfa2.ForEachNR((state) =>
            {
                if (state != error)
                {
                    for (int i = 0; i <= 255; i++)
                    {
                        byte key = (byte)i;
                        if (state.Transition[i] == null)
                        {
                            state.AddTransition(key, error);
                        }
                    }
                }
            });



            var nfa3 = DfaIntersect.Intersect(dfa1, dfa2).ToNfa2();


            var ends = new List <State>();

            nfa3.ForEach((state) =>
            {
                bool s1 = false, s2 = false;

                state.RemoveAllMarks((mark) =>
                {
                    if (mark.Mark == Marks.Service1)
                    {
                        s1 = true;
                    }

                    if (mark.Mark == Marks.Service2)
                    {
                        s2 = true;
                    }

                    return(mark.Mark == Marks.Service1 || mark.Mark == Marks.Service2);
                });

                if (s1 == true && s2 == false)
                {
                    ends.Add(state);
                }
            });


            var end = new State();

            foreach (var item in ends)
            {
                item.Transition.Add(Epsilon, end);
            }


            return(nfa3);
        }