public static NFA CreateAutomaton(string a) { var result = new NFA(); var start = 0; var next = 1; result.AddState(start, false); for (int i = 0; i < a.Length; ++i) { if (a[i] == '*') { result.AddTransition(next - 1, next - 1, NFA.Any); } else { result.AddState(next, false); result.AddTransition(next - 1, next, (a[i] != '?' ? CharRange.SingleChar(a[i]) : NFA.Any)); ++next; } } result.AddState(next, true); result.AddTransition(next - 1, next, NFA.Epsilon); return(result); }
public static NFA AnyOf(NFA left, NFA right) { var result = new NFA(); result.AddState(0, false); result.AddTransition(0, result.Add(left), Epsilon); result.AddTransition(0, result.Add(right), Epsilon); return(result); }
private int Add(NFA left) { int stateOffset = NewState(); foreach (var s in left.states) { AddState(s + stateOffset, left.final.Contains(s)); } foreach (var t in left.transitions) { AddTransition(t.Item1 + stateOffset, t.Item2 + stateOffset, t.Item3); } return(stateOffset); }
public static NFA Concat(NFA left, NFA right) { var result = new NFA(); result.Add(left); var leftFinals = result.final.ToArray(); result.final.Clear(); int rightInitial = result.Add(right); foreach (var final in leftFinals) { result.AddTransition(final, rightInitial, Epsilon); } return(result); }
public static NFA CreateAutomaton(string a, int k) { if (a.Contains('*')) { throw new ArgumentException("Star is a reserved character"); } var result = new NFA(); var m = a.Length + 1; /* Create |a|*k states */ for (int i = 0; i < m; ++i) { for (int j = 0; j <= k; ++j) { result.AddState(i + m * j, i == a.Length); } } /* Create transitions */ for (int i = 0; i < m; ++i) { for (int j = 0; j <= k; ++j) { if (i < m - 1) { result.AddTransition(i + m * j, i + 1 + m * j, CharRange.SingleChar(a[i])); } if (j < k) { if (i < m - 1) { result.AddTransition(i + m * j, i + 1 + m * (j + 1), NFA.Any); result.AddTransition(i + m * j, i + 1 + m * (j + 1), NFA.Epsilon); } result.AddTransition(i + m * j, i + m * (j + 1), NFA.Any); } } } return(result); }
public static NFA Star(NFA input) { var result = new NFA(); var newFinal = result.NewState(); result.AddState(newFinal, true); var start = result.Add(input); var finals = result.final.Where(h => h != newFinal).ToArray(); foreach (var final in finals) { result.AddTransition(final, start, Epsilon); } result.AddTransition(newFinal, start, Epsilon); return(result); }