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); }
/// <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); }
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); }
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; }
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"); }
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); } }
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; }
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; }
/// <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; }
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; }
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; } }
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; }
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"); }
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); }